GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

软件神器 --- 反编译之王 ida pro

dc2e38ad3feb5f9389816a2450a0fcb1

 

IDA是目前最强的反编译器,支持海量的指令集的反编译、反汇编和动态调试功能。

这是一个免费加收费软件。

如果你要分析32位程序就要用ida32打开,64用ida64

只有x86支持f5的c反编译功能,且反编译效果差。

 

有时我们只要的是反汇编后的结果,这时可以选择导出按钮都出的内容不全,我建议使用ctrlh+shift按住鼠标选中所有代码复制。

 

静态分析:

第一次打开时选择go直接打开软件,将你要分析的文件拖入ida,

首先会自动识别如何解析这个文件,我们只要点击确认即可

首次分析会以流程图的方式展示,这个功能只能看看,实际不常用,按下空格关闭流程图。

左侧是函数,右侧是反汇编结果,双击函数跳转对应汇编。粉红色意思是导入函数。在反汇编里函数所在的文件段是text

image

 我们先总体预览一下大致的所有的文件段,然后查看多所有的字符串。了解基本逻辑。

image

 

接下来我们正式分析函数。

打开导出页签,找到对外暴露的接口。这些是我们要重点分析的函数。

这里的函数分为三种类型,用户自己编写的函数比如mian函数,导入函数比如strlen函数,还有一种特殊的编译器辅助函数(包含异常处理函数,入口初始化函数)

按f5查看反编译结果

在新版ida中不要在导入自定义的头文件比如jni.h,就可以自动识别。我们找到要修改的反编译代码输入,比如v5,我们右键设置,类型,改变类型输入 JNIEnv *,之后会将这个指针对应的虚函数自动解析对应的函数比如newutf函数,而不是显示没有意义的v5+255这样的。

我们开始分析一个函数前先要了解它有多少次调用外部函数,在arm下就是有多少个BL指令,这是这个函数的关键所在

如果这个函数相当的复杂,我们可以将函数的汇编和反汇编代码提交给ai比如gemini或claude。解析可读性强的反编译c伪代码。

我们保存伪代码方便下一次分析。

 

 

动态调试安卓S0
条件;
手机首先要获得root权限,电脑要配置好adb环境,。手机在开发者模式中打开USB调试,然后用数据线把手机连接到电脑。
安装打开目标APP 。打开ddms,https://wwzb.lanzouw.com/ihpHY33i6bsf

这里我不使用ddms监控app因为安装太麻烦,直接使用命令查看pid,查看该目标软件的PID


1. 手机端调试服务部署
adb shell su
cd /data/local/tmp
adb push "D:\Program Files (x86)\IDA Pro_v7.5 Portable\dbgsrv\android_server" /data/local/tmp #因为我们这次调试的app的so是32为的所以我们选择android_server文件
chmod 777 android_server # 赋予执行权限
./android_server # 启动调试服务
adb forward tcp:23946 tcp:23946 这条命令是将手机监听的端口通过usb转发到电脑的这个端口上来 默认监听端口:23946
至此手机调试环境搭建完成

我们调试启动我们的app
adb shell am start -D -n com.droider.debugjniso/com.droider.debugjniso.DebugjnisoActivity 注意这里的app中有个文件androidmanifest.xml必须有可调式的配置例如 <application android:debuggable="true"> 。然后ddms里对应app前会出现红色昆虫。此时手机app启动调试模式等待被调试。

4. IDA Pro调试环境配置
用IDA打开目标.so文件,在关键函数(如JNI_OnLoad/目标函数)按F2下断点

调试器设置
在IDA里面选择
Debugge---Debugger options
选择第一列的3、4、5 (进程/线程/DLL事件暂停,这里我只选择入口暂停) 再Edit exceptions 全选删除异常。
Debugger → Process options:
填上hostname 127.0.0.1 Port: 23946 点OK即可
至此电脑调试环境搭建完成

附加进程
最后Debugger → Attach to process
选择目标包名进程

5. 恢复APP执行

打开ddms查看调试端口号

image

 如果没有ddms也可以自己打开调试端口命令如下

adb shell pidof -s com.droider.debugjniso

