IDApro 权威指南

本文最后更新于:7 小时前

Part 1 IDA简介

第1章 反汇编简介

一、编程语言

  1. 机器语言/字节码——二进制文件
  2. 汇编语言
  3. C/Java——通过编译器转换为汇编等
  4. 本书不讨论

二、反汇编

  1. 难点:编译损失,多对多操作,依赖语言和库

  2. 需求:分析恶意软件,闭源软件漏洞和互操作性(多平台支持),优化或验证编译器,显示调试信息

  3. x86汇编语法:

1
2
3
# AT&T语法——GNU(gcc,gdb)
add $0x4,%eax # 左:源操作数,右:目的操作数,%寄存器,$文字常量(立即操作数)
add eax,0x4 # Intel语法——MASM

4. 反汇编算法

(1)线性扫描反汇编——gdb,WinDbg,objdump

从一个代码段第一个字节开始逐条反汇编

  • 优点:完全覆盖所有代码段
  • 缺点:无法区分嵌入的数据与代码区
  • 适合由长度固定的指令构成的指令集(如MIPS)

(2)递归下降反汇编

① 顺序流指令:线性扫描

② 条件分支指令(如jnz):条件为假——线性,为真——搁置

③ 无条件分支指令(如jmp):静态无法确定如jmp eax类目标

④ 函数调用指令:紧跟调用后的线性,目标地址——推迟

⑤ 返回指令(如ret):处理搁置地址

  • 优点:可区分代码与数据

  • 缺点:无法处理目标地址的跳转或调用(可通过指针处理)

第2章 逆向与反汇编工具

一、Windows系统

1. Cygwin环境环境

提供Linux风格的shell和相关程序,包括编译器(gcc、g++),解释器(Perl、Python、Ruby),网络实用工具(nc、ssh),下文的obdump等

2. PE Tools

分析活动进程,何种编译器构建,模糊处理工具,PE文件头

3. PEID

识别编译器和模糊工具

4. dumpbin

1
dumpbin /dependents example.exe

VS套件中命令行工具,显示Win程序的动态依赖关系(如.dll等)

二、Linux系统

1. file命令

1
file 文件名

通过幻数(特殊标签值)确定文件类型,识别链接方式及是否去除符号等信息

幻数:

  • java的.class文件 0xcafebabe
  • MS-DOS MZ

去除二进制可执行文件的符号:

  • 编译过程会留下符号用于链接过程中解析文件之间的引用关系,完成后可删除(strip工具/构建时传给链接器的选项)

2. nm命令

1
2
gcc -c example.c
nm example.o

检查中间目标文件(.o文件),输出文件中声明的任何函数和全局变量的名称。

3. ldd命令

**静态链接:**将目标文件和所需文件结合

  • 优点:函数调用快,发布容易
  • 缺点:文件大,库改变——重新连接——升级困难,逆向工程分析复杂

**动态链接:**将所需库的引用插入可执行文件

  • 优点:文件小,升级容易
  • 缺点:加载慢,发布繁琐
1
2
3
gcc -o example_dynamic example.c
gcc -o example_static example.c --static
ldd 文件位置

ldd确定依赖的动态库,以下方法可实现类似功能

  • OS X系统上otool -L 文件名
  • Win系统VS套件中dumpbin /dependents 文件名

4. objdump命令

可显示节头部,专用头部(包括ldd等工具生成的),调试信息,符号信息(类似nm),反汇编死代码清单(难以有效导航和修改),依靠libbfd,可解析ELF、PE等

  • readelf也可用于解析ELF文件,不依赖libbfd

5. otool命令

1
2
file 文件名
otool -L 文件名

解析与OS X Math-O二进制文件有关的信息(类似objdump的功能)

暂未接触过该类二进制文件

6. c++filt

重载函数需名称改编以区分不同重载版本,编译器设计人员自行制定标准

1
2
3
g++ -o example example.cpp
nm example | grep demo # 显示demo的重载版本
nm example | grep demo | c++filt # 得到原始名称

c++filt设法确定用于生成该名称的编译器并输出原始名称,无法识别时原样输出

  • 改编名称包含的额外信息可能含有与类名称或函数调用约定有关的信息

7. strings

字符串指至少包含4个连续可打印ASCII字符,搜索不受文件结构限制,包含函数名、库名称、程序输出等

1
strings 文件名

strings工具用于提取文件中的字符串内容(默认至少包含4个字符的7位ASCII序列)

  • strings仅扫描可加载的,经初始化的部分,strings -a example强制扫描整个文件
  • strings -t example显示偏移量信息(即在文件中的位置)
  • strings -e example可搜索16位Unicode字符

三、流式反汇编器

ndisasm和diStorm用于x86指令集的流式反汇编器,可用于分析网络数据包中可能包含的shellcode攻击和不包含布局参考的ROM镜像(部分数据、部分代码)

第3章 IDA Pro 背景知识

  • 递归下降反汇编器
  • MS-DOS应用程序
  • 可在Windows的GUI,Linux和OS X的控制台界面中使用

一、反盗版策略

  1. 带有与购买者一对一的水印
  2. 实施许可策略:某IDA启动后在23945端口广播UDP包,比较同子网得到的相应数量与许可用户数量
  3. 下发唯一ida.key文件
  • 该许可证赋予用户对IDA进行逆向工程的权利

