今天得空,跟大家伙儿聊聊我当初是怎么开始折腾 OllyDbg 这玩意儿的。现在回想起来,那会儿真是纯粹靠着一股子好奇心瞎鼓捣,走了不少弯路,但也确实学到了不少东西。
上手准备,心里打鼓
我记得那会儿,是听一些论坛上的老哥们说起,要想看看程序内部到底是怎么跑的,OllyDbg 是个好帮手。就喜欢刨根问底,一听这个,立马就来了兴趣。说干就干,我就上网找这个 OllyDbg。那时候好像最新的是 1.10 版,下载下来一看,是个 ZIP 压缩包,绿色软件,我喜欢!找了个顺眼的文件夹,直接解压进去,里面有个 * 文件。
系统方面,我当时用的是个 Windows 7 的老爷机,内存也就 4GB,不过跑 OllyDbg 这种小程序是绰绰有余了。也没啥特别的安装过程,解压完事儿。
初探门径,眼花缭乱
双击那个 *,程序“唰”的一下就打开了。好家伙,第一眼看过去,我直接懵圈了。界面上密密麻麻好几个窗口,什么:
- CPU 主窗口,全是汇编代码,什么 MOV、PUSH、JMP,看得我头大。
- 寄存器窗口,EAX、EBX 一大堆,数值还老变。
- 内存转储窗口,一堆十六进制数字。
- 堆栈窗口,也是各种地址和数值。
当时心里就犯嘀咕,这玩意儿能学会吗?感觉比我之前玩的那些编程语言复杂多了。不过来都来了,硬着头皮也得上。
加载程序,小试牛刀
光看界面肯定不行,得找个实际的程序来“解剖”一下。我记得当时为了练手,专门用 C 语言写了个最简单的“Hello, World!”程序,编译成 .exe 文件。然后在 OllyDbg 里,我摸索着点了左上角的“文件”菜单,然后选“打开”,找到了我那个小程序。一点确定,CPU 窗口里就哗加载了一堆汇编指令,这就是我那小程序“翻译”过来的样子。
接下来就是重头戏了——调试。我之前稍微瞄过几眼教程,知道 F2 是下断点,F9 是运行程序。于是我就随便找了行代码,按了下 F2,那行地址前面就多了个红色标记。然后我一按 F9,程序果然就停在了我下断点的地方,EIP 寄存器(就是那个指令指针)也指向了那一行,CPU 窗口那行代码也高亮了,感觉真神奇!
然后我又试了试 F7(步入)和 F8(步过)。一开始老搞混这两个,后来慢慢明白了,F7 会跟着 CALL 指令跳到函数内部去,F8 ,就把 CALL 当成一条普通指令执行完就过去了,不会跳进去。我就这么一步一步地按 F7、F8,看着寄存器窗口里的值跳来跳去,堆栈窗口也不停地变化,慢慢地好像有点感觉了,能看懂程序是怎么一步步执行的。
修改内存,尝到甜头
光看还不过瘾,我还想试试能不能改点比如,我那个“Hello, World!”程序不是会显示个字符串嘛我就在内存转储窗口里,用鼠标右键,选了“搜索”->“ASCII 字符串”,然后输入“Hello, World!”。你猜怎么着?还真给我找到了!
找到之后,我就选中那段内存,右键选“二进制”->“编辑”,然后小心翼翼地把里面的字符给改了,比如改成“Haha, I changed it!”。改完之后,我取消了之前下的断点,直接按 F9 让程序跑完。控制台窗口里弹出来的还真是我改过之后的字符串!那一刻,别提多有成就感了,感觉自己跟个黑客似的,哈哈!
这只是最最基础的操作。后来我又慢慢学了怎么看懂函数调用约定,怎么在内存里找关键数据,怎么修改程序的跳转逻辑,等等。遇到不懂的,就去翻那些“入门教程”PDF,或者在网上搜帖子看。虽然过程挺费劲,有时候对着一堆汇编指令能看上大半天,但每次搞明白一点东西,都觉得特别值。
OllyDbg 这玩意儿,上手确实有点门槛,尤其是对汇编不熟的话。但只要肯花时间去琢磨,它绝对是个能让你深入了解程序运行机制的利器。我这实践过程,也就是个开头,后面还有更多复杂的功能等着去探索。今天就先分享到这儿,下次有机会再聊聊别的实践心得。