文档详情

C语言最简main函数的反汇编代码解析

平***
实名认证
店铺
DOCX
18.32KB
约3页
文档ID:16766935
C语言最简main函数的反汇编代码解析_第1页
1/3

目前我们写的最简单的 Main函数如下:代码:#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){return 0;}利用 VS编译器将运行时程序反汇编,结果如下:代码:int _tmain(int argc, _TCHAR* argv[]){010C13A0 push ebp 010C13A1 mov ebp,esp 010C13A3 sub esp,0C0h 010C13A9 push ebx 010C13AA push esi 010C13AB push edi 010C13AC lea edi,[ebp-0C0h] 010C13B2 mov ecx,30h 010C13B7 mov eax,0CCCCCCCCh 010C13BC rep stos dword ptr es:[edi] return 0;010C13BE xor eax,eax }010C13C0 pop edi 010C13C1 pop esi 010C13C2 pop ebx 010C13C3 mov esp,ebp 010C13C5 pop ebp 010C13C6 ret看起来汇编很头疼吧,那么让我们来茅塞顿开吧。

首先了解一下以前几个未知半懂的汇编指令的含义:代码:push ebpmov ebp,esppush:把一个 32位操作数压入栈中,这个操作导致 esp被减 4 ebp 被用来保存这个函数执行前的 esp的值,执行完毕后用 ebp恢复 esp同时,调用此函数的上层函数也用 ebp做同样的事情所以先把 ebp压入堆栈,返回之前弹出,避免 ebp被我们改动代码:xor eax,eaxretxor eax,eax常用来代替 mov eax,0清零操作在 windows中,函数返回值都是放在 eax中然后返回,外部从 eax中得到返回值这就代表 return 0操作代码:lea edi,[ebp-0C0h]lea取得第二个参数代表的地址放入第一个参数代表的寄存器中代码:mov ecx,30h mov eax,0CCCCCCCCh rep stos dword ptr es:[edi] stos是串存储指令,它的功能是将 eax中的数据放入 edi所指的地址中,同时 edi会增加 4个字节Rep使指令重复执行 ecx中填写的次数。

由于 CPU的寄存器有限,而且操作寄存器会影响标志值,push 作用是压栈,pop 是退栈即保存寄存器标志的值和寄存器本身的值,以便在函数调用完毕后恢复原有的标志值这也是为什么我们见到在调用某个函数或者运行一个程序时,入口总是 push一堆寄存器的东东,也就是这个原因通过上面的基础知识,我们来看看 main函数的反汇编解释:代码:int _tmain(int argc, _TCHAR* argv[]){010C13A0 push ebp ;保存 ebp,返回之前弹出,避免 ebp被我们改动push 操作使 esp减小,esp不变010C13A1 mov ebp,esp; ebp被用来保存这个函数执行前的 esp的值,执行完毕后用 ebp恢复 esp;原 ebp值已经被压栈(位于栈顶),而新的 ebp又恰恰指向栈顶;此时 ebp寄存器就已经处于一个非常重要的地位,该寄存器中存储着栈中的一个地址(原 ebp入栈后的栈顶);从该地址为基准,向上(栈底方向)能获取返回地址、参数值(假如 main中有参数,“获取参数值”会比较容易理解;向下(栈顶方向)能获取函数局部变量值,而该地址处又存储着上一层函数调用时的 ebp值010C13A3 sub esp,0C0h ;把 esp往上移动一个范围,等于在栈中开辟一片空间存储 main函数的局部变量;由于冯诺依曼机是小端模式,所以 sub操作可以理解为将 esp栈顶减去,实际上是为栈增加空间010C13A9 push ebx 010C13AA push esi 010C13AB push edi ;保存三个寄存器的值,待 main结束恢复,原来的值被破坏有可能引起系统崩溃010C13AC lea edi,[ebp-0C0h] ;把 ebp-0c0h加载到 edi中,目的是保存局部变量的区域010C13B2 mov ecx,30h 010C13B7 mov eax,0CCCCCCCCh 010C13BC rep stos dword ptr es:[edi] ;从 ebp-0c0h开始的局部变量空间区域初始化成全部 0CCCCCCCCh(也就是 int 3中断指令的机器码);局部变量不可能被执行,执行了就会出错。

这样发生意外时执行堆栈里面的内容会引发调试中断提示开发者return 0;010C13BE xor eax,eax; 返回值将放在 eax返回(这就是很多软件给秒杀爆破的原因,因为 eax的返回值是可以改的) }010C13C0 pop edi 010C13C1 pop esi 010C13C2 pop ebx ; 恢复原来寄存器的值,怎么“吃”进去,怎么“吐”出来010C13C3 mov esp,ebp ;恢复 ESP栈顶指针010C13C5 pop ebp;恢复 ebp,也就是恢复调用 main函数之前各个寄存器的状态 010C13C6 ret;将返回地址存入 eip,退出主函数通过以上分析,大家应该对 main函数的反汇编解析有一定的概念了吧返回去看文章开头的反汇编代码,心里肯定比刚开始看的感觉舒服多了在实战中,我们 OD的汇编代码基本也就是这个套路,当然细节还得另外分析有什么错误,敬请大伙指正,共同学习参考资料:。

下载提示
相似文档
正为您匹配相似的精品文档