刚看了几天的反汇编视频,想好好入门,觉得有点难啊~~~
昨天做一道C题,看到有同学访问了数组的非法元素,觉得应该学习一下内存是如何存储处理的,于是简单的反汇编了一下,真心还没入门呢,看着就像天书···不过存储是看明白了,也就达到我的目的了。现在贴上OD和VC里边的代码,如果有没有注意这个小知识的,就瞥一眼吧。
我小白,所以发的帖子也就没有技术含量,但是我不想浮浮躁躁的学习,所以脚踏实地的发一个新手入门路上的帖子,希望管理员别觉得没有技术含
量就删了啊。我想用帖子激励着我进步。
温馨提示:入门的同学就无视吧,和我一样的小白们,如果有什么异议,大家再回复讨论啊。
//****************************************************************
这是c的源代码,只是测试数组几个非法元素而已,大家可以再考虑,如果有什么新的发现,麻烦共享一下,我们也学习一下,共同进步。
#include <stdio.h>
int main(int argc, char* argv[])
{
int arr[10] = {0};
printf("%d %d %d %d %d %d\n", arr[-2], arr[-1], arr[0], arr[5], arr[-10], arr[-20]);
printf("%d %d %d %d %d %d\n", arr[0], arr[9], arr[10], arr[11], arr[20], arr[100]);
return 0;
}
//****************************************************************
VC++6.0里面Disassembly代码:
1: #include <stdio.h>
2:
3: int main(int argc, char* argv[])
4: {
0040D720 push ebp
0040D721 mov ebp,esp
0040D723 sub esp,68h
0040D726 push ebx
0040D727 push esi
0040D728 push edi
0040D729 lea edi,[ebp-68h]
0040D72C mov ecx,1Ah
0040D731 mov eax,0CCCCCCCCh
0040D736 rep stos dword ptr [edi]
5: int arr[10] = {0};
0040D738 mov dword ptr [ebp-28h],0
0040D73F mov ecx,9
0040D744 xor eax,eax
0040D746 lea edi,[ebp-24h]
0040D749 rep stos dword ptr [edi]
6:
7: printf("%d %d %d %d %d %d\n", arr[-2], arr[-1], arr[0], arr[5], arr[-10], arr[-20]);
0040D74B lea eax,[ebp-28h]
0040D74E mov ecx,dword ptr [eax-50h]
0040D751 push ecx
0040D752 lea edx,[ebp-28h]
0040D755 mov eax,dword ptr [edx-28h]
0040D758 push eax
0040D759 mov ecx,dword ptr [ebp-14h]
0040D75C push ecx
0040D75D mov edx,dword ptr [ebp-28h]
0040D760 push edx
0040D761 lea eax,[ebp-28h]
0040D764 mov ecx,dword ptr [eax-4]
0040D767 push ecx
0040D768 lea edx,[ebp-28h]
0040D76B mov eax,dword ptr [edx-8]
0040D76E push eax
0040D76F push offset string "%d %d %d %d %d %d\n" (00422fac)
0040D774 call printf (00401090)
0040D779 add esp,1Ch
8: printf("%d %d %d %d %d %d\n", arr[0], arr[9], arr[10], arr[11], arr[20], arr[100]);
0040D77C mov ecx,dword ptr [ebp+168h]
0040D782 push ecx
0040D783 mov edx,dword ptr [ebp+28h]
0040D786 push edx
0040D787 mov eax,dword ptr [ebp+4]
0040D78A push eax
0040D78B mov ecx,dword ptr [ebp]
0040D78E push ecx
0040D78F mov edx,dword ptr [ebp-4]
0040D792 push edx
0040D793 mov eax,dword ptr [ebp-28h]
0040D796 push eax
0040D797 push offset string "%d %d %d %d %d %d\n" (00422fac)
0040D79C call printf (00401090)
0040D7A1 add esp,1Ch
9:
10: return 0;
0040D7A4 xor eax,eax
11: }
//****************************************************************
OD里面的代码:
[SIZE="1"][SIZE="1"]0040D720 /> \55 push ebp ; 保存寄存器
0040D721 |. 8BEC mov ebp,esp ; ebp = esp 后边使用ebp来做指针
0040D723 |. 83EC 68 sub esp,68 ; 申请空间
0040D726 |. 53 push ebx ; 保护可能用到的寄存器值
0040D727 |. 56 push esi
0040D728 |. 57 push edi
0040D729 |. 8D7D 98 lea edi,[local.26] ; 初始化,int 3填充防止变量空间执行
0040D72C |. B9 1A000000 mov ecx,1A
0040D731 |. B8 CCCCCCCC mov eax,CCCCCCCC
0040D736 |. F3:AB rep stos dword ptr es:[edi]
0040D738 |. C745 D8 00000>mov [local.10],0 ; 数组初始化 -->arr[10]={0};
0040D73F |. B9 09000000 mov ecx,9
0040D744 |. 33C0 xor eax,eax
0040D746 |. 8D7D DC lea edi,[local.9]
0040D749 |. F3:AB rep stos dword ptr es:[edi]
0040D74B |. 8D45 D8 lea eax,[local.10]
0040D74E |. 8B48 B0 mov ecx,dword ptr ds:[eax-50] ; 50H=20个内存单元(因为是dword)--> arr[-20]
0040D751 |. 51 push ecx ; /Arg7
0040D752 |. 8D55 D8 lea edx,[local.10] ; |
0040D755 |. 8B42 D8 mov eax,dword ptr ds:[edx-28] ; |同上;arr[-10]
0040D758 |. 50 push eax ; |Arg6
0040D759 |. 8B4D EC mov ecx,[local.5] ; |arr[5];下边都是访问数组元素对应内存单元, ; 取数值入栈
0040D75C |. 51 push ecx ; |Arg5
0040D75D |. 8B55 D8 mov edx,[local.10] ; |arr[0]
0040D760 |. 52 push edx ; |Arg4
0040D761 |. 8D45 D8 lea eax,[local.10] ; |
0040D764 |. 8B48 FC mov ecx,dword ptr ds:[eax-4] ; |arr[-1]
0040D767 |. 51 push ecx ; |Arg3
0040D768 |. 8D55 D8 lea edx,[local.10] ; |
0040D76B |. 8B42 F8 mov eax,dword ptr ds:[edx-8] ; |arr[-2]
0040D76E |. 50 push eax ; |Arg2
0040D76F |. 68 AC2F4200 push 关于数组.00422FAC ; |Arg1 = 00422FAC ASCII "%d %d %d %d %d %d
"
0040D774 |. E8 1739FFFF c[FONT="宋体"][SIZE="1"][SIZE="1"][/SIZE][/SIZE][/FONT]all 关于数组.00401090 ; \关于数组.00401090
0040D779 |. 83C4 1C add esp,1C ; 恢复堆栈平衡
0040D77C |. 8B8D 68010000 mov ecx,dword ptr ss:[ebp+168] ; rr[100]
0040D782 |. 51 push ecx ; /Arg7
0040D783 |. 8B55 28 mov edx,[arg.9] ; arr[20]
0040D786 |. 52 push edx ; |Arg6
0040D787 |. 8B45 04 mov eax,dword ptr ss:[ebp+4] ; |arr[11]
0040D78A |. 50 push eax ; |Arg5
0040D78B |. 8B4D 00 mov ecx,dword ptr ss:[ebp] ; |arr[10]
0040D78E |. 51 push ecx ; |Arg4
0040D78F |. 8B55 FC mov edx,[local.1] ; |arr[9]
0040D792 |. 52 push edx ; |Arg3
0040D793 |. 8B45 D8 mov eax,[local.10] ; |arr[0]
0040D796 |. 50 push eax ; |Arg2
0040D797 |. 68 AC2F4200 push 关于数组.00422FAC ; |Arg1 = 00422FAC ASCII "%d %d %d %d %d %d
"
0040D79C |. E8 EF38FFFF call 关于数组.00401090 ; \关于数组.00401090
0040D7A1 |. 83C4 1C add esp,1C ; 恢复堆栈平衡
0040D7A4 |. 33C0 xor eax,eax ; 各种恢复和还原
0040D7A6 |. 5F pop edi
0040D7A7 |. 5E pop esi
0040D7A8 |. 5B pop ebx
0040D7A9 |. 83C4 68 add esp,68
0040D7AC |. 3BEC cmp ebp,esp
0040D7AE |. E8 5D39FFFF call 关于数组.00401110
0040D7B3 |. 8BE5 mov esp,ebp
0040D7B5 |. 5D pop ebp
0040D7B6 \. C3 retn ; 返回[/SIZE][/SIZE]
//****************************************************************
可能上边的代码太抽象。我也是刚看视频,但是有可能有人比我还基础,所以我弄个图,一目了然,内存数据的存放。小白们,天才确实有,但是那些人我们直接望尘莫及,与其感叹人生不如现在脚踏实地。别管别人怎么说,咱们学的问心无愧就好。大家共同努力,等到有一天,像看雪论坛那些神一样的高手站在你面前,对你说“高手,我们做朋友吧!”的时候,我才觉得我们是真的入门了!^_^
说实话,我是这样理解的,但是有些地方希望高手能给我指正,好让我们这些小白能正确的学习,谢谢了。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课