菜鸟的逆向工程学习之路——逆向工具IDA的使用
本期向大家详细介绍IDA的使用。
交互式反汇编器专业版(Interactive Disassembler Professional),人们常称为 IDA Pro。就其本质而言,IDA 是一种递归下降反汇编器,是个逆向分析的神器之一,可以分析x86、x64、ARM、MIPS、Java、.NET等众多平台的程序代码,是安全分析人士不可缺少的利器!
启动IDA
只要启动 IDA,你都会看到一个初始欢迎界面,上面显示你的许可证信息摘要。初始屏幕消失后,IDA 将显示另一个对话框,为你进入桌面环境提供 3 种选项
New(新建)。选择 New 将启动一个标准的 File Open 对话框来选择将要分析的文件。根
据选择的文件,IDA 会显示另外一个或多个对话框,你可以选择特定的文件分析选项,
然后再加载、分析和显示该文件。
Go(运行)。Go 按钮终止加载过程,使 IDA 打开一个空白的工作区。这时,如果要打开
一个文件,可以将一个二进制文件直接拖放到 IDA 工作区,或者使用 File 菜单中的某个
选项打开该文件。
Previous(上一个)。使用 Previous 按钮可以打开其下“最近用过的文件”列表中的一个
文件。“最近用过的文件”列表中包含 IDA 的 Windows 注册表项的 History 子项中的值。
IDA 文件加载
打开一个新文件时,会看到如图所示的加载对话框。
IDA 会生成一个可能的文件类型列表,并在对话框顶部显示这个列表。这个列表中将显示最适合处理选定文件的 IDA 加载器。IDA 通过执行 loaders 目录中的每一个文件加载器,来确定能够识别新文件的加载器,从而建立了这个列表。
如果 IDA 提供几个加载器,这时选择默认选项是一个不错的策略,除非你拥有推翻 IDA 决定的信息。
简言之:选默认
同样的,选默认
IDA关闭数据库
任何时候你关闭一个数据库,无论你是完全关闭 IDA,还是切换到另一个数据库,IDA 都将
显示一个 Save database(保存数据库)对话框,如图
如果这是你初次保存一个新建的数据库,IDA 会用扩展名.idb 替换输入文件的扩展名,从而生成新数据库的文件名,例如,example.exe 会生成名为 example.idb 的数据库。如果输入文件没有扩展名,IDA 会将.idb 附加到输入文件名称后面,构成数据库名称,如 httpd 生成 httpd.idb。
下面简要说明可用的保存选项及其意义。
Don’t pack database(不打包数据库)。这个选项仅仅刷新对 4 个数据库组件文件所做的更改,在关闭桌面前并不创建 IDB 文件。在关闭数据库时,不建议使用这个选项。
Pack database(Store)[打包数据库(存储)]。选择 Store 选项会将 4 个数据库组件文件存到一个 IDB 文件中。之前的任何 IDB 不经确认即被覆盖。Store 选项不使用压缩。创建 IDB 文件后,4 个数据库组件文件即被删除。
Pack database(Deflate)[打包数据库(压缩)]。Deflate 选项等同于 Store 选项,其唯一的差别在于数据库组件文件被压缩到 IDB 归档文件中。
Collect garbage(收集垃圾)。如果请求垃圾收集,IDA 会在关闭数据库之前,从数据库中删除任何没有用的内存页面。在选择这个选项的同时,选择 Deflate 选项可创建尽可能小的 IDB 文件。通常,只有在磁盘空间不足时才选择这个选项。
DON’T SAVE the datebase(不保存数据库)。你可能会感到奇怪,怎么会有人不保存自己的工作呢!要知道,要想放弃你当前对数据库所做的更改(上次保存之后),使用这个选项是唯一的办法。选择这个选项时,IDA 会删除 4 个数据库组件文件,保留现有的未经修改的 IDB 文件。使用这个选项类似于在使用 IDA 时应用了撤销或还原功能。
IDA常用窗口简单介绍
我们首先以BUUCTF网站的easyre题介绍
函数窗口(Functions window)
左侧是函数窗口,会将程序中所有的函数显示出来
我们分析一道题目的时候一般是先从主函数开始
但是main一般不会显示出来,我们这时可以先搜索,用 Ctrl+F 快捷键
然后点击main,即可跳转到main函数里
汇编窗口(IDA View)
现在可见的是汇编窗口,展示的汇编代码,如图所示的是图形模式
我们可以按右键 选择 Text view 或者点击 空格键 进入文本模式
展示了一些地址和汇编代码
“十六进制窗口”(Hex View)
习惯讲是“十六进制窗口”,但将这个窗口称做“十六进制窗口”其实是一种误称,因为IDA十六进制窗口可以配置为显示各种格式,并可作为十六进制编辑器使用。默认情况下,十六进制窗口显示程序内容和列表的标准十六进制代码,每行显示16个字节,以及其对应的ASCII字符。和在反汇编窗口中一样,用户也可以同时打开几个十六进制窗口
导航栏
彩色的水平带是 IDA 的概况导航栏,也叫做导航带。导航带是被加载文件地址空间的线性视图。默认情况下,它会呈现二进制文件的整个地址范围。你可以右击导航带内任何位置
在导航带上,会有一个细小的当前位置指示符(默认为黄色)指向与当前反汇编窗口中显示的地址范围对应的导航带地址。将光标悬停在导航带的任何位置,IDA 会显示一个提示,指出其在二进制文件中的对应位置。
简单来说,点到哪里跳到哪里
而不同的颜色代表了不同的数据段,比如说data段,text段等
伪代码窗口(Pseudocode)
对着函数点F5即可弹出伪代码窗口
是将汇编语言,变成伪代码,即展示了一些类c代码
先简单介绍这么多窗口,其余窗口在实际用到时再介绍学习。
打开所有的函数窗口的方式
View > Open subviews > …
快捷键 / 一些操作的介绍
Shift+F12
可以打开字符串窗口(String window)
这个窗口展示了所有的字符串,我们可以在这里查找一些关键的字符串,我们也可以通过双击某一特殊字符串,弹到汇编窗口(IDA View)中该字符串对应的位置中去。
Ctrl+X(交叉引用)
我们可以通过这个操作,可以判断哪些函数引用了这个字符串或数据
点击ok,便会跳转到相应地方
G(跳转地址)
前面说过汇编窗口界面,左边是一些地址,右边是汇编代码
我们在浏览这些代码的过程中,往下往上翻页,可能找不到原来的地方了,或者有时候,你清楚地知道你想要导航的目的地址,但反汇编窗口中并没有可供双击导航的名称。这时我们就可以通过该操作跳转到相应的位置。
Alt+T(文本搜索)
IDA文本搜索相当于对反汇编列表窗口进行子字符串搜索。
它将搜索限制于仅查找完整的词,并且能够匹配反汇编行中的任何完整的词,包括操作码助记符或常量
选择Find all occurences(查找所有结果),IDA将在一个新的窗口中显示搜索结果,你可以根
据搜索条件轻松导航到任何一个匹配结果。
N(重命名)
对于一些函数名,我们可以改为方便我们理解的函数名
如果不小心改错了怎么办?
Ctrl+Z(撤回操作)
撤回到上一步
/ ( 注释操作)
在方框内添加注释,程序员必备,不多讲
我们下面用第二道题,reverse1来演示
这道题首先搜索main函数,没找到,怎么办呢?
我们用之前讲的查找字符串(shift+f12)
发现一些有用的信息
再根据我们之前讲的,定位,交叉引用,编译伪c代码,可以找到我们关键需要分析的地方
我们会发现在上述代码中,自带了一些注释,有时候会过多,可能会影响我们分析
\ (隐藏系统注释)
我们可以用这种方法隐藏干扰我们的一些自带的注释。
D (转换成数据形式)
我们在分析数据的时候,有时候需要这样做,将字符串转换成数据
A(转换成字符形式)
转换成字符串
C(转换成汇编代码)
转换成汇编代码
U (转成原始字符)
转换成最原始的状态
Shift+E (导出数据)
如果有想导出的数据,选中然后shift+e,选择你想导出的方式
便会导出
数据转化形式
我们在分析伪代码的时候,有时候要对一些数据进行类型转化
右键数据,可以产生如下选项
Hexadecimal 十六进制
Octal 八进制
Char 字符
Enum 枚举
至此,IDA一些常用的窗口与功能已经介绍完毕,未介绍的将在遇到实际应用场景时再行学习。