c&c++反汇编与逆向分析学习笔记(1)--调试工具OllyDBG

我学习用的数据是钱松林和赵海合著的《C反汇编与逆向分析技术揭秘》,这本书绝对可以帮助程序员提高自己,修炼自己的内功。

在软件的开发过程中,程序员会使用一些调试工具,以便高效地找出软件中存在的错误。而在逆向分析领域,分析者也会利用相关的调试工具来分析软件的行为并验证结果。其中OllyDBG是逆向分析中必不可少的一款软件,使用它,程序会按调试者的一员以指令为单位的执行。调试者可以随时中断目标的指令流程,以便观察相关的计算结果和当前的设备情况,也可以随时继续执行程序的后续指令。  


我们首先熟悉下OllyDBG各窗口视图,在这里,我用的是OllyDbg 1.10版本


1:汇编代码对应的地址窗口
2:汇编代码对应的十六进制机器码窗口
3:反汇编窗口
4:反汇编代码对应的注释信息窗口
5:寄存器信息窗口
6:当前执行到的反汇编代码的信息窗口
7:数据窗口--数据所在的内存地址
8:数据窗口--数据对应的十六进制编码信息
9:数据窗口--数据对应的ASCII码信息
10:栈窗口--栈地址

11:栈窗口--栈地址中存放的数据

12:栈窗口--对应的说明信息


OllyDBG快捷键
编号    快捷键    功能说明
01    F2    断点,在OllyDBG反汇编视图中,使用F2指定断点地址
02    F3    加载一个可执行程序,进行调试分析
03    F4    程序执行到光标处
04    F5    缩小、还原当前窗口
05    F7    单步步入,进入函数实现内,跟进到CALL地址处
06    F8    单步步过,越过函数实现,CALL指令不会跟进函数实现
07    F9    直接运行程序,遇到断点处,程序暂停
08    Ctrl+F2    重新运行到程序起始处,用于重新调试程序
09    Ctrl+F9    执行到函数返回处,用于跳出函数实现
10    Alt+F9    执行到用户代码处,用于快捷跳出系统函数
11    Ctrl+G    输入十六进制地址,在反汇编或数据窗口中快速定位到该地址处

我们通过调试一个简单的HelloWorld程序来熟悉OllyDBG的使用,程序很简单,只有几行代码
#include <Windows.h>
int main()
{
    MessageBoxA(NULL,"Hello World","第一个Win32程序",0);
    return 0;
}


(1)加载可执行程序有多种方案:
1>使用快捷键F3选择所要调试的程序路径
2>在菜单选项中(文件\打开)选择调试程序路径
3>将OllyDBG加入系统资源管理菜单中,右击“用OllyDbg打开”

(注:依次选择OllyDBG菜单\选项\添加到浏览器\添加OllyDBG到系统资源管理菜单\完成,即可将OllyDBG加入系统资源管理菜单中。)
(2)点击运行按钮:


    如上图所示,程序运行到地址00F21000处暂停,接下来对应的4条反汇编指令是对MessageBoxA函数的4个参数的入栈,CALL 指令则是调用MessageBoxA函数。
(3)定位数据:


    通过反汇编窗口的注释我们可以看出MessageBoxA的标题为“第一个Win32程序”,内容为“Hello World”,而PUSH Hello.00F22100则表明字符串"第一个Win32程序"的存放在地址为从00F22100地址开始的内存空间中。选中数据窗口,使用快捷键Ctrl+G,弹出数据跟随窗口。输入地址00F22100,单击确定快速定位到该地址。
(4)修改数据:


    找到要修改的数据地址对应的HEX数据,在这里我们把"Hello World"修改成"I like C++"。点击0x48,按数字键弹出修改窗口。去掉"保持大小"的勾选,可以向后修改数据。在ASCII文本编辑框中,输入"I like C++",由于C\C++中字符串以00结尾,需要保证字符串最末尾的数据为00。单击确定,完成修改。
(5)调试程序:
    使用快捷键F8单步调试运行,连续按4次F8键,单步运行4条汇编指令,观察栈窗口变化,我们会发现,MessageBoxA所需的函数都已经保存在栈中了。按F7可以进入MessageBoxA的实现中,代码不适合初学者学习,所以我们跳过,书中使用Alt+F9可以返回到用户代码处,MessageBoxA运行结束,但是我的Alt+F9只是单步执行了,不知道为什么,在这里,我用Ctrl+F9跳出这个函数。这时程序弹出对话框,对话框的内容已经被我们成功修改了。下图就是程序的运行效果。

    到这里,我们已经可以简单的使用OllyDBG这个工具来调试我们的程序了。

   



  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值