【实验名称】 反汇编工具的使用
【实验目的】
1.熟悉动态分析工具OllyDBG的界面和常用模块
2.熟悉静态分析工具IDA的界面和常用模块
3.掌握使用OllyDBG和IDA分析修改可执行文件的方法
【实验原理】
1.OD界面
a.反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、机器码、反汇编代码、注释。
b.寄存器窗口:显示当前所选线程的 CPU 寄存器内容
c.信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等
d.数据窗口:显示内存或文件的内容。右键菜单可用于切换显示方式。
e.堆栈窗口:显示当前线程的堆栈。
- OD使用
(1)查找可执行文件中所有字符串:在“反汇编窗口”单击鼠标右键,选择“查找”选项可查看可执行文件反汇编代码的“所有参考文本字串”
(2)修改某个内存地址的数据:
在“数据窗口”按“Ctrl+G”,可查找某个内存地址的值。
在“数据窗口”,选中要修改的数据,单击鼠标右键,选择“二进制”选项 的“编辑”项,可修改数据值。
在“数据窗口”,单击鼠标右键,选择“复制到可执行文件”选项,再选择 “保存文件选项”
【实验内容】
参看《课4-实验步骤》
1.使用VC 6.0 编写win32 控制台程序:Hello world,得到可执行文件hello.exe
2.使用《课4-实验步骤》中的两种方法将hello.exe的输出由“Hello World!”改为“Reverse Me!”
一、VC++ 6.0 编写Win32控制台程序
a)创建新的工程hello:win 32 console
b)创建CPP源文件
c)写入代码
d)编译、组建、运行后查看运行结果
e)思考:修改可执行文件hello.exe,使其输出Reverse Me!
i.方法一
ii.方法二
二、OD 修改hello.exe,使得程序输出为Reverse Me!
a)系统自带OD,
b)也可以解压“4-Fishc OD(解压密码:fishc.com).zip”。 FishcOD.exe(***)绿色版免安装
c)OD界面
f.反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、机器码、反汇编代码、注释。
g.寄存器窗口:显示当前所选线程的 CPU 寄存器内容
h.信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等
i.数据窗口:显示内存或文件的内容。右键菜单可用于切换显示方式。
j.堆栈窗口:显示当前线程的堆栈。
d)用OD打开hello.exe,并修改hello.exe.
i.在反汇编窗口,单击鼠标右键。
ii.在弹出的对话框中,单击鼠标右键,选择‘查找文本’。查找“Hello World”
双击Hello World!所在的一行,快速定位到所在的反汇编窗口
iii.在反汇编窗口中修改代码。
1.反汇编窗口,选中’Hello World’所在的行,单击鼠标右键-分析-从模块中删除分析。删除掉 OD的分析结果。
2.反汇编窗口,选中’Hello World’所在的行,单击鼠标右键-分析—分析代码
3.从反汇编窗口找到字符串Hello World在内存中的地址,复制地址43402C,后点取消
4.在内存窗口,查找地址。CtrL+G弹出查找内存地址的窗口。
5.修改内存中的数据
选中要修改的内存地址,单机鼠标右键,选择二进制->编辑:
把“Hello World!”改为“Reverse Me!”,但是“Reverse Me!”比“Hello World!”少一个字符,所以把要多的这个字符去掉,先把最后一个字符改为0A换行符:
再把之前的换行符0A改为00,就是null空字符:
iv.运行结果
修改之后,复制到可执行文件:
保存
运行:
三、IDA和OD结合修改hello.exe,使得程序输出Reverse Me!
a)IDA打开hello.exe
b)查看String Windows
查找到“hello world!”
c) 单击鼠标右键-Graph View,切换为Graph View,展现各个结构之间的关系。
d)将判断指令JZ改为JNZ,这样当输入为true时,程序将跳转输出字符串Reserve Me!
需要设置IDA显示16进制机器码,即图中步骤2、3
之后IDA就会显示16进制机器码:
e) 使用OD打开hello.exe,将内存地址00401172的值由0x74改为0x75。参考“三、OD修改hello.exe”
用OD打开.exe文件来修改,按Ctrl+G快速定位00401392这一行。
二进制编辑修改:由0x74改为0x75
复制到可执行文件,保存文件:
运行:
f) 在上课的时候最后一步是用OD打开hello.exe,将内存地址00401172的值由0x74改为0x75的。
当时就疑惑怎么不直接使用IDA修改由0x74改为0x75。所以下面是先用IDA修改的:
先选中关键代码所在的那一行,打开Edit->Path prodram->Change byte
其实这里的三种选项都可以修改,
只是Change byte是修改16进制下的代码,显示从开始的那一行到这一节结束的那一行:
Change word是修改所选中那一行的值:
Assemble则是直接修改汇编代码:
现在我们随便使用一种方式把JZ指令改为JNZ,从而改变程序的跳转。之后点击编辑->修补文件->修补程序应用到输入文件:
再选择修改的范围和输入的文件即可:
最后我们打开修改过的exe文件
程序的跳转逻辑已经被更改了。