07 OllyDbg 调试 HelloWorld

前言

呵呵 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;

}

 

编译, 运行之后结果如下 

07 OllyDbg 调试 HelloWorld_第1张图片

 

 

调试

ollyDbg 打开给定的 程序如下 

07 OllyDbg 调试 HelloWorld_第2张图片

这里 main 函数和标记的地方, 就是 main 函数的调用的地方, 这里之所以我能标记出, 是因为 ollyDug 在右边备注了 main, 但是不知道为什么 后面的重新调试, 就没有这个备注了 

 

接下来我们关注一下 main 函数里面的东西吧 

1. 函数最初调用的状态 

07 OllyDbg 调试 HelloWorld_第3张图片

标准的函数调用的相关指令, 入栈bp, 更新bp, 保存被调用者保存寄存器 

调用 main 函数的函数 : bp : 0019FF70, sp : 0019FF30 

main 函数的 bp : 0019FF30 , sp : 0019FFE4 

 

2. 入栈bp, 更新bp, 保存被调用者保存寄存器 之后的状态

07 OllyDbg 调试 HelloWorld_第4张图片

上述业务处理完之后的状态 如上图 

 

3. 参数格式化处理 

07 OllyDbg 调试 HelloWorld_第5张图片

吧局部变量区 格式化为 0xcccccccc (int3中断)

 

4. 处理 业务代码 

07 OllyDbg 调试 HelloWorld_第6张图片

处理 int x = 2, y = 3; int z = x + y; 的相关业务 

 

07 OllyDbg 调试 HelloWorld_第7张图片

处理 cout << " x + y : " << z << endl; 

这个时候 就可以发现 程序里面已经输出了 " x + y : 5", 实际上还包括一个 回车, 你再单布调试的过程中, 可以看到 输出的部分, 随着红框出的call指令, 一部分一部分的输出  
"PUSH 0040110E" 压入的是 endl 

 

07 OllyDbg 调试 HelloWorld_第8张图片获取到 x, cin 的地址, 并且处理输入的相关业务

这个步骤之后, 就可以在 程序里面输入 x 的新值了

 

5. 清理工作 

07 OllyDbg 调试 HelloWorld_第9张图片

准备函数调用的清理相关工作, 恢复被调用者保存寄存器, 恢复 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

 

 

你可能感兴趣的:(Assembly)