boxmoe_header_banner_img

欢迎来到烨的世界~

加载中

文章导读

IDA复习


avatar
liuye 2025年6月5日 76

一.入门

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 就可以解析并自动应用这个类型。

image-20250605163508702

G. 修改数据长度

在同一个地址处多次按下 D 键,可以让数据在 1、2、4、8 字节长度间转换。

H. 函数操作

定义函数:在反汇编窗口选中对应行后,按P键

删除函数:函数窗口中选中函数后,按Delete键,或光标放在函数头按 U

修改函数范围:在函数窗口中选中并按 Ctrl+E组合键,或在反汇编窗口的函数内部按 Alt+P 组合键

I. 代码和数据的转换

U 键:取消一个地方已有的数据

D 键:让某一个位置变成数据

C 键:让某一个位置变成指令

A 键:会以该位置为起点定义一个以 \0 结尾的字符串类型

O 键:将此处定义为一个地址偏移

J. 创建数组

按 * 键将光标处定义为一个数组,可以修改数组长度、修改显示形式等。

image-20250605200422622

K. 创建结构体

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

image-20250605200444602

L. 提取数据

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

image-20250605200540385

M. 函数调用图

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

image-20250605200600540

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

image-20250605200620985

N. 常数搜索

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

image-20250605200638454

O. 字节数组搜索

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

image-20250605200656511

P. Patch

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

image-20250605200728046

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

image-20250605200743955

Q. 关闭项目

在关闭 IDA 前,会弹出一个窗口:

image-20250605200802675

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) 调试界面介绍

image-20250605201057560

(3) 常用快捷键

继续运行:F9

单步步入:F7

单步步过:F8

执行到返回:Ctrl + F7

执行到光标处:F4

添加、删除断点:F2

(4) 断点调试

A. 软件断点

直接在反汇编窗口或伪代码窗口中下的断点默认都是软件断点。

image-20250605201210495
image-20250605201220673

下了断点的行背景色将变为红色。

软件断点可以下很多个,没有数量限制。

B. 硬件断点

下了软件断点后,我们可以按 Ctrl+Alt+B 打开断点列表,这里会列出所有断点的信息:

image-20250605201253147

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

image-20250605201314427

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

image-20250605201330761

由于 x86 架构下硬件断点最多下 4 个(DR0 – DR3),所以要省着点用。

C. 条件断点

还是在这个界面,如果在 Condition 输入框中输入一些条件,当条件满足时,断点才会断下。

image-20250605201401508

(5) 内存数据提取

可以像静态分析部分一样,先选中要导出的区域,再通过 Shift+E 导出。

也可以通过 IDAPython 脚本,借助 get_bytes、get_wide_word 等 API来提取关键数据。

(6) 数据修改

A. 寄存器

断点断下来后直接双击对应寄存器即可修改其值。

image-20250605201448876

B. 内存

在内存查看窗口里按下 F2 进入编辑模式,修改完成后再按一次 F2 应用编辑。 也可以通过 IDAPython 脚本,借助 patch_byte、patch_dword 等 API来修改内存数据。

(7) 配置命令行参数

选择了调试器之后,打开 Debugger -> Process options,在 Parameters 一栏写入命令行参数即可。

image-20250605201518361

(8) Linux 远程调试

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

注:如果需要后续交互,在虚拟机中运行 linux_server 的终端中进行

Q:如何在调试开启后找到 main 函数

A:打开 functions 窗口,在其中找到 main 函数,双击过去 F5 反编译即可

image-20250605201730041

4.常用插件

Findcrypt

Keypatch

LazyIDA

Finger

ScyllaHide

BinDiff



评论(0)

查看评论列表

暂无评论


发表评论