IDA 简介
IDA Pro 是 Hex-Rays 公司出品的一款交互式反汇编工具,它功能强大、操作复杂,要完全掌握它需要具备很多知识。就其本质而言,IDA 是一种递归下降反汇编器,但效率相比普通的反汇编器要高得多,原因如下
IDA应用大量启发式代码来识别递归下降过程中遗漏的代码。IDA在区分数据与代码的同时还会设法确定数据的类型。IDA的目标之一是呈现尽可能接近源代码的代码。
IDA不仅使用数据类型信息,而且通过派生的变量和函数名称来尽其所能地注释生成的反汇编代码。
IDA 同时支持 32 位和 64 位的程序分析。IDA 支持的文件类型非常丰富,除了常见的 PE 格式,还支持 DOS、UNIX、Java、.NET 等平台的文件格式。
IDA 目录结构
cfg:cfg 目录包含各种配置文件,包括基本IDA配置文件
ida.cfg
、GUI 配置文件idagui.cfg
以及文本模式用户界面配置文件idatui.cfg
idc:idc 目录包含 IDA 的内置脚本语言 IDC 所需的核心文件
ids:ids 目录中包含一些符号文件(IDA语法中的IDS文件),这些文件用于描述可被加载到 IDA 的二进制文件引用的共享库的内容。这些 IDS 文件包含摘要信息,其中列出了由某一个指定库导出的所有项目。这些项目包含描述某个函数所需的参数类型和数量的信息、函数的返回类型以及该函数的调用约定有关的信息。
loaders:loaders 目录包含文件加载过程中用于识别和解析 PE 或 ELF 等已知文件格式的 IDA 扩展
plugins:plugins 目录包含专门为 IDA 提供附加功能(多数情况下由用户定义)的 IDA 模块
proces:proces 目录包含已安装的 IDA 版本所支持的处理器模块。处理器模块为 IDA 提供机器语言——汇编语言的转换功能,并负责生成在 IDA 用户界面中显示的汇编语言
sig:sig 目录包含 IDA 在各种模式匹配操作中利用的现有代码的签名。通过模式匹配,IDA 能够将代码序列确定为已知的库代码,从而节省大量的时间。
til:til 目录包含一些类型库信息,IDA 通过这些信息记录特定于各种编译器库的数据结构的布局
IDA 入门
打开文件
启动 IDA 可以看到 IDA 的欢迎界面,在欢迎界面中有三个选项 “New”、”Go”,”Previous”
New(新建):选择要分析的文件并打开 IDA 文件分析选项框
Go(运行):终止 IDA 加载过程,打开一个空白的工作区。
Previous(上一个):使用 Previous 按钮可以打开其下 “最近使用过的文件” 列表中的第一个文件
选择 “New” 选择 crackme.exe 程序
打开新文件时,看到如下图所示的加载框。IDA 会生成一个可能的文件类型列表,并在对话框顶部显示这个列表
这里用的是破解版的无需更新,把所有的勾都取消掉
打开文件后出现如界面
打开文件后,在分析文件的同目录下会生成多个文件,这些文件是 IDA 创建的为 Crackme.exe 数据库组件文件。里面存储了 Crackme.exe 程序的所有分析数据,当第二次逆向 Crackme.exe 时只需要再打开 Crackme.exe 的数据库就可以接着上一次继续分析程序。数据库组件文件如下图所示:
关闭文件
当关闭分析文件(数据库) 、关闭 IDA 、切换分析文件(数据库)时,IDA 都将显示一个 Save database(保存数据库)对话框,如下图所示:
Don’t pack database(不打包数据库):在关闭文件后不创建 IDB 文件(打包数据库文件),不建议使用这个选项
Pack database(Store)[打包数据库(存储)]:选择 Store 选项会将数据库组件存到一个 IDB 文件中。之前的 IDB 文件会被覆盖。创建 IDB 文件后,数据库组件文件会被删除。
Pack database(Deflate)[打包数据库(压缩)]:等同于 Store 选项,差别在于会把数据库组件文件压缩到 IDB 文件中
Collect garbage(收集垃圾):IDA 会在关闭数据库之前,从数据库中删除任何没有用的内存页面。
Don’t save the database(不保存数据库):用于放弃对数据库所做的更改,IDA 会删除数据库组件文件,保留现有的未经修改的 IDB 文件。
选择 Store 选项,打包数据库文件,可以看到此时的组件文件被打包成 idb 文件
判断文件位数
32 位的程序,只能用 IDA(32)打开,所以在分析程序前需要先判断程序时多少位的。这里使用 010 Editor
十六进制编辑器,来判断程序程序的位数。
打开文件后在 PE
这个单词后面有 PE..L
,这就表示这个文件时 32 位的。如下图所示:
如果 PE
单词后面是 PE..†
,这就表示这个文件是 64 位的。如下图所示:
IDA 窗口介绍
大概介绍各个窗口的功能和作用。
导航条
- 蓝色:表示常规指令函数
- 黑色:节与节之间的间隙
- 银白色:数据内容
- 粉色:表示外部导入符号
- 暗黄色:表示 ida未识别的内容
函数窗口
用于列举 IDA 在数据库中识别的每一个函数。
双击 Function 窗口中的每一个条目,反汇编窗口将跳转到选定函数所在的位置(反汇编窗口会自动打开)
IDA 主界面
- IDA VIew:三种汇编视图。文本视图、图形视图、路径视图
- Hex View:十六进制窗口
- Imports:导入函数窗口
- Struceures:结构体窗口
- Exports:导出函数窗口
- Enums:枚举窗口
- Strings:字符串窗口
图形视图
我们重新打开 IDA 并选择 Previous 加载上一个 idb 文件,后面选择 “Loading exiting” 继续加载文件
当打开程序后,我们在主界面会看到 IDA 图形视图。图形视图类似于程序流程图,将一个程序分解成许多基本块,生动显示该函数由一个块到另一个块的控制流程,让分析人员快速了解一个程序的执行流程。
IDA 使用不同的颜色箭头区分函数块之间各种类型的流,根据测试条件会生成两种流:Yes 是绿色箭头(执行分支),No 是红色箭头(不执行分支)。只有一个后继块的基本块会利用一个正常的边(蓝色)指向下一个即将执行的块。
操作:
1 | Ctrl+滚轮:放大缩小流程图 |
路径视图
右击 “基本块” —> “Proximity browser” 进入路径视图
文本视图
在图形界面中按 “空格” 进入文本视图。面向文本的反汇编窗口是查看和操作 IDA 生成的反汇编代码的传统界面。
虚拟地址格式:[区域名称]:[虚拟地址]
左侧箭头窗口:实线表示非条件跳转;虚线表示条件跳转。如果某一个跳转在执行之前是加粗的实线或虚线,表示这一块是循环指令
十六进制窗口
十六进制窗口是编辑窗口,修改汇编指令都是在十六进制窗口操作。
例如,将下图的 jz
指令,改成 0000
指令:
- 先在汇编窗口,左击选择要修改的指令或数据
- 再进入十六进制窗口(IDA会自动把一条汇编指令的二进制数据组合在一起高亮显示)
- 通过 “F2” 编辑指令,然后输入数据”0000”,最后再同意修改。
导入函数窗口
在代码分析或编程中经常会遇到输入函数(Import Functions,或称导入函数)。导入函数就是被程序调用但其执行代码不在程序中的函数,这些函数代码位于相关的 DLL 文件中,在调用者程序中只保留相关的函数信息,例如函数名、DLL 文件名等。
结构体窗口
结构体窗口用于显示 IDA 决定在一个二进制文件中使用的任何复杂的数据结构(如C结构体和联合)的布局。在分析阶段,IDA会查询它的函数类型签名扩展库,设法将函数的参数类型与程序使用的内存匹配起来。
结构体窗口的两个主要用途包括:
- 为标准数据结构的布局提供现成的参考
- 为你提供一种方法,在你发现程序使用的自定义数据结构时,帮助你创建自己的、可用作内存布局模板的数据结构
导出函数窗口
在 DLL 中有一张导出表,其中有一系列函数,这些函数叫做导出函数。这些函数可供外部程序调用,即这些函数都是该 DLL 的进入点(entry point,类似普通程序中的 main 函数)。不在导出表中的函数,为该 DLL 私有的函数,外部程序不能调用它们。
导出窗口列出文件的入口点。这包括程序的执行入口点(在程序的文件头部分指定),以及任何由文件导出给其他文件使用的函数和变量,对于 exe 来说,至少有一个导出函数,程序的执行入口点。IDA将这个入口点取名为 start
枚举窗口
枚举窗口有点类似于结构体窗口。如果IDA检测到标准枚举数据类型(C enum),它将在枚举窗口中列出该数据类型。
字符串窗口
Strings窗口中显示的是从二进制文件中提取出的一组字符串,以及每个字符串所在的地址,双击Strings窗口中的任何字符串,反汇编窗口将跳转到该字符串所在的地址
reference
- 本文标题:从零开始IDA-基础知识
- 本文作者:9unk
- 创建时间:2021-02-24 15:26:28
- 本文链接:https://9unkk.github.io/2021/02/24/cong-ling-kai-shi-ida-ji-chu-zhi-shi/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!