needh 2011-07-17
OllyDbg(简称od)是Win32汇编器级的分析调试器。
下载:
参考资料(日文):
sp-.up.seesaa.net/image/kyozai.html
简单用法:
(1)打开exe
File->Open
(2)附到进程(假如要调试服务进程或者一些特殊运行方式的程序,
但执行暂停可能会破坏进程的处理)
File->Attach
(3)查找API入口表(用于下API断点)
切换模块:在反汇编窗口右键->View->Module 'XXX'
(通常是你正在调试的那个exe名称,如果没有就是说现在就在此模块上,不需要切换)
然后在反汇编窗口右键->Search for->Name(label) in current module
弹出N窗口(Names),选择一个DLL入口函数(例如MSVCRT.exit),右键执行API相关操作(最常见的是下断点或日志断点)
如果列表太长,可以粘贴到文本文件中进行搜索。
(4)查找API的引用
常用于API断点的添加。
照(3)所示打开N窗口后,
N窗口中右键->Find references to import
弹出R窗口(References),然后双击选择位置。
C窗口(CPU)会跳到指定的位置,并且在注释中提示该API的参数信息。例如
00401131 . 6A 30 PUSH 30 ; /BeepType = MB_ICONEXCLAMATION
00401133 . FF15 5C204000 CALL DWORD PTR DS:[<&USER32.MessageBeep>>; \MessageBeep
另一种方法是直接在C窗口右键->Search for All Intermodular calls打开R窗口,
然后双击直接跳到引用的地方,再执行断点等操作。
(5)日志断点
日志断点不会中断程序,而是在程序通过断点处时记录下信息,而方便分析。
在C窗口的反汇编行中右键->Breakpoint->Conditional Log
或R窗口的指定行中右键->Set log breakpoint on every command
弹出对话框,一般OK是灰色的,需要修改单选框。
例如我对运行于该汇编指令处的EBX上的字符串值感兴趣,可以
Expression输入STRING [EBX]
Pause program选择Never。
Log value of expression选择Always。
B窗口(Breakpoints)就会多出一条断点。
日志记录会输出到L窗口(Log data)
关于od的表达式用法可参考
http://hi.baidu.com/hateme_xm/blog/item/3b6d8b81271329d3bc3e1e9c.html
(6)断点和步进
在C窗口双击即可添加断点,然后Debug->Run运行程序。
程序中断后执行Debug->Step into/Step over进行调试,观察堆栈和寄存器的数值变化。
(7)修改exe内容
在C窗口中某反汇编语句上按空格,然后输入新的汇编指令。
修改后右键->Copy to executable->All modifications
弹出D窗口(File)
然后右键->Save File
另存为新的文件。
(8)条件断点和Trace
条件断点与断点的不同在于它是针对数据而非指令。
条件断点在Trace下有效,而在Run下无效。
添加条件断点:
Debug->Set conditon(例如:Command is one of PUSHFD)
然后Debug->Trace into
或者Debug->Animate into(动画显示)
(9)Trace日志
当执行Trace操作(例如Debug->Trace into),
...窗口(Run trace)会保存所有执行过的指令。
右键->Log to file保存为txt文件
用于比较两次Trace的日志以发现代码覆盖的不同。
(10)文本搜索
有时需要知道用户界面的某条字符串在exe的哪个位置。
方法是C窗口Alt+F10(或右键)->Search for->All referenced text strings
弹出R窗口,双击跳到引用处。
如果文本太多,可以考虑复制到记事本中搜索,或者
R窗口右键->Search for text
(11) etc
F9运行
Ctrl+F2结束后重新加载
(Options->Debugging options对话框->
Warn when terminating active process)
F8步进
F2断点
F7步入
Alt+B:B窗口(断点)
C窗口右面的寄存器窗格虽然没有滚动条,但是可以拖动
双击修改汇编,如果按Ctrl+F2重新加载,会变成灰色,
??每次修改应保存
??可以用右键->Backup->Load backup from file重新应用修改过的地方
Copy to executable->All Modifications