Reverse Code Engineering

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

Reverse Code Engineering

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

Reverse Code Engineering

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

آخرین نظرات

لیست های پیوندی ساختارهای داده ای هستند که محتوی یک زنجیره ای از رکوردهای داده هستند, و هر رکورد شامل یک فیلد هستش که محتوی یک ارجاع (پیوند) به رکورد بعدی در این زنجیره هستش.

عمده اصلی استفاده از لیست های پیوندی نسبت به آرایه این است که ترتیب آیتم های پیوندی می تواند متفاوت از ترتیبش در آیتم های داده ای نگهداری شده در حافظه یا دیسک باشد.

ازینرو لیست های پیوندی اجازه قرار دادن یا حذف کردن یک گره رو در هر نقطه از لیست را می دهند.

 

به کد زیر توجه کنید:

 

struct node

{

   int x;

   struct node * next;

};

 

typedef struct node pnode;

 

void main()

{

   pnode * curr, * head;

   int i;

 

   head = NULL;

 

   for(i=1;i<=10;i++) (1)

   {

      curr = (pnode *)malloc(sizeof(pnode));

      curr->x = i;

      curr->next  = head;

      head = curr;

   }

 

   curr = head;

 

   while(curr) (2)

   {

      printf("%d\n", curr->x);

      curr = curr->next ;

   }

}


توی این مثال ما یک لیست پیوندی و پیمایش اونرو تعریف کردیم. این لیست پیوندی محتوی سری از ساختارهای گره به نام pnode هستش که با دو حلقه دستکاری میشه.اولین حلقه 10 تا گره ایجاد میکنه (1) و آنهارو با داده پر میکنه, حلقه دوم (2) روی همه ی این رکوردها تکرار میشه و محتویاتشون رو چاپ میکنه.


کد دیس اسمبل شده :

0040106A        mov     [ebp+var_8], 0

00401071        mov     [ebp+var_C], 1

00401078

00401078 loc_401078:

00401078        cmp     [ebp+var_C], 0Ah

0040107C        jg      short loc_4010AB

0040107E        mov     [esp+18h+var_18], 8

00401085        call    malloc

0040108A        mov     [ebp+var_4], eax

0040108D        mov     edx, [ebp+var_4]

00401090        mov     eax, [ebp+var_C]

00401093        mov     [edx], eax (1)

00401095        mov     edx, [ebp+var_4]

00401098        mov     eax, [ebp+var_8]

0040109B        mov     [edx+4], eax (2)

0040109E        mov     eax, [ebp+var_4]

004010A1        mov     [ebp+var_8], eax

004010A4        lea     eax, [ebp+var_C]

004010A7        inc     dword ptr [eax]

004010A9        jmp     short loc_401078

004010AB loc_4010AB:

004010AB        mov     eax, [ebp+var_8]

004010AE        mov     [ebp+var_4], eax

004010B1

004010B1 loc_4010B1:

004010B1        cmp     [ebp+var_4], 0 (3)

004010B5        jz      short locret_4010D7

004010B7        mov     eax, [ebp+var_4]

004010BA        mov     eax, [eax]

004010BC        mov     [esp+18h+var_14], eax

004010C0        mov     [esp+18h+var_18], offset aD ; "%d\n"

004010C7        call    printf

004010CC        mov     eax, [ebp+var_4]

004010CF        mov     eax, [eax+4]

004010D2        mov     [ebp+var_4], eax (4)

004010D5        jmp     short loc_4010B1 (5)



چیزهایی که ما متوجه شدیم شامل:

اول حلقه for را تشخیص دادیم.

Var_C همون متغیر i هستش که شمارنده ی حلقه هست.

Var_8 همون متغیر head هستش و var_4 هم متغیر curr هستش که اشاره گری به یه ساختاره.

حلقه while (از (3)  تا (5) ) هم این لیست پیوندی رو تکرار میکنه و داخلش var_4 به رکورد در این لیست تنظیم میشه (4)

 

برای تشخیص لیست های پیوندی, شما ابتدا میبایست برخی آبجکتهایی که محتوی یک اشاره گر به یه آبجکت دیگه از همون نوع اشاره می کنند تشخیص بدید.

نظرات (۰)

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