一.入门
1.软件介绍
Ollydbg 仅仅是运行于 Windows 用户模式下的一种 32 位调试器,而 IDA 是运行于 32/64 位下,可用 作反编译和调试的一个完整的逆向工具。使用 IDA 尽管是个更加复杂的学习过程,但它提供了 Ollydbg 无法实现的静态逆向分析手段,并且支持跨平台。 IDA 全称是交互式反汇编器,人们其简称为 IDA。IDA pro 是业界最成熟、先进的反汇编工具之一,是 目前最棒的一个静态反编译软件,是众多 0day 世界的成员和 ShellCode 安全分析人士不可缺少的利 器。 IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,可利用 Windows、Linux 或 MacOS 平 台主机来分析程序,被公认为最好的花钱可以买到的逆向工程利器。它支持数多种 CPU 指令集其中包 括 Intel x86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。 IDA 是总部位于比利时列日市(Liège)的 Hex-Rays 公司的一款产品。开发 IDA 的是一位编程天才, 名叫 Ilfak Guilfanov。

IDA 的图标上的女性名为阿达·奥古斯塔,她是19世纪诗人拜伦的女儿,数学家。穿孔机程序创始人, 建立了循环和子程序概念。为计算程序拟定“算法”,写作的第一份“程序设计流程图”,被珍视为“第一 个给计算机写程序的人”

IDA Pro 的主要优点是它允许以交互方式更改显示数据的任何元素:
1.给函数、变量、数据结构等命名
2.更改数据表示(如数字、各种编码的字符串、数据结构)
3.搭建图表和代码流程图,简化对反汇编代码的理解
4.使用 C++ 中有关函数参数和结构定义的类型信息,以便自动命名参数和变量
5.自动识别和命名汇编代码中的标准库函数
2.静态分析基础
(1) 目录结构
在IDA的安装根目录下有许多文件夹,各个文件夹存储不同的内容:
cfg:包含各种配置文件,基本IDA配置文件 ida.cfg,GUI 配置文件 idagui.cfg 等
dbgsrv:包含多架构远程调试服务端可执行文件
idc:包含 IDA 内置脚本语言 IDC 所需要的核心文件
ids:包含一些符号文件
loaders:包含用于识别和解析PE或者ELF
plugins:附加的插件模块
procs:包含处理器模块
(2) 文件加载
根据程序是 32/64 位,选择运行 ida.exe 或 ida64.exe。 可以在菜单栏中选择 File -> Open 来打开目标二进制文件:

也可以将要分析的二进制文件拖到 IDA 图标上或工作窗口中。 IDA 一般会自动识别二进制文件的架构类型,在下面的窗口中直接点击 OK 即可。

(3) 主界面介绍
当 IDA 加载完毕(左下角为 idle 状态)后,会进入如下的工作界面:

A. 导航带
概况导航栏,也叫作导航带,光标悬停在导航带任何位置会指出其在二进制文件中的位置。 Options -> Color 可以修改导航栏的颜色。

B. 函数窗口
主界面左侧是函数窗口,可以在此处获取一些函数的基本信息。 双击某个函数会跳转到其起始位置。

C. 反汇编窗口
主界面右侧是核心工作区域,其中堆叠了数个十分有用的窗口。名字为 IDA View 的是反汇编窗口:

从左到右依次为 段名:地址、 机器码、 反汇编代码。
在此界面按空格 (space) 键可以将线性视图切换为 CFG,展示该函数的控制流程图。

D. 伪代码窗口
在反汇编窗口中按下 F5 快捷键,IDA 会打开一个新窗口,并显示该函数的伪 C 代码:

(这里生成伪代码仅供参考,并不一定正常)
E. 输出窗口
在 IDA 界面底部有一个交互栏可以执行 Python 命令,能够帮助我们快速进行进制转换、执行 IDAPython 语句。
该窗口有时也会输出一些有用的中间信息或报错信息,可以适当关注。

F. 字符串窗口
快捷键 Shift+F12 可以打开字符串窗口,展示程序中存在的可见字符串.

G. 结构体窗口
在结构体窗口中,你可以新建、编辑和修改结构体。

另一个结构体窗口是 Local Types 窗口,可以在 View -> Open subviews 中找到。
(4) 基础操作
A. 窗口同步
在核心工作区任一窗口中右键,悬停在 Synchronize with 上,选择想与之同步的另一窗口。

B. 交叉引用
不管是数据、函数参数还是局部变量都可以通过 X 键查找其在何处被引用了。这个功能可以狠狠提高 逆向效率!

C. 地址跳转
按 G 可以跳转到任意地址,一般在反汇编窗口或内存查看窗口(动态调试)中使用。
D. 书写注释
在伪代码窗口任意一行按下 / 键,即可输入或修改注释。 在反编译窗口任意一条汇编语句上按下 ; 键,也可以输入或修改注释。
E. 修改符号名
光标放在某个变量或函数名上按 N 键可以修改其名字。
F. 数据类型操作
IDA 开发了一套类型分析系统,用来处理各种数据类型(函数声明、变量声明、结构体声明等),并且允许用户自由指定。 选中变量、函数后按 Y 键,弹出 “Please enter the type declaration” 对话框,从中输入正确的 C 语言 类型,IDA 就可以解析并自动应用这个类型。