adb forward tcp:8889 jdwp:31576     这里的31576是上一个的pid

 

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8889  调试端口号。红色变为绿色,同时手机上的提示框会消失。 此时手机app启动调试模式正在被调试。
如果命令框没有输出信息,就在IDA里面点运行。同时命令行出现提示,如果没有出现需要重新执行监听端口的第五步。

image

 此时一个app会黑屏,同时手机上的提示框会消失。

 

6. 触发调试断点

在手机上操作APP(如点击"设置标题"按钮)
IDA会自动暂停在断点处

或者

一直F9,点击same,在F9直到断点

按F8单步调式


使用调试控制栏:
F7:单步进入
F8:单步跳过
F9:继续执行
Ctrl+F2:终止调试

 


关键问题解决方案
❗ 断点无法触发
检查点:

确认SO加载地址:Ctrl+S查看模块基址是否匹配

重新计算断点:基址 + 偏移量(需与/proc/<pid>/maps中地址一致)

使用F9让进程运行后再触发操作

❗ jdb连接失败
bash
# 查找正确端口
adb jdwp | xargs -I {} adb forward tcp:8700 jdwp:{}
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
❗ 调试器中断
若IDA频繁暂停:

检查Debugger Options → Exceptions是否清空

取消勾选Suspend on unhandled exceptions

 

 F8单步调试无效

目前不知道问题, 但是重新选项调式选项,点击确定就会执行

 

如何修改二进制

我们在汇编视图找到我们要修改的地方点击,打开十六进制视图会自动定位到位置,我们右击编辑,输入十六进制,点击应用。注意此时没有改变,我们还要将应用保存。注意修改的不能比原来的字节多,否者会损坏其他汇编的偏移地址,导致程序无法运行。

image

 

 

 

快捷键

x  查看交叉引用的函数

空格    函数流程图

f5  反编译

 

IDA Pro(Interactive Disassembler Professional)是反汇编和逆向工程领域的标杆工具,功能极其强大且复杂。以下是其核心功能的详细分类列举:

🧠 一、 核心反汇编与分析功能

  1. 强大的反汇编引擎:

    • 支持海量处理器架构(x86, x86-64, ARM, ARM64, MIPS, PPC, SPARC, 68k, Z80, 6502, Java bytecode, .NET CIL, PIC, 8051, 8051 等及其变种)。

    • 将机器码精确转换为汇编语言指令。

    • 递归下降反汇编:智能跟踪代码执行流程(跳转、调用、返回),区分代码与数据。

    • 线性扫描反汇编:快速扫描整个二进制区域。

    • 混合模式:结合递归下降和线性扫描的优势。

  2. 交叉引用(Xrefs)分析:

    • 代码引用(Code Xrefs): 追踪函数调用(call)、跳转目标(jmpje 等)。

    • 数据引用(Data Xrefs): 追踪数据被访问的位置(读取、写入、地址引用)。

    • 提供"从哪里来"(Referenced from)和"去哪里"(References to)的完整视图。

    • 是理解程序结构和数据流的核心。

  3. 控制流图(CFG):

    • 将函数的指令块(基本块)及其之间的跳转关系可视化。

    • 直观展示函数内部的逻辑分支、循环结构。

    • 图形视图是其标志性功能,极大提升代码理解效率。

  4. 函数识别与分析:

    • 自动识别函数入口点(基于调用、跳转目标、函数开头模式)。

    • 分析函数边界、栈帧布局(栈指针操作)、局部变量、参数传递约定(__cdecl__stdcall__fastcall__thiscall 等)。

    • 函数调用图(Call Graph):展示函数之间的调用关系。

  5. 数据类型识别与重建:

    • 识别和定义标准数据类型(intcharfloatdoubleworddwordqwordptr 等)。

    • 定义和创建复杂数据结构(structunionenum)。

    • 将内存偏移解释为特定结构体的字段访问。

    • 重建高级语言中的数据结构(如 C 的结构体、联合体)。

  6. 变量识别与重命名:

    • 自动识别栈帧中的局部变量、函数参数。

    • 识别全局变量(.data.bss 等段)。

    • 允许用户对变量、函数、地址进行有意义的重命名(Symbol Renaming),极大提升可读性。

  7. 字符串分析:

    • 自动扫描并列出二进制中的所有字符串(ASCII, Unicode UTF-16/UTF-32, C-style, Pascal-style)。

    • 在反汇编视图中直接显示字符串内容。

    • 提供字符串的交叉引用。

  8. 注释系统:

    • 允许用户在任意地址添加行注释(Comment)或可重复使用的常规注释(Repeatable Comment)。

    • 记录分析思路、标注重要信息。

  9. 重定位分析:

    • 处理可重定位代码(如共享库 .so/.dll),解析导入/导出表。

    • 识别外部函数调用(Imports)和暴露的函数(Exports)。

