记录一下使用 ollydbg 的技巧和心得, 以备复习用.
本文需要一定的 ollydbg 的使用经验和 masm 汇编基础
快捷键
F7 : 单步调试, 遇到 call 会跟进
F8 : 单步调试, 遇到 call 跳过
- : 返回上一步调试
+ : 返回下一步调试, 遇到正在调试的步骤时停止
Ctrl + F2 : 重新开始调试
F2 : 下断点
Alt + B : 删除断点
四大窗口
反汇编窗口
寄存器窗口
数据窗口
堆栈窗口
反汇编窗口和堆栈窗口的关系
反汇编窗口的下方是信息栏, 可以提供一些有效信息, 例如内存变量地址等
右键点击可以选择跟随地址或数值, 来查看其中所包含的信息
反汇编的左侧部分为指令地址, 一般由 eip 存储
一般编写的 C 语言文件的函数在汇编中的表示为 文件名.地址 或 文件名.函数名称 的形式, 点击后信息栏会出现 call 跳转的地址, 同时 call 会将其下方一条指令的地址压入栈中
未执行 call 的堆栈窗口
执行 call 后的堆栈窗口
在堆栈窗口中右键, 可以选择地址的表现形式, 这里不再多说
反汇编窗口和数据窗口的关系
在反汇编窗口中经常出现这样的操作数, 很多的 ds, ss 什么的, 这其实是段寄存器
关于段寄存器我也不是很了解, 这里就不细说了. 我们要想知道段寄存器中的寄存器或变量地址, 可以通过下方的信息栏来获取
[] 可看做 C/C++ 中的解引用, [] 中一般为内存变量的地址或指针寄存器存储的地址
我们可以先拿这条指令作演示
其信息栏为
其中 0019FEF0 为 edi 指向的地址. 而等号后面的值则是地址解引用后的值. 很明显这个值是未定义的.
执行完这条语句后
数据窗口和堆栈窗口的关系 (重点)
在 ollydbg 中, 数据窗口和堆栈窗口至关重要, 也是该工具的核心所在.
在 intel 处理器中, 数据入栈一般以小端序的方式入栈, 就是说字节权重较小的数先入栈. 两个十六进制位看成一个字节
如 0x12345678 入栈, 则在栈中的存储形式为
78 56 34 12
堆栈一般是是向下增长的, 每入栈一个数据, 堆栈地址就会 - 4, 因此入栈的数据越多, 其堆栈地址就会越小. ollydbg 看上去将堆栈倒了过来, 但实质还是一样的
了解了这些就可以去看看数据窗口和堆栈窗口有什么关系了, 先来看看堆栈窗口
最左边一列为 esp 和 ebp 存储的堆栈地址
中间一列为入栈的数据, 可能是普通数值也有可能是地址, 或者是指令地址, 地址可以右键点击 "在数据窗口中跟随" 来查看该地址上的数据, 若点击 "在反汇编窗口中跟随", 则查看该条指令的所在位置
最右边一列主要提供有效的信息
在汇编窗口中双击 edi, 然后回到上述的这条指令
可以看到 edi 地址上的数据都是未定义的
执行完这条指令后
注意在数据窗口中, 每个栈帧地址之间的距离为 8, 这是因为一个栈帧的大小为 4 个字节. 点击 hex 可以更改栈帧的个数, 同时栈帧之间的距离也会相应的更改
在栈帧中的值存储形式默认为 ASCII 码, 可以右键自行修改