-
-
对不同存储区域的数组分析
-
发表于:
2010-10-26 22:51
5695
-
这算是一篇简单的学习笔记吧,主要内容是从《IDA Pro权威指南》里看到的,写这篇的目的是为了记录自己的学习历程,另外感觉好像做一些学习笔记会对知识的理解更加有帮助。虽然学得比较慢,但也要坚持,感觉还不错。
下面对放在三个不同存储区的数组进行简要的分析
(1) 对全局数组进行分析
#include <cstdio>
#include <iostream>
using namespace std;
int global_array[3];
int main()
{
int idx = 2;
global_array[0] = 10;
global_array[1] = 20;
global_array[2] = 30;
global_array[idx] = 40;
return 0;
}
text:00401030 ; =============== S U B R O U T I N E =======================================
.text:00401030
.text:00401030 ; Attributes: bp-based frame
.text:00401030
.text:00401030 _main_0 proc near ; CODE XREF: _mainj
.text:00401030
.text:00401030 var_44= byte ptr -44h
.text:00401030 var_4= dword ptr -4
.text:00401030
.text:00401030 55 push ebp
.text:00401031 8B EC mov ebp, esp
.text:00401033 83 EC 44 sub esp, 44h
.text:00401036 53 push ebx
.text:00401037 56 push esi
.text:00401038 57 push edi
.text:00401039 8D 7D BC lea edi, [ebp+var_44]
.text:0040103C B9 11 00 00 00 mov ecx, 11h
.text:00401041 B8 CC CC CC CC mov eax, 0CCCCCCCCh
.text:00401046 F3 AB rep stosd
.text:00401048 C7 45 FC 02 00 00+[COLOR="Red"]mov [ebp+var_4], 2[/COLOR] //为局部
变量idx赋值为2
.text:0040104F C7 05 0C 2E 43 00+[COLOR="red"]mov dword_432E0C, 0Ah [/COLOR]//从
这里以后的三行可以看出来全局数组的地址在编译时候就能够确定,
此时的基址应该是0x00432E0C。红色标记。
.text:00401059 C7 05 10 2E 43 00+mov dword_432E10, 14h
.text:00401063 C7 05 14 2E 43 00+mov dword_432E14, 1Eh
.text:0040106D 8B 45 FC [COLOR="red"]mov eax, [ebp+var_4][/COLOR] //把idx存储到eax寄存器中,用来进行偏移量计算。
.text:00401070 C7 04 85 0C 2E 43+[COLOR="red"]mov dword_432E0C[eax*4], 28h[/COLOR]基址加上偏移量就可以定位数组的元素的下标。eax * 4,4表示数组元素的大小,这里千万不能够就认为是int型的,具体情况具体分析。
.text:0040107B 33 C0 xor eax, eax
.text:0040107D 5F pop edi
.text:0040107E 5E pop esi
.text:0040107F 5B pop ebx
.text:00401080 8B E5 mov esp, ebp
.text:00401082 5D pop ebp
.text:00401083 C3 retn
.text:00401083 _main_0 endp
.text:00401083
.text:00401083 ; ---------------------------------------------------------------------------
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int stack_array[3];
int idx = 2;
stack_array[0] = 10;
stack_array[1] = 20;
stack_array[2] = 30;
stack_array[idx] = 40;
return 0;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!