IR
Intermediate Representation
抽象中间层 · 让分析工具不再被指令集困住
- 定义
- IR(Intermediate Representation)是网络安全领域的专业术语。IR(Intermediate Representation,中间表示)是二进制分析中将底层机器码(x86、ARM、MIPS 等)提升(lift)为统一抽象表示的关键技术。
最后更新:2026-06-16
什么是IR?
IR(Intermediate Representation,中间表示)是二进制分析中将底层机器码(x86、ARM、MIPS 等)提升(lift)为统一抽象表示的关键技术。通过 IR,分析工具可以在一套统一语义上实现数据流分析、污点追踪、符号执行等操作,而无需为每种 CPU 架构重写分析逻辑。IDA 的 Microcode、Ghidra 的 P-Code、angr 的 VEX IR、LLVM IR 都是典型代表。
- 将不同架构的机器码统一为抽象表示
- 使跨架构程序分析和反编译成为可能
- 典型 IR:VEX、P-Code、LLVM IR、BAP BIL
IR详解
IR 的核心价值是「写一次分析,跑所有架构」。原始机器码因架构差异(寄存器数量、指令语义、寻址模式)极难统一处理,IR 通过 Lifting(提升)将复杂指令分解为简单、语义明确的操作序列。例如 x86 的 `add eax, ebx` 在 VEX IR 中会被分解为加法运算 + 标志位更新等多条语句。常见 IR 按抽象层次分:低级 IR(接近机器码,如 VEX/P-Code,保留所有副作用)和高级 IR(接近源码,如反编译器输出的伪 C)。选择 IR 时的权衡:抽象层次越高分析越简单但丢失的细节越多;层次越低保真度越高但分析越复杂。
IR的应用场景
正式定义
将不同 CPU 架构的机器码统一转换为的抽象语义表示,为跨架构程序分析提供统一基础
应用场景
- 反编译器将汇编提升为可读伪代码
- 符号执行引擎在 IR 上建模程序语义
- 跨架构漏洞分析(同一套规则覆盖 x86/ARM/MIPS)
- 编译器优化在 IR 上进行变换后再生成目标代码
常见误区
- IR 不是一种真实的机器码——它是分析工具内部使用的抽象表示
- Lifting 不是完美的——某些复杂指令(如 x86 的 REP 前缀)可能语义丢失
- 不同工具的 IR 不通用——VEX、P-Code、LLVM IR 各自独立,不能直接互换
实际案例
📌 Ghidra P-Code
Ghidra 将所有支持的架构(x86、ARM、MIPS 等)统一提升为 P-Code,在此基础上进行数据流分析和反编译输出伪 C 代码。新增架构只需写 Lifting 规则。
📌 angr VEX IR
angr 使用 Valgrind 的 VEX IR 作为分析基础,将二进制提升为 VEX 后进行符号执行、污点分析等操作,支持 x86/ARM/MIPS/PPC 等架构。
关于IR的常见问题
- IR 在二进制分析中是什么
- Intermediate Representation,中间表示。将不同架构的机器码提升为统一的抽象语言,使分析工具可以跨架构工作而无需为每种 CPU 重写逻辑。
- 常见的二进制 IR 有哪些
- VEX(angr/Valgrind)、P-Code(Ghidra)、Microcode(IDA)、BIL(BAP)、REIL(BinNavi)。编译器领域则以 LLVM IR 为主。
- Lifting 是什么意思
- 将机器码「提升」为 IR 的过程。例如将 x86 的 add 指令分解为算术运算 + 标志位更新等多条 IR 语句,使语义完全显式化。