數據逆向(三)——識別字符串與數組

字符串

    在C語言中,字符串是由字符組成,單字符不是字符串,至少有兩個字符組成,且結尾字符是'/0'。

    例如:"ABCD" 內存中實際儲存結構是 41H 42H 43H 44H 00H

 

    字符串的尋址,依靠首字節進行寄存器相對尋址方式:

    例如:訪問"ABCD"中的第二字節,byte ptr [ebx+1]

 

    正是因爲字符串的首字節索引的尋址方式,因此字符串往往要與指針配合。在C語言中常見的,

    例如:char *str=“ABCD”;//mov [xxxx],offset string "ABCD"

 

    另一種常見的方式,是將字符串放在數組裏,需要首字節地址時,在數組名前加"&"僞裝成指針。當然,存在數組裏的字符串,自然可以按照數組的訪問方式,比如 直接尋址。

 

數組

    數組其實和普通變量沒什麼區別,每一個成員都是分別通過直接尋址方式訪問。

    但只有一種情況例外,並且十分常見,即當索引號爲變量時,使用相對尋址方式。

    例如:char a[4]={'A','A','A','/0'};

             for(int i=0;i<3;i++)

                  a[i]+=1;

 

    對應反彙編:

             char a[4]={'A','A','A','/0'};
0041139E  mov         byte ptr [a],41h
004113A2  mov         byte ptr [ebp-7],41h
004113A6  mov         byte ptr [ebp-6],41h
004113AA  mov         byte ptr [ebp-5],0

             for(int i=0;i<3;i++)
004113AE  mov         dword ptr [i],0
004113B5  jmp         wmain+40h (4113C0h)
004113B7  mov         eax,dword ptr [i]
004113BA  add         eax,1
004113BD  mov         dword ptr [i],eax
004113C0  cmp         dword ptr [i],3
004113C4  jge         wmain+5Ah (4113DAh)

                  a[i]+=1;
004113C6  mov         eax,dword ptr [i]
004113C9  movsx       ecx,byte ptr a[eax]
004113CE  add         ecx,1
004113D1  mov         edx,dword ptr [i]
004113D4  mov         byte ptr [a+edx],cl ;反彙編器上常寫爲mov byte ptr a[edx],cl
004113D8  jmp         wmain+37h (4113B7h)

 

數組的尷尬

      除了源碼調試,由於數組不標記邊界,提通過數據初始化不能判斷數組的始末位置

      比如:int i=0;
               int a[3]={1,2,3};

      OD反彙編結果:

     00412FFE   MOV DWORD PTR SS:[EBP-8],   0
     00413005   MOV DWORD PTR SS:[EBP-1C], 1
     0041300C   MOV DWORD PTR SS:[EBP-18], 2
     00413013   MOV DWORD PTR SS:[EBP-14], 3

     

       顯然,只看初始化我們很容易錯誤還原爲 int a[4]={0,1,2,3};

       因此數組的邊界判斷,需要後續代碼流程的輔助,因爲數組通常都是同一類操作的集合。

發佈了41 篇原創文章 · 獲贊 4 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章