OllyDbg的基本使用

注:内容整理自《逆向工程核心原理》,结合我的OllyDbg版本修改了一些内容

1. OllyDbg常用命令及其快捷键

指令 快捷键 含义
Restart Ctrl+F2 重新开始调试
Step Into F7 执行一句OP code,若遇到CALL,进入函数代码内部
Step Over F8 执行一句OP code,若遇到CALL,仅执行函数自身,不跟随进入
Run F9 运行(遇到断点时暂停)
 Execute till return Ctrl+F9   执行函数代码内的命令,直到遇到RETN命令,用于跳出函数体
 Execute till cursor F4  执行到光标所在位置 
 Comment 添加注释 
User-defined comment 鼠标右键菜单Search for-User defined comment 查看用户输入的注释目录
Label : 添加标签
User-defined label 鼠标右键菜单Search for-User defined Label 查看用户输入的标签目录
Breakpoint F2 设置或取消断点
All referenced text strings 鼠标右键菜单Search for-All referenced text strings 查看代码中引用的字符串
All intermodular calls 鼠标右键菜单Search for-All intermodular calls 查看代码中调用的所有API函数
Name in all modules 鼠标右键菜单Search for-Name in all modules 查看所有API函数
Edit data Ctrl+E 编辑数据
Assemble 空格键 编写汇编代码
Copy to executable file 鼠标右键菜单Copy to executable file 创建文本副本(修改的项目被保留)

2. 设置点的方法(这里我们假设大本营的地址为004010ED)

①Goto命令

执行Goto命令(Ctrl+G),在打开的对话框中输入004010ED,然后单击OK按钮,这样光标就会自动定位到004010ED处

然后执行Execute till cursor(F4)命令,让调试流运行到该处

②设置断点

选中004010ED这一行(可以手动找,也可以使用上述Goto命令中的第一步),设置BreakPoint(F2),调试运行到断点处会暂停

然后执行Run debugged application(F9)即可让调试直接运行到断点处暂停

注:在OllyDbg菜单栏中选择View-Breakpoints(Alt+B),可以打开Breakpoints对话框,列出代码中设置的断点。在断点列表中双击某个断点会直接跳转到相应位置

③使用注释

选中004010ED这一行(可以手动找,也可以使用上述Goto命令中的第一步),按;键添加注释

在鼠标右键菜单中选择Search for-User defined comment,就能看到用户输入的所有注释,双击相应注释,光标将自动定位到相应位置

然后执行Execute till cursor(F4)命令,让调试流运行到该处

④使用标签

选中004010ED这一行(可以手动找,也可以使用上述Goto命令中的第一步),按:键为其添加标签

在鼠标右键菜单中选择Search for-User defined labels,就能看到用户设置的所有标签,双击相应标签,光标将自动定位到相应位置

然后执行Execute till cursor(F4)命令,让调试流运行到该处

3. 快速查找指定代码的方法

①代码执行法

当代码量不大且程序功能非常明确时,逐条执行指令来查找需要查找的位置。

具体方法为结合使用F8和F7

②字符串检索法

OllyDbg会先经历一个预分析过程,此过程中会查看进程内存,程序中引用的字符串和调用的API都会被摘录出来,整理到另外一个列表中,这样的列表可以使用鼠标右键菜单Search for-All referenced strings来查看

OllyDbg的基本使用

地址00401007处有一条PUSH OFFSET 00411AF0指令,该指令中引用的00411AF0处即是字符串Hello World!,双击字符串,光标将定位到00401007这一位置

使用Goto命令查看00411AF0地址处的字符串:

OllyDbg的基本使用

即是Hello World!这个字符串

③API检索法——在调用代码中设置断点

OllyDbg的预分析中不仅可以分析出程序中使用的字符串,还可以摘录出程序运行时调用的API函数列表,可以通过鼠标右键菜单中Search for-Intermodular calls来查看该列表

OllyDbg的基本使用

双击其中的任意一行可以定位到该处所对应的代码位置,使用F2下断点即可。

④API检索法——在API代码中设置断点

我们编写的应用程序执行某种操作时(如各种IO操作),必须使用OS提供的API向OS提出请求,然后与被调用API对应的系统DLL文件就会被加载到应用程序的进程内存。使用OllyDbg中的Search for-Names可以列出被加载的DLL文件中提供的所有API

OllyDbg的基本使用

单击Name栏目按名称排序,通过键盘敲出MessageBoxW后,光标会自动定位到MessageBoxW上,双击之后就会显示其代码???(我这里好像不太行,此处存疑)

在MessageBoxW函数的内部实现中的起始地址按下F2下断点,调试时程序运行到该处就会暂停。

4. 修改字符串的方法

①直接修改字符串缓冲区

首先找到Hello World!字符串所在的位置(我这里是00411AF0),在Dump窗口中按Ctrl+G,跳转到这一位置,使用鼠标选中Hello World这一字符串,按Ctrl+E快捷键打开编辑窗口

OllyDbg的基本使用

在弹出的编辑窗口的UNICODE文本框中输入Hello Reversing字符串,Unicode字符串必须以NULL结束,它占据两个字节(00 00),添加NULL只能在HEX文本框中添加,修改完毕之后点击OK即可

这种方法的优点是使用起来非常简单,缺点是对新字符串的长度有限制,新字符串的长度不应比原字符串长(虽然可执行文件保存时一般会给字符串多留出一些空间)

注意:这种修改方式只是暂时的,终止调试后,程序中的字符串仍然没有改变。要把这种更改保存下来,就要把更改后的程序另保存为一个可执行文件。

方法如下:在Dump窗口中,选中更改后的Hello Reversing字符串,单击鼠标右键Edit-Copy to Executable,会打开Hex窗口,在弹出的Hex窗口中点击鼠标右键,选择Save file,保存为新的可执行文件即可。

②在其他内存区域新建字符串并传递给消息函数

待补充

上一篇:第三章 Web页面建设


下一篇:另一个分区工具GNU的parted[转自vbird]