首页
社区
课程
招聘
[讨论]如何在 "IDA Pro反汇编出的代码" 中计算缓冲区的长度?
发表于: 2008-7-7 10:22 6523

[讨论]如何在 "IDA Pro反汇编出的代码" 中计算缓冲区的长度?

2008-7-7 10:22
6523
比如:

源代码片段:
void func1()
{
        int nInt1;
        char szLong[10] = "#########";
        int nInt2;
        char szShort[8] = "hello";

        ... ...
}

IDA Pro返汇编的结果为:

sub_401000 proc near

var_1C= dword ptr -1Ch
var_18= dword ptr -18h
Source= byte ptr -14h
var_10= word ptr -10h
var_E= word ptr -0Eh
Dest= byte ptr -0Ch
var_8= dword ptr -8
var_4= word ptr -4
... ....

其中,        变量Dest、var_8、var_4 对应源代码中的 szLong,
        变量Source、var_10、var_E对应源代码中的 szShort,
        变量 var_18、var_1C 对应源代码中的 nInt1、nInt2.

但以上是根据程序对变量所做的操作得出的,可以看到,源代码中的数组类型在反汇编代码中不复存在,
只有 dword、word、byte 这样表示长度的变量,那如何从反汇编代码中得到"源代码中定义的数组"的长度呢?
有没有什么规律 或者 自动的方法 或者 相关的理论?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 208
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
  up
2008-7-7 17:05
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
3
C中的数组长度只在编译时被使用,运行时,长度信息是丢掉的,除非你编写代码去实现它,甚至在编译时,C标准也不要求编译器对数组长度进行非常准确的处理,比如越界检查。在C中,以下代码片段在新的编译器中仅会发出警告,而老的编译器是没有任何提示的:

[
int a[2];
a[10]=0;
]

因此在反汇编的结果中,自动化工具不容易得到数组的长度信息,需要人工分析代码(运行时分配的变量数组,如栈上)或数据(编译时分配的数组,如常量)。

个人观点,请指正。
2008-7-7 18:25
0
雪    币: 208
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢回复。
另外还有一点疑问:
你所说的“需要人工分析代码(运行时分配的变量数组,如栈上)或数据(编译时分配的数组,如常量)。”中, 运行时分配的变量数组(malloc、new)应该在堆(heap)中吧?
对“人工分析代码(运行时分配的变量数组,如栈上)或数据(编译时分配的数组,如常量)”能不能再具体一点,最好能举个简单的例子,谢谢!
2008-7-7 20:55
0
雪    币: 4560
活跃值: (1002)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
你自己用OD之类的软件手工打造一小段程序后就会明白的,道理其实很简单只是比较繁琐而已
2008-7-8 17:24
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
数组是静态赋值哦,代码生成时期完成
  char szLong[10] = "#########";
  char szShort[8] = "hello";

char szLong[10]是9个‘#'和一个'\0'
char szShort[8]是‘h’,‘e’,‘l’,‘l’,‘o’,'\0',和两个任意字符

这应该很容易看出来吧。
2008-7-8 19:13
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
sorry,搞错了,应该是一大堆讲静态数组复制到栈空间的代码,楼主可以试一下
应该是有规律的,比如
mov dword ptr ebp-0Ch, [xxxx]

  int nInt1;
  char szLong[10] = "#########";
  int nInt2;
  char szShort[8] = "hello";

var_1C= dword ptr -1Ch
var_18= dword ptr -18h
Source= byte ptr -14h
var_10= word ptr -10h
var_E= word ptr -0Eh
Dest= byte ptr -0Ch
var_8= dword ptr -8
var_4= word ptr -4

窃以为
var_4=nInt1;
var_8=nInt2;
Dest= szShort[8] ;
Source= szLong[10] ;

编译器优化后生成代码会打乱次序
然后应该会有数组赋值的语句
比如
mov word ptr ebp-0Ch, [xxxx]  ;xxxx是静态数组"########"等的机制
mov word ptr ebp-0Eh, [xxxx]  ;
mov dword ptr ebp-10h, [xxxx]  ;
2008-7-8 19:28
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
应该会有类似的语句
mov word ptr ebp-0Ch, [xxxx]  ;xxxx是静态数组"hello"等的基地址
mov word ptr ebp-0Eh, [xxxx+2]  ;
mov dword ptr ebp-10h, [xxxx+2]  ;

mov dword ptr ebp-14h, [yyyy]  ;yyyy是静态数组"#########"等的基地址
mov dword ptr ebp-18h, [yyyy+4]  ;
mov word ptr ebp-1Ch, [yyyy+4]  ;
2008-7-8 19:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
看不懂哦....学习中
2008-7-9 23:53
0
游客
登录 | 注册 方可回帖
返回
//