C++ 函数反汇编跟踪以及栈结构分析

#include <iostream>
using namespace std;
 
int func(int a,int b);
 
void main()
{
         intx = 1;
         inty = 2;
         intz = func(x,y);
}
 
int func(int a,int b)
{
         returna + b;
}


汇编解析:

void main()
{
//这个函数头产生的汇编代码是:
main:
013E13A0 push        ebp 
013E13A1 mov         ebp,esp 
013E13A3 sub         esp,0E4h 
013E13A9 push        ebx 
013E13AA push        esi 
013E13AB push        edi 
013E13AC lea         edi,[ebp-0E4h] 
013E13B2 mov         ecx,39h 
013E13B7 mov         eax,0CCCCCCCCh 
013E13BC rep stos    dword ptres:[edi] 
 
*******************************************************
         intx = 1;
         inty = 2;
//这个的汇编代码是:
013E13BE mov         dword ptr [x],1 
013E13C5 mov         dword ptr [y],2 
*******************************************************
//接下来就是函数的调用了,先是把参数压栈
013E13CC mov         eax,dword ptr [y] 
013E13CF push        eax 
013E13D0 mov         ecx,dword ptr [x] 
013E13D3 push        ecx 
//参数压栈后就是调用函数
013E13D4 call        func (13E11D1h)
// 在这个地方用F11调试步进,可以进入子函数func的汇编代码,如下:
013E11D1 jmp         func (13E35B0h)
func:
013E35B0 push        ebp 
013E35B1 mov         ebp,esp 
013E35B3 sub         esp,0C0h 
013E35B9 push        ebx 
013E35BA push        esi 
013E35BB push        edi 
013E35BC lea         edi,[ebp-0C0h] 
013E35C2 mov         ecx,30h 
013E35C7 mov         eax,0CCCCCCCCh 
013E35CC rep stos    dword ptr es:[edi] 
013E35CE mov         eax,dword ptr [a] 
013E35D1 add         eax,dword ptr [b] 
013E35D4 pop         edi 
013E35D5 pop         esi 
013E35D6 pop         ebx 
013E35D7 mov         esp,ebp 
013E35D9 pop         ebp 
013E35DA ret 
//func函数执行完毕后返回主函数中
013E13D9 add         esp,8 
013E13DC mov         dword ptr [z],eax 
013E13DF xor         eax,eax 
013E13E1 pop         edi 
013E13E2 pop         esi 
013E13E3 pop         ebx 
013E13E4 add         esp,0E4h 
013E13EA cmp         ebp,esp 
013E13EC call       @ILT+315(__RTC_CheckEsp) (13E1140h) 
013E13F1 mov         esp,ebp 
013E13F3 pop         ebp 
013E13F4 ret 


 

接下来再看看各个寄存器都是怎么变的,里面存的什么东西

1      首先进入main函数最开始:

再看看此时的寄存器的内容:


EAX = 00851D88EBX = 7E0BC000 ECX = 00854A30 EDX = 00000001ESI = 00000000 EDI = 00000000 EIP = 013E13A0ESP = 009BF76C EBP = 009BF

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值