CODE很简单:
#include <stdio.h>
#include <stdlib.h>
int Function(int x,int y)
{
return x+y;
}
void main()
{
int a=10;
int b=20;
Function(a,b);
printf("\na=%d,a=%x,b=%d,b=%x",a,&a,b,&b);
system("pause");
}
逆向分析记录:
CALL 00401010 此句执行把下一行地址也就是004011D8压入堆栈,并且跳到00401010继续执行
SUB ESP,8 提升堆栈0X8个地址,用于存放变量,此时的堆栈地址为ESP=0012FF84,此句执行结束以后堆栈ESP=0012FF7C
push 14 将参数0X14压栈,也就是20入栈,执行以后ESP-4,ESP=0012FF78
PUSH 0A 将参数0XA压栈,也就是10入栈,执行以后ESP-4,ESP=0012FF74
MOV DWORD PTR SS:[ESP+C],0A 将0A也就是10放入ESP+c的内存单元,不改变堆栈,此时的ESP+C=0012FF80
MOV DWORD PTR SS:[ESP+8],14 将0X14也就是20放入ESP+8的内存单元,不改变堆栈,此时的ESP+8=0012FF7C
CALL 00401000 调用自写函数FUn,地址为00401000,同时将下一行0040102C亚入堆栈,,执行完毕以后ESP-4=0012FF70 跳转到00401000继续执行
MOV EAX,DWORD PTR SS:[ESP+8],此句取ESP+8内存编号的值传入EAX,此时的ESP+8=0012FF78,存放的是0X14,也就是20
MOV ECX,DWORD PTR SS:[ESP+4] 同上一句一样,也将堆栈的ESP+8内存单元(0012FF74)的值0A取出来,放入ECX中
ADD EAX,ECX,此句执行以后,EAX=原有EAX+ECX=0X14+0XA=0X1E,也就是十进制的30
RETN 此句执行以后,返回到当前堆栈的栈顶指针(0040102C)继续执行,ESP+4=0012FF74
MOV ECX,DWORD PTR SS:[ESP+8] 此句执行将ESP+8的内存单元0012FF7C存放的内容0X14取出来放到ECX中
LEA EAX,DWORD PTR SS:[ESP+8] 将ESP+8的地址赋值给EAX =0012FF7C
PUSH EAX EAX=0012FF7C入栈 ESP-4=0012FF70
MOV EAX,DWORD PTR SS:[ESP+10] 将ESP+10内存单元0012FF80的内容0XA赋值给EAX
LEA EDX,DWORD PTR SS:[ESP+10] 取ESP+10的地址 0012FF80 赋值给EDX
PUSH ECX 0X14入栈 ESP-4 ESP==0012FF6C
PUSH EDX 0012FF80入栈 ESP=0012FF68
PUSH EAX 0XA入栈 ESP==0012FF64
PUSH 408038 将字符串压栈 ASCII 0A,"a=%d,a=%x," ESP-4 0012FF60 执行以后堆栈信息( 0012FF60 00408038 ASCII 0A,"a=%d,a=%x,")
CALL 004010F6 此句将下一行0040104A压栈,ESP-4===0012FF5C 调用printf函数
PUSH 408030 压入字符串 pause 到堆栈
CALL 00401060 调用系统函数System 这就不跟了,会跟到未来
ADD ESP,28 执行完毕ESP+28=0012FF84
RETN 返回到当前ESP中的004011DB ,执行完毕 ESP+4 =0012FF88
写在最后的话:希望论坛的各位大佬给个邀请码,还没转正呢,老是弹个临时会员的窗体,真的很不利于学习,哈哈。
阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开
发者可享99元/年,续费同价!