呵呵 ollyDbg, 放在工具箱里面好久了, 但是一直没有使用过, 这次就拿 HelloWorld 试试吧
vc6 中新建 c++ 源文件如下
#include
using namespace std;
int main() {
int x = 2, y = 3;
int z = x + y;
cout << " x + y : " << z << endl;
cin >> x;
return 0;
}
编译, 运行之后结果如下
ollyDbg 打开给定的 程序如下
这里 main 函数和标记的地方, 就是 main 函数的调用的地方, 这里之所以我能标记出, 是因为 ollyDug 在右边备注了 main, 但是不知道为什么 后面的重新调试, 就没有这个备注了
接下来我们关注一下 main 函数里面的东西吧
1. 函数最初调用的状态
标准的函数调用的相关指令, 入栈bp, 更新bp, 保存被调用者保存寄存器
调用 main 函数的函数 : bp : 0019FF70, sp : 0019FF30
main 函数的 bp : 0019FF30 , sp : 0019FFE4
2. 入栈bp, 更新bp, 保存被调用者保存寄存器 之后的状态
上述业务处理完之后的状态 如上图
3. 参数格式化处理
吧局部变量区 格式化为 0xcccccccc (int3中断)
4. 处理 业务代码
处理 int x = 2, y = 3; int z = x + y; 的相关业务
处理 cout << " x + y : " << z << endl;
这个时候 就可以发现 程序里面已经输出了 " x + y : 5", 实际上还包括一个 回车, 你再单布调试的过程中, 可以看到 输出的部分, 随着红框出的call指令, 一部分一部分的输出
"PUSH 0040110E" 压入的是 endl
这个步骤之后, 就可以在 程序里面输入 x 的新值了
5. 清理工作
准备函数调用的清理相关工作, 恢复被调用者保存寄存器, 恢复 sp, bp
ret 指令, 返回调用方
呵呵 2019 完
rep stos 指令(Intel汇编) : https://blog.csdn.net/ypist/article/details/8467163
Java Main如何被执行? : https://www.cnblogs.com/iceAeterNa/p/4876940.html#4404512