🔍 二、 高级分析与自动化功能

  1. 强大的反编译器(Hex-Rays Decompiler 插件 - 需额外许可):

    • 将汇编代码转换为高级语言(主要是 C)的伪代码。

    • 极大提升分析效率和理解速度,尤其是复杂逻辑。

    • 伪代码视图与反汇编视图联动。

    • 在伪代码中也能进行重命名、添加注释、定义类型等操作。

  2. 模式识别与库函数识别(FLIRT/FLAIR):

    • 快速库识别与鉴定技术 (FLIRT): 使用签名(Signature)文件自动识别标准库函数(如 C/C++ 运行时库、Windows API、常见编译器生成的代码)。减少分析已知代码的时间。

    • FLAIR 工具: 允许用户创建自定义库的签名文件。

  3. 脚本与自动化:

    • IDC (IDAPython Compatible): 较旧的脚本语言(兼容性保留)。

    • IDAPython: 基于 Python 的强大脚本接口(强烈推荐)。允许用户编写脚本实现:

      • 自动化分析任务(批量重命名、查找特定模式、数据提取)。

      • 扩展功能(自定义处理器模块、加载器、插件)。

      • 与反汇编数据库深度交互。

    • 庞大的用户社区贡献了大量实用脚本。

  4. 插件系统:

    • 开放的插件架构(C++ 或 IDAPython)。

    • 允许开发者扩展 IDA 的核心功能(添加新视图、分析器、处理器支持、文件加载器、集成外部工具等)。

    • 存在大量功能强大的第三方插件(如用于漏洞挖掘、恶意软件分析、协议逆向等)。

  5. 污点分析(Taint Analysis): (通常需要插件或脚本)

    • 追踪特定数据(如用户输入)在程序执行过程中的传播路径。

    • 用于漏洞挖掘(如检测输入是否未经检查到达危险函数)。

  6. 符号执行(Symbolic Execution): (通常需要插件或脚本)

    • 探索程序所有可能的执行路径。

    • 用于高级漏洞挖掘、路径约束求解。

🧩 三、 调试与动态分析功能

  1. 集成调试器:

    • 本地调试: 调试运行在同一台机器上的程序(Windows, Linux, macOS)。

    • 远程调试: 通过调试服务器(win32_remotelinux_serverandroid_serverios_deploygdbserveridb 等)调试运行在其他设备(不同 OS、移动设备、嵌入式设备)上的程序。支持多种协议(GDB, WinDbg)。

    • 虚拟机调试: 集成调试运行在 Bochs 或 QEMU 虚拟机中的代码。

    • 内核调试: (通过 WinDbg 或特定插件) 调试 Windows/Linux 内核驱动。

    • 进程附加/创建: 启动新进程或附加到现有进程进行调试。

    • 断点: 软件断点、硬件断点、内存访问断点、条件断点。

    • 单步执行: 步入(Step Into)、步过(Step Over)、步出(Step Out)。

    • 执行控制: 运行、暂停、继续、重启。

    • 寄存器与内存视图: 实时查看和修改寄存器、内存内容。

    • 线程与模块视图: 查看当前进程的线程状态和加载的模块。

    • 堆栈跟踪: 查看函数调用栈。

    • 监视点: 监视变量或内存地址的值变化。

    • 反调试/反反调试: 提供处理常见反调试技术的功能。

🧰 四、 数据库管理与协作

  1. 数据库(IDB/ID0/ID1/NAM):

    • 将反汇编分析结果(代码、数据、注释、类型定义、重命名、结构等)保存为数据库文件(.idb 旧版 / .i64 64位新版 + 配套文件)。

    • 保存分析进度,方便后续继续工作。

    • 支持增量分析。

  2. 比较工具(IDAdiff / BinDiff 插件):

    • 比较两个不同版本或变种的二进制文件数据库。

    • 识别添加/删除的函数、代码块变化、修改的指令。

    • 用于补丁分析(Patch Analysis)、恶意软件变种比较。

  3. 协作功能 (CollabREate 插件等):

    • 允许多个用户同时或异步协作分析同一个二进制项目(共享数据库或变更)。

