首页 > 技术文章 > 关于 ollydbg 的使用心得

ICeVe 2021-03-29 13:49 原文

记录一下使用 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 码, 可以右键自行修改

推荐阅读