首页
社区
课程
招聘
对不同存储区域的数组分析
发表于: 2010-10-26 22:51 5696

对不同存储区域的数组分析

2010-10-26 22:51
5696

这算是一篇简单的学习笔记吧,主要内容是从《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;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 563
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
IDA Pro权威指南 还没到
2010-10-30 15:15
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错
楼主的分析不是一般的详细啦
看看
2010-11-1 10:37
0
游客
登录 | 注册 方可回帖
返回
//