🖥 五、 用户界面与交互

  1. 多视图同步:

    • 提供多种视图(反汇编文本视图、图形视图、十六进制视图、导出视图、导入视图、结构体视图、枚举视图、函数窗口、字符串窗口、签名窗口等)。

    • 视图间联动:在一个视图中选择地址/名称,其他视图同步定位。

  2. 图形视图:

    • 以流程图形式可视化函数和控制流,是 IDA 的核心优势之一。

    • 可缩放、平移、自定义布局和颜色。

  3. 十六进制视图:

    • 直接查看文件的原始字节。

    • 与反汇编视图同步,可以在此定义数据、代码或创建未定义的字节。

  4. 强大的搜索功能:

    • 文本搜索(指令助记符、操作数)。

    • 二进制序列搜索(字节模式)。

    • 立即数搜索。

    • 正则表达式搜索(在字符串或反汇编文本中)。

    • 查找交叉引用。

    • 查找下一个/上一个指令、函数、数据项等。

  5. 导航与标记:

    • 历史记录导航(前进/后退)。

    • 书签系统:标记重要位置以便快速返回。

    • 跳转到地址、函数名、符号名。

  6. 主题与自定义:

    • 支持深色/浅色主题。

    • 高度可定制化的界面(布局、字体、颜色)。

🧾 六、 输入/输出与文件处理

  1. 文件加载器:

    • 支持加载多种可执行文件格式(PE, ELF, Mach-O, COFF, a.out, NE, LE, LX, DOS MZ)。

    • 支持加载原始二进制文件(Binary File),需用户指定基址和处理器架构。

    • 支持加载内存转储文件(Dump)。

    • 支持加载调试信息(PDB, DWARF, STABS)以恢复符号和类型信息(大大提升分析效率)。

  2. 修补(Patching):

    • 直接在反汇编或十六进制视图中修改二进制指令或数据。

    • 生成补丁文件(仅包含修改部分)或直接保存修改后的可执行文件。

    • 用于修改程序行为、绕过检查、打补丁测试。

🚧 七、 其他重要功能

  1. 处理器模块:

    • 定义新处理器架构的反汇编规则(通过 SDK 开发)。

    • 支持大量冷门或自定义架构。

  2. 文件加载器模块:

    • 定义对新文件格式的支持(通过 SDK 开发)。

  3. 版本与变体:

    • IDA Freeware (旧版 7.0): 免费但功能有限(无 64位反汇编、无调试器、无反编译器等)。

    • IDA Pro: 完整功能的商业版本。

    • IDA Home: 面向个人研究者的较低成本版本(商业用途受限)。

🛑 重要说明

  • 深度与广度: IDA Pro 的许多功能都非常深入(如反编译、调试器、脚本),上面列出的是主要类别和关键点。

  • 插件依赖: 部分高级功能(如 BinDiff, CollabREate, 特定架构支持, 高级漏洞分析)依赖第三方插件。

  • 学习曲线: IDA Pro 功能强大但学习曲线陡峭,熟练掌握需要大量实践。

  • 反编译核心: Hex-Rays Decompiler 是其最具革命性的功能之一,但需要单独购买许可。

总而言之,IDA Pro 是一个集静态分析(反汇编、反编译、控制流分析、数据结构重建)、动态分析(调试)、自动化(脚本、插件)、协作和二进制文件操作为一体的综合性逆向工程平台。它是专业安全研究人员、恶意软件分析师、漏洞猎手、软件开发调试人员进行深度二进制分析的终极工具之一。

 

 

缺点

函数内部有些指令没有结束但是提前识别结束了

没有展示所有的段和节,有些被隐藏了,比如节头表,

只有内存视图没有文件视图

反编译c不直观

utf8的字符串不能自动识别

posted on 2025-08-10 07:53  GKLBB  阅读(1074)  评论(0)    收藏  举报