注:内容整理自《逆向工程核心原理》,结合我的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来查看
地址00401007处有一条PUSH OFFSET 00411AF0指令,该指令中引用的00411AF0处即是字符串Hello World!,双击字符串,光标将定位到00401007这一位置
使用Goto命令查看00411AF0地址处的字符串:
即是Hello World!这个字符串
③API检索法——在调用代码中设置断点
OllyDbg的预分析中不仅可以分析出程序中使用的字符串,还可以摘录出程序运行时调用的API函数列表,可以通过鼠标右键菜单中Search for-Intermodular calls来查看该列表
双击其中的任意一行可以定位到该处所对应的代码位置,使用F2下断点即可。
④API检索法——在API代码中设置断点
我们编写的应用程序执行某种操作时(如各种IO操作),必须使用OS提供的API向OS提出请求,然后与被调用API对应的系统DLL文件就会被加载到应用程序的进程内存。使用OllyDbg中的Search for-Names可以列出被加载的DLL文件中提供的所有API
单击Name栏目按名称排序,通过键盘敲出MessageBoxW后,光标会自动定位到MessageBoxW上,双击之后就会显示其代码???(我这里好像不太行,此处存疑)
在MessageBoxW函数的内部实现中的起始地址按下F2下断点,调试时程序运行到该处就会暂停。
4. 修改字符串的方法
①直接修改字符串缓冲区
首先找到Hello World!字符串所在的位置(我这里是00411AF0),在Dump窗口中按Ctrl+G,跳转到这一位置,使用鼠标选中Hello World这一字符串,按Ctrl+E快捷键打开编辑窗口
在弹出的编辑窗口的UNICODE文本框中输入Hello Reversing字符串,Unicode字符串必须以NULL结束,它占据两个字节(00 00),添加NULL只能在HEX文本框中添加,修改完毕之后点击OK即可
这种方法的优点是使用起来非常简单,缺点是对新字符串的长度有限制,新字符串的长度不应比原字符串长(虽然可执行文件保存时一般会给字符串多留出一些空间)
注意:这种修改方式只是暂时的,终止调试后,程序中的字符串仍然没有改变。要把这种更改保存下来,就要把更改后的程序另保存为一个可执行文件。
方法如下:在Dump窗口中,选中更改后的Hello Reversing字符串,单击鼠标右键Edit-Copy to Executable,会打开Hex窗口,在弹出的Hex窗口中点击鼠标右键,选择Save file,保存为新的可执行文件即可。
②在其他内存区域新建字符串并传递给消息函数
待补充