按照书中代码编写stackframe.exe
#include "stdafx.h"
#include "stdio.h"
long add(long a, long b) {
long x = a, y = b;
return (x + y);
}
int main(int argc, char* argv[])
{
long a = 1, b = 2;
printf("%d\n", add(a, b));
return 0;
}
用OllyDbg打开,调出memory(ALT + m):
进入002C1000c处,找到如下代码段:
在002D183D处发现了“%d\n”,初步判定之后的CALL 002D1325为调用printf(),
而printf()中需要两个参数,002D183D处为“%d\n”,则002D183C处的CALL 002D12C6为add()函数的调用。
同时初步判定002D1800 - 002D185F处为main()函数
为了印证猜想,继续调试,进入002D12C6处,判定是否为add()函数。
跳转至002D16F0:
根据002D170E - 002D171D处汇编指令可知:
002D170E与002D1711两条指令将参数a赋予局部变量x,
002D1714与002D1717两条指令将参数b赋予局部变量y,
002D171A与002D171D两条指令计算x+y,同时EAX保存计算结果。
结合之前猜测的main()函数段中的此部分:
可以得出之前的猜测正确,
002D1800 - 002D185F处为main()函数,
002D12C6处为add()函数的调用,
002D1325处为printf()函数的调用