تشخیص ساختارهای برنامه نویسی در اسمبلی - قسمت هشتم
ساختارها (یا بصورت اختصار 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
همونطور که میبینید struct gms بصورت متغیر عمومی تعریف شده, و آدرس مبنای اون dword_40EA30 هستش. توی (1) آدرس مبنای این ساختار به تابع test از طریق push eax ارسال شده.
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
arg_0 آدرس مبنای ساختار هستش (که از طریق تابع main دریافت شده). آفست 0x14 برای نگهداری کاراکتر در این ساختار استفاده میشه, و 0x61 هم که کد اسکی حرف a هستش. تا اینجا یعنی ما حرف a رو به متغیر y که برای نگهداری کاراکتر توی ساختار تعریف شده انتقال میدیم. توی قسمت (1) هم مشخص هستش که آفست 0x18 یک double هستش چونکه از دستورات ممیز شناور استفاده کرده, همچنین اینکه اعداد صحیح به آفست های 0, 4, 8, 0xC و 0x10 انتقال یافته اند (با بررسی حلقه for در (2) ). خوب با این توضیحات ما تونستیم محتویات این ساختار رو حدس بزنیم:)