能力值:
( LV2,RANK:10 )
|
-
-
2 楼
up
|
能力值:
(RANK:260 )
|
-
-
3 楼
C中的数组长度只在编译时被使用,运行时,长度信息是丢掉的,除非你编写代码去实现它,甚至在编译时,C标准也不要求编译器对数组长度进行非常准确的处理,比如越界检查。在C中,以下代码片段在新的编译器中仅会发出警告,而老的编译器是没有任何提示的:
[
int a[2];
a[10]=0;
]
因此在反汇编的结果中,自动化工具不容易得到数组的长度信息,需要人工分析代码(运行时分配的变量数组,如栈上)或数据(编译时分配的数组,如常量)。
个人观点,请指正。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
谢谢回复。
另外还有一点疑问:
你所说的“需要人工分析代码(运行时分配的变量数组,如栈上)或数据(编译时分配的数组,如常量)。”中, 运行时分配的变量数组(malloc、new)应该在堆(heap)中吧?
对“人工分析代码(运行时分配的变量数组,如栈上)或数据(编译时分配的数组,如常量)”能不能再具体一点,最好能举个简单的例子,谢谢!
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
你自己用OD之类的软件手工打造一小段程序后就会明白的,道理其实很简单只是比较繁琐而已
|
能力值:
( 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',和两个任意字符
这应该很容易看出来吧。
|
能力值:
( 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] ;
|
能力值:
( 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] ;
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
看不懂哦....学习中
|
|
|