二、 IDA版本

  • IDAPython需注意匹配的Pyhton版本
  • 分别支持32位和64位代码的反汇编,但IDA本身为32位,插件需安装32位的

三、 IDA目录结构

  1. cfg:包含IDA和GUI配置文件
  2. idc:包含内置脚本语言IDC的核心文件
  3. ids:用于描述摘要信息,某函数参数类型,调用约定等信息
  4. loaders:包含在文件加载过程中用于识别和解析已知文件格式的扩展
  5. plugins:提供附加功能的插件
  6. procs:处理器模块(机器语言——汇编语言)
  7. sig:包含现有代码签名,通过模式匹配节省分析时间
  8. til:记录各种编译器库的数据结构和布局

Part 2 IDA基本用法

第4章 IDA入门

一、启动IDA

  • 欢迎信息不展示取消选中底部Kisplay at startup即可,编辑注册表项HKEY_CURRENT_USER\Sofrware\Hex-Rays\IDA中DisplayWelcome值为1可复原,或选择Windows→Reset hidden message显示所有隐藏信息
  • Previous(上一个)。最近文件包含IDA的Windows注册表项的History子项的值(默认为10),可编辑idagui.cfg或idatui.cfg更改

1. 文件加载

  • 可使用Edit→Segments→Rebase Program命令来修改IDA景象的基址
  • 二进制文件需在Loading Segment和loading Offset字段中指定基址信息创建RAM块,ROM块

二、IDA数据文件

  1. IDA将可执行文件加载到内存中分析时,会创建一个数据库(IDB文件),有以下四个组件:

(1) .id0:二叉树形式的数据库

(2) .id1:描述每个程序字节的标记

(3) .nam:Names窗口显示的给定程序位置有关的索引信息

(4) .til:存储给定数据库的本地类型定义信息

  1. 加载器警告

(1) 加载PE文件时发现程序数据库(PDB)文件,询问是否定位并处理

(2) 遇到模糊程序时,若导入表没有根据约定进行格式化,提示该文件可能被压缩或经过修改,如果希望看到原始导入文件需取消选择make imports section并重新加载

  1. IDA本质是数据库应用程序,以有利于逆向工程的格式显示各种数据库视图,修改并不访问或影响可执行文件本身

  2. 创建IDA数据库

(1) 加载器模块:加载,解析文件头,创建程序块,确定入口点

(2) 反汇编引擎:一次传一个地址给处理器

(3) 处理器模块:确定指令类型、长度,继续执行位置,完成后二次遍历并转换成汇编显示

(4) 额外分析提取信息:编译器识别,函数参数和局部变量识别,数据类型信息

  1. 关闭IDA数据库

Collect garbage:删除数据库中没用的内存页面,若同时选中Deflate(压缩)会创建尽可能小的IDB文件

三、 IDA桌面简介

工具栏区域、概况导航栏(导航带)、数据显示窗口标签、反汇编视图、图形视图、输出窗口、函数窗口

IDA桌面

四、桌面行为、提示和技巧

1. 提示

(1) You may start to explore the input file right now. 可以开始浏览各种数据显示窗口

(2) The initial autoanalysis has been finished. 可以对数据库进行任意修改

2. 技巧

(1) View → Open Subviews恢复无意中关闭的数据显示窗口

(2) Windows → Reset Desktop将桌面恢复到原始布局

(3) Windows → Save Subviews保存有用的当前桌面布局,

Windows → Load Desktop打开之前保存的桌面布局

(4) Options → Font设置Disassembly窗口(唯一可修改显示字体的窗口)字体

第5章 IDA数据显示窗口

一、IDA主要的数据显示窗口

1. 反汇编窗口

  • Options → General 打开IDA Options复选框,是否选中Use graph view by default选项决定默认视图
(1) 图形视图

① 流(箭头)

绿色——默认跳转 红色——不执行 蓝色——指向下一个即将执行的块(唯一)

② 块位置(详见P49,P50/第9章)

可平移定位,调整位置,分组和折叠,修改行前缀显示

(2)文本视图

IDA文本视图

2. 函数窗口

二、 次要显示窗口

1. 十六进制窗口

右键菜单:

Edit变为十六进制编辑器

Data Format选择显示格式

Columns更改显示的列数

Text打开或关闭文本块

Synchronize with → IDA View-X设置十六进制窗口与反汇编窗口同步

  • 显示问号表示无法识别给定的虚拟地址范围内的值——bss节(用于保存程序的所有未初始化的静态变量),不占用文件空间。但加载器分配初值为零的空间以便静态存储

2. 导出窗口

  • start——程序入口点

3. 导入窗口

4. 结构体窗口

  • 蓝色为IDA判断的已知数据类型

用途:为标准数据结构的布局提供现成参考,创建自定义数据结构

三、其它显示窗口

1. Strings窗口

配置Setup Strings:

  • Windows——Unicode字符串 Borland Delphi二进制文件——2个字节长的Pascal字符串

① 仅显示已定义或用户已命名的字符串

② 扫描错误转换成指令的字符串或数据中非字符串格式(如字节数组或整数)的字符串,可能生成许多垃圾字符串(由5个或更多ASCII字符构成的),效果类似strings -a,但可确保无遗漏

2. Names窗口

编码方案:

F:常规函数

L:

————————————————未完待续————————————————


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!