G. 修改数据长度
在同一个地址处多次按下 D 键,可以让数据在 1、2、4、8 字节长度间转换。
H. 函数操作
定义函数:在反汇编窗口选中对应行后,按P键
删除函数:函数窗口中选中函数后,按Delete键,或光标放在函数头按 U
修改函数范围:在函数窗口中选中并按 Ctrl+E组合键,或在反汇编窗口的函数内部按 Alt+P 组合键
I. 代码和数据的转换
U 键:取消一个地方已有的数据
D 键:让某一个位置变成数据
C 键:让某一个位置变成指令
A 键:会以该位置为起点定义一个以 \0 结尾的字符串类型
O 键:将此处定义为一个地址偏移
J. 创建数组
按 * 键将光标处定义为一个数组,可以修改数组长度、修改显示形式等。

K. 创建结构体
我们一般更倾向于按 Shift+F1 打开 在 Local Types 窗口中按下 Local Types 窗口,在这里用 C 代码的形式定义结构体。 Insert 按键,并输入结构体的定义,即可在伪代码窗口中使用。

L. 提取数据
先选出需要提取的选取,按下 Shift+E 键,并选择合适的格式导出。

M. 函数调用图
选择 View -> Graphs -> Function calls,打开函数调用图窗口。

可以看到所有函数的调用关系。

N. 常数搜索
按下 Alt+I 打开搜索窗口,输入欲搜索的数值,勾选 Find all occurrences,需要时也可以勾选 上 Search Up,点击 OK 会展示所有找到的条目。

O. 字节数组搜索
按下 Alt+B 打开搜索窗口,输入欲搜索的字节数组(16 进制形式),勾选 occurrences,需要时也可以勾选上 Find all Search Up,点击 OK 会展示所有找到的条目。

P. Patch
将光标放在需要 patch 的位置,选择 Edit -> Patch program -> Change byte。

修改完成后,如果需要永久 Patch,可以选择 Edit -> Patch program -> Apply patches to input file。

Q. 关闭项目
在关闭 IDA 前,会弹出一个窗口:

Don’t pack database:仅刷新4个数据库,不创建 idb 文件
Pack database (Store):将4个数据库组件文件存到 idb 文件中
Pack database (Deflate):等同于上一个,压缩到 idb 归档
Collect garbage:在关闭数据库之前,删除没有的内存页面
Don’t save the database:删除四个数据库组件文件,保留现有未经修改idb文件
3.动态调试基础
有时候程序在运行过程中会生成一些关键的数值,而人力通过静态分析的结果模拟程序的运行来推出 这些中间的数值可能很麻烦。简单重复的工作是计算机所擅长的而不是人,所以我们可以让这个程序 运行起来,得到这些中间过程的数值。这就是动态调试。
(1) 开始调试
选择 Debugger -> Select debugger,选择合适的调试器:
如果是 exe,可以使用 Local Windows Debugger
如果是 ELF, 则选择 Remote Linux Debugger
配置调试参数(可选)。
选择 Debuugger -> Start Process 或者按 F9开始调试
IDA 会显示一个警告,选择 Yes 即可。
(2) 调试界面介绍

(3) 常用快捷键
继续运行:F9
单步步入:F7
单步步过:F8
执行到返回:Ctrl + F7
执行到光标处:F4
添加、删除断点:F2
(4) 断点调试
A. 软件断点
直接在反汇编窗口或伪代码窗口中下的断点默认都是软件断点。


下了断点的行背景色将变为红色。
软件断点可以下很多个,没有数量限制。
B. 硬件断点
下了软件断点后,我们可以按 Ctrl+Alt+B 打开断点列表,这里会列出所有断点的信息:

选中一个按 Ctrl+E 进行编辑:

这里我们勾选上 Hardware,再根据需求设置硬件断点的类型(读/写/执行),即可将软件断点转换为 硬件断点。

由于 x86 架构下硬件断点最多下 4 个(DR0 – DR3),所以要省着点用。
C. 条件断点
还是在这个界面,如果在 Condition 输入框中输入一些条件,当条件满足时,断点才会断下。

(5) 内存数据提取
可以像静态分析部分一样,先选中要导出的区域,再通过 Shift+E 导出。
也可以通过 IDAPython 脚本,借助 get_bytes、get_wide_word 等 API来提取关键数据。
(6) 数据修改
A. 寄存器
断点断下来后直接双击对应寄存器即可修改其值。

B. 内存
在内存查看窗口里按下 F2 进入编辑模式,修改完成后再按一次 F2 应用编辑。 也可以通过 IDAPython 脚本,借助 patch_byte、patch_dword 等 API来修改内存数据。
(7) 配置命令行参数
选择了调试器之后,打开 Debugger -> Process options,在 Parameters 一栏写入命令行参数即可。

(8) Linux 远程调试
- IDA 安装目录\dbgsrv\linux_server(_64) 复制到虚拟机 (根据所调试进程的字长来决定 linux_server 的位数) 并添加可执行权限
- 题目附件拷贝到虚拟机并添加可执行权限
- 在主机能 ping 通虚拟机的情况下,在 IDA 中进行 debug 配置
- 调试器类型选择为 Remote Linux debugger
- 点击 Debuuger -> Proccess options ,在弹出对话框中配置远程信息 (虚拟机 ip 通过 ifconfig 命 令查看)


- 下断点,开始调试

注:如果需要后续交互,在虚拟机中运行 linux_server 的终端中进行
Q:如何在调试开启后找到 main 函数
A:打开 functions 窗口,在其中找到 main 函数,双击过去 F5 反编译即可

4.常用插件
Findcrypt
Keypatch
LazyIDA
Finger
ScyllaHide
BinDiff
评论(0)
暂无评论