逆向学习之路 -- 《加密与解密》读书笔记 -- 调试篇
动态分析技术
用户模式: 调试用户模式应用程序的调试器,工作在Ring 3级,eg. OllyDbg、x64dbg、Visual C++ etc.
内核模式: 能调试操作系统内核的调试器,eg. WinDbg
OllDbg 调试器(简称“OD”) 是由 Yuschuk(www.ollydbg.de)编写
按F3 打开一个EXE文件
C 默认当前窗口是CPU窗口;
包含5个面板窗口,分别是:
1. 反汇编面板(Disassembler window)显示被调试程序的代码,有4列,分别是(Address)、十六进制的机器码(Hex dump)、反汇编代码(Disassembly)和注释(Comment).在最后一列注释中显示了相关API参数或运行简表。
2. 信息面板(Information window) 将显示与指令相关的各寄存器的值、API函数调用提示和跳转提示等信息。
3. 数据面板(Dump window) 以十六进制和字符方式显示文件在内中的数据。要显示指定内存地址的数据,可单击右键快捷菜单中"Go to expression"命令或按“Ctrl+G”快捷键,打开地址窗口,输入地址。
4. 寄存器面板(Registers window) 显示CPU各寄存器的值,支持浮点、MMX和3DNow!寄存器。可以单击右键或窗口标题来切换显示寄存器的方式。
5. 栈面板(Stack window) 显示栈的内容,既ESP执行地址的内容。讲数据放入栈的操作称为入栈(push),从栈中取出数据的操作称为出栈(pop)。栈窗口非常重要,各API函数和子程序都利用它传递信息和变量等。
加载目标文件进行调试
选项-调试选项-事件修改为“WinMain"
按“F3” 载入文件
寄存器面板显示的值
EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI和EIP,他们统称为32位寄存器
ESP为栈指针,指向栈顶,右下角的栈面板上显示了栈的值
EIP 指向当前将要执行的指令,按一下“F7”讲执行下一条命令
PS: “F7” 建 和“F8”键的主要区别在于,遇到call、loop等指令,按“F8”键会路过,按“F7”键会跟进。这里我理解的是F7是仔细读取,看到Call指令深入细读取。F8是粗略读取,不会对Call指令进行深挖。
ctrl + * 可以设定 EIP指针点(此处为新EIP)按F7后将从新的指针EIP位置继续往下执行
- (减号键) 或者 esc 回看之前但不跟踪代码
需要连续按“F7”和“F8” 可以使用 Ctrl + "F7" , Ctrl + "F8" (需要按ESC或者 F12才能中止或者遇到其他断点时停止)
ctrl + “F9” 会在遇到的第一个返回命令处(ret、retf或iret),如果此时按"F7"将会跳过整段代码回到Call之前的下一行
e.g 比如从 004013FA 语句按“F7”,因为有call就会进入子程序
# 先按ctrl + * 指定EIP 为004013FA ,然后接着按“F7”,就会进入子程序
# 按 Ctrl + F9
如果,在按F7将脱离 这部分的读取,并跳出刚进入的call里面。注意这里的Ctrl + F9 遇到ret指令是暂停还是路过,可以设置,如下:
ctrl + F2 重新载入程序
F2,设置断点后用Alt+B 查看设置的断点明细
P23