数据逆向分析(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};
因此数组的边界判断,需要后续代码流程的辅助,因为数组通常都是同一类操作的集合。
- 数据逆向分析(3)——识别字符串与数组
- 数据逆向(三)——识别字符串与数组
- 数据逆向分析(4)——识别结构体
- 数据逆向(四)——结构体识别
- 数据逆向分析(1)——开篇
- 代码逆向(六)——加法与减法的识别与优化原理
- 代码逆向(七)——乘法的识别与优化原理
- 171209 逆向-JarvisOJ(病毒数据分析)(3)
- 数据逆向分析(2)——区分变量,常量以及指针
- 代码逆向(八)——除法与取模运算的识别与优化原理
- 数据逆向(一)——开篇
- Android软件安全与逆向分析笔记(3)
- 字符数组与字符串分析
- 《Python数据分析与挖掘实战》实战篇第一章拓展思考——偷漏税用户识别
- Android逆向分析学习与研究(1)————工欲善其事必先利其器
- Android逆向分析学习与研究(1)————工欲善其事必先利其器
- 9.1数组与字符串(四)——字符串压缩
- Android软件安全与逆向分析——dalvik虚拟机与Java虚拟机的区别(带实例)
- 数据逆向分析(2)——区分变量,常量以及指针
- 快速排序
- EditText输入字符变化事件
- 树的重建与遍历
- UVa 825 Walking on the Safe Side(DP)
- 数据逆向分析(3)——识别字符串与数组
- 7.16 D kAri427 学姐逗学弟——every-SG
- STL_set——set::erase
- Java IO 转换流
- Linux重定向
- 数据逆向分析(4)——识别结构体
- SVN
- 详解一道C++笔试题,考察重载、覆盖、多态
- Oracle Linux 4.7+Oracle10g RAC+Oracle 10g ASM