Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

Share what I know............... learn what I don’t

آخرین نظرات

تشخیص ساختارهای برنامه نویسی در اسمبلی - قسمت هشتم

چهارشنبه, ۲۷ خرداد ۱۳۹۴، ۱۰:۴۶ ب.ظ

ساختارها (یا بصورت اختصار struct ها) شبیه آرایه ها هستند با این تفاوت که شامل انواع مختلفی از عناصر هستند. بد افزار نویس ها ازین برای اطلاعات گروهی استفاده می کنند. گاهی وقتا استفاده از ساختار ها بجای یه سری از متغیرهای مختلف مفید واقع میشه و کارو راحت می کنه مخصوصا اگه به گروهی از متغیرها برای یه کار نیاز داشته باشیم.توابع API ویندوز هم اکثر اوقات از ساختارها استفاده می کنند.


struct my_structure { 

     int x[5];

     char y;

     double z;

};

 

struct my_structure *gms; 

 

void test(struct my_structure *q)

{

     int i;

     q->y = 'a';

     q->z = 15.6;

     for(i = 0; i<5; i++){

           q->x[i] = i;

     }

}

 

void main()

{

     gms = (struct my_structure *) malloc(

     sizeof(struct my_structure));

     test(gms);

}

اول ما یه ساختار تعریف کردیم که آرایه ای از اعداد,کاراکتر و دابل هستش.

در تابع main ما فضایی رو به ساختارمون اختصاص دادیم و سپس این ساختار رو به تابع test ارسال کردیم. Struct gms هم یک متغیر عمومی هستش.

ساختارها هم مثل آرایه ها با آدرس مبنایی که بعنوان اشاره گر شروع استفاده شده قابل دسترسی هستند. 

کد دیس اسمبل شده ی تابع main  برنامه رو در زیر مشاهده می کنید:


00401050        push    ebp

00401051        mov     ebp, esp

00401053        push    20h

00401055        call    malloc

0040105A        add     esp, 4

0040105D        mov     dword_40EA30, eax

00401062        mov     eax, dword_40EA30

00401067        push    eax (1)

00401068        call    sub_401000

0040106D        add     esp, 4

00401070        xor     eax, eax

00401072        pop     ebp

00401073        retn


همونطور که میبینید struct gms بصورت متغیر عمومی تعریف شده, و آدرس مبنای اون dword_40EA30 هستش. توی (1) آدرس مبنای این ساختار به تابع  test از طریق push eax ارسال شده.

حال کد دیس اسمبل شده تابع test رو بررسی می کنیم:


00401000        push    ebp

00401001        mov     ebp, esp

00401003        push    ecx

00401004        mov     eax,[ebp+arg_0]

00401007        mov     byte ptr [eax+14h], 61h

0040100B        mov     ecx, [ebp+arg_0]

0040100E        fld     ds:dbl_40B120 (1)

00401014        fstp    qword ptr [ecx+18h]

00401017        mov     [ebp+var_4], 0

0040101E        jmp     short loc_401029

00401020 loc_401020:

00401020        mov     edx,[ebp+var_4]

00401023        add     edx, 1

00401026        mov     [ebp+var_4], edx

00401029 loc_401029:

00401029        cmp     [ebp+var_4], 5

0040102D        jge     short loc_40103D

0040102F        mov     eax,[ebp+var_4]

00401032        mov     ecx,[ebp+arg_0]

00401035        mov     edx,[ebp+var_4]

00401038        mov     [ecx+eax*4],edx (2)

0040103B        jmp     short loc_401020

0040103D loc_40103D:

0040103D        mov     esp, ebp

0040103F        pop     ebp

00401040        retn

arg_0 آدرس مبنای ساختار هستش (که از طریق تابع main دریافت شده).

آفست 0x14 برای نگهداری کاراکتر در این ساختار استفاده میشه, و 0x61 هم که کد اسکی حرف a هستش.

تا اینجا یعنی ما حرف a رو به متغیر y که برای نگهداری کاراکتر توی ساختار تعریف شده انتقال میدیم.

توی قسمت (1) هم مشخص هستش که آفست 0x18 یک double هستش چونکه از دستورات ممیز شناور استفاده کرده, همچنین اینکه اعداد صحیح به آفست های 0, 4, 8, 0xC و 0x10 انتقال یافته اند (با بررسی حلقه for  در (2) ).

خوب با این توضیحات ما تونستیم محتویات این ساختار رو حدس بزنیم:)

 

نظرات (۱)

تشخیص class ها رو هم میتونید بگذارید !؟ من خودم سعی کردم ولی نشد :D
پاسخ:
بله انشالله در اولین فرصت
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی