数据逆向分析(3)——识别字符串与数组

来源:互联网 发布:索罗斯 知乎 编辑:程序博客网 时间:2024/05/16 08:49

字符串

    在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};

       因此数组的边界判断,需要后续代码流程的辅助,因为数组通常都是同一类操作的集合。

0 0
原创粉丝点击