IDA 9.5更新了什么?

开发技术
29 编辑于
kinotern

欢迎使用 IDA 9.5

IDA 9.5.261026.365f1f33


一、亮点速览

1. 三个新反编译器

Dalvik:把 Android DEX 字节码反编译为 Java 伪代码,建立在强类型模型上——类、字段、方法、参数都是可重命名、可改类型的实体,编辑会传播到伪代码。工作场所是“类视图”,Tab 与反汇编互切,Ctrl+Shift+F6 或类树里 Ctrl+双击可再开一个。支持 multidex(跨 dex 调用、虚调用引用子类重写)、odex 字节码;Kotlin 元数据、序列化注解与 DEX 调试信息能还原原始方法名。输出接近源码:"a" + b 而不是 StringBuilder 链、Outer.Inner、泛型与 @Annotations(...)、new Type() { ... };try/catch/finally 可重建(嵌套、catch-all、以 return/goto 结尾的 finally、多出口 synchronized)。另有语言中立的类 API:get_classes()、get_class_info()、render_class()、render_member()(C++ / IDAPython)。限制:try-with-resources 不重建、类视图编辑不触发 Hex-Rays 伪代码事件、输出不总是合法 Java、被混淆文件无特殊处理。

[图2:multidex 示例应用的类视图]

TriCore:hextricore 插件,支持 eabi 与 Tasking ABI。指针参数/返回值在 A 寄存器识别(整数走 d4-d7、指针走 a4-a7,两组各自填充,混合参数顺序未编码在二进制里,需用“设置项类型”Y 手工调整);1.6 之前内核的 dvinit/dvstep/dvadj 除法序列(含 Tasking 典型的 dvstep 循环)折叠为单条除法。

[图3:TriCore 除法示例]

Hexagon:hexqdsp6 插件,建模 packet 语义(并行读、.new 值、谓词执行)、硬件循环、复合分支与跳转表、浮点、标量 SIMD;HVX 向量(V0–V31、Q0–Q3)建模为向量寄存器,系统/guest/缓存/supervisor 指令以 intrinsic 出现,语义可在 hexagon_protos.h 查。指令读取的都是 packet 起始时的寄存器值,.new/.cur 看到本 packet 的结果,带谓词指令变条件块。

[图4:time() 的反汇编与伪代码对比]

2. 反编译器位域支持

(*(_DWORD *)&s >> 3) & 7 现在读作 s.field,*p = *p & 0xFFFFFF07 | (v << 3) & 0xF8 读作 p->field = v(类型正确时)。覆盖所有架构,含 ARM64/PPC/MIPS/RISC-V 的专用 extract/insert 指令。默认开启,可在 Edit > Plugins > Hex-Rays Decompiler Options > Options 2 用“Decompile bitfield accesses”关闭。

已处理主流编译器模式:2 的幂缩放读取、从寄存器副本提取、最高位的有符号比较、比单元更窄的访问、MSVC 的 xor 翻转、打包存储拆成逐字段赋值、跨对象同字段比较、掩码复合更新折叠。

例(MSVC 不直观的 xor 翻转):

c
struct s4 { unsigned a : 4; unsigned b : 4; unsigned rest : 24; };
void inc_a(struct s4 *p) { p->a++; }
// 9.4
 *(_DWORD *)p ^= ((unsigned __int8)*(_DWORD *)p ^ (unsigned __int8)(*(_DWORD *)p + 1)) & 0xF;
// 9.5
++p->a;

位分配顺序默认与字节序一致,可按类型翻转;Xbox 360 二进制常见小端位序(GPU 寄存器、继承自 Windows 内核的结构),用 #pragma bitfield_order(lsb_to_msb) 或 __invbf 标记。有完整 PDB 时会据此判断位序。

3. SSE/AVX/AVX2/AVX-512 大幅增强

  • 宽于 16 字节的加载/存储显示为普通 C 赋值,不再有 SSE/AVX load/store intrinsic;punpcklqdq 显示为写高半部分的 move;movlhps/movhlps 是普通 move

  • 新的 avxlifter 插件把 AVX、AVX2、AVX-512(F/CD/BW/DQ/VBMI/VNNI/BF16/FP16/VL)与 VMX 转成本地 microcode,否则转为作用于 __m128/__m256/__m512 的 _mm*_… intrinsic——含 EVEX 掩码 merge/zero、gather/scatter、compress/expand、opmask k 寄存器

  • packed and/or/xor/andnot 变 C 运算符(a ^ signmask、a & absmask,vxorpd x,x,x 即 0.0);标量 FMA 与 min/max 变 fminf/fmaxf

  • 无副作用 intrinsic 标为 pure,无用向量计算被删;XMM/YMM/ZMM 建模为同一寄存器视图,旧式 SSE 写入保留高半;向量 union 增 __int128 成员(去掉 *(_OWORD *) 转换);tzcnt → __tzcnt()

  • movups/movsd/mov/movzx 分段拷贝的字符串字面量(含 UTF-16 与混合宽度)可识别,属分析层、不装插件也生效

  • 对齐帧指针的函数(AVX 常见的 and rbp, -32)重新拥有栈变量

4. 寄存器对与散布对

32 位平台上 64 位值常落在“散布”对里:反向(低半 r2、高半 r1)、不相邻(r3+r12)、寄存器+栈槽。9.4 只能显示为两个 32 位变量加 __PAIR64__,且无法把一半改成 64 位。9.5 自动识别(仅当该对参与比较、有一半在栈上、或出现多次——刻意保守;x86 edx:eax 不受影响),并提供“创建/删除散布寄存器对”命令。两半原有名称沿用到合并变量(去掉 _hi/_high)。散布操作数会传播名称,Go 字符串变量因此获得真名而非 vNN;这类对的移位与乘法融合为单个 64 位操作。

5. Apple 内核缓存加载器

kernelcache 被当作“一个 KEXT 集合”处理,而非一个巨大 Mach-O;启动 KC 与其链接的系统/辅助 KC 视为一个集合。

  • KC 索引列出每个 KEXT 并按需映射(内核先加载)

  • 尽可能重建 IOKit C++ 类层次、虚表与虚方法;XNU 只做前向声明的类(SCSITask、IOServicePM…)按记录大小布局,虚表槽位因此有名字

  • Locate > Symbol / String / Address 搜索整个缓存(含未加载 KEXT),去符号缓存同样有效

  • 函数列表每个 KEXT 一个文件夹;示例插件可把 KEXT 或 dyld 缓存镜像导出为独立 Mach-O

  • kalloc_type:iOS 16 / macOS 13 起 XNU 用 kalloc_type 描述符分配内存,IDA 据其为分配结果定型;无头文件声明的内核内部类型按描述符布局;kalloc_type_views.py 可浏览全部类型化分配

[图5:KC 索引,按需映射的 KEXT 显示为 Loaded] [图6:kalloc_type 视图浏览器]

6. DriverKit 驱动

DriverKit 驱动(.dext)是 KEXT 的用户态继任者。9.5 恢复其类、虚表与 IORPC 消息。

  • 新增 DriverKit 类型库(DriverKit 19–27,每个 SDK 一套)自动选中,覆盖所有设备家族,比 macOS SDK 类型库多约 80 个类(音频/视频/MIDI/SCSI/串口/块存储/网络)

  • 驱动声明的类被恢复并定型,方法与虚表命名;macOS 26 DriverKit 共享缓存中 599 个类全部正确定型(原 49 个)

  • IORPC 消息获得 SDK 名(如 IOService_Start_ID 而非 0AB6F76DDE6D693F2h),驱动与 arm64 kernelcache 中皆然

[图7、图8:第三方 DriverKit 驱动 _Dispatch 的反汇编与反编译结果]

7. 原样保留名称(verbatim names)

Rust / Go / Swift / 重度模板 C++ 会用到非合法 C 标识符的字符,过去被替换成 _,导致难读、无法按真实名检索。9.5 原样保留符号名、类型名与成员名。

  • 新数据库默认显示反修饰名;A::B::C 这类限定名整体高亮与选中

  • 非合法 C 的名称可在类型编辑器与“设置类型”对话框用反引号输入

  • 迁移:既有数据库保持现名;ida.cfg 的 GarbleNames 可为新数据库恢复旧行为

[图9–图11:Go 符号与 Rust 类型在 9.4 / 9.5 的对比(9.5 保留 runtime.(*Func).FileLine、&mut dyn core::fmt::Write)]

8. FLIRT 2.0

经典 FLIRT 只看字节,函数内被链接器重定位的调用目标成了通配符,没有独立签名的辅助函数永远无名。FLIRT 2.0(v11 格式)额外记录库模块“引用了什么”:一旦匹配成功、调用落点确定,就能命名其目标,并用同一证据在字节完全相同的候选间取舍。

去符号、静态链接的 sqlite3 中被正确命名的函数数(9.4 → 9.5):

运行库9.49.5
glibc amd6412791846
glibc i38614241826
glibc arm6414341815
glibc armhf7761204
glibc riscv64288933
glibc s390x13981739
MSVC /MT x64565698
MSVC /MT x86458561
MSVC /MT arm640753
MSVC /MT arm0622

另:识别 VC 14.39–14.52 的 32 位二进制;ARM/ARM64 MSVC 签名覆盖 VC11–14.52;main/wmain 与 WinMain/wWinMain 依二进制证据区分;签名可携带未修饰原名(Go 运行库保留 runtime.(*mheap).alloc,旧版以 *_legacy.sig 随附);加载更快。迁移:sigmake 始终写 v11;9.5 能读旧 .sig,但 9.4 及更早拒绝 v11。

9. 更精确的 switch-case 还原

  • 被拆成二分查找派发的 switch 重新拼合:嵌套在相等/范围守卫下的合并进父级,被守卫隔开的两个合并为一个

  • 建立在 switch (x - C) 上的跳转表重定基到原值,还原真实 case 标签

  • 从 if 链(含落穿派发树、getopt 风格树)更好还原;case 按值排序、共享函数体合并、只跳入另一 case 的折叠进去

  • 改用反编译器自己的 microcode 数据流分析找跳转表(x86/ARM/MIPS/RISC-V/PPC/ARC/V850/Dalvik),反汇编器漏掉的(“switch analysis failed”)也能还原

  • 由分支指令构成的跳转表(ARM ADDLS PC, PC, R3,LSL#2 + B case_n、PPC/GHS 表)识别为 switch;Dalvik 的 packed/sparse-switch 依 payload 构建

  • 选择子寄存器被复用作偏移副本时改写比较并删除失效偏移链;找不到范围检查时显示 default: abort()

10. “创建 C 文件”递归反编译

File > Produce file > Create C file...(Ctrl+F5)新增“当前函数及其被调函数(递归)”。被调函数从叶子向上先反编译,恢复出的原型改善调用者伪代码。会跟进 .plt 与 stub thunk 到真实函数、跳过导入;对话框有“跳过调试器段”“跳过库函数”(默认开)、“仅反编译到缓存”,选择会话间记住。等价命令:“递归反编译”(Edit > Other,Ctrl+Shift+F5),批处理用 -Ohexrays:-recursive。

11. 三个新附加组件

  • IDA MCP:第一方开源 MCP 服务器,把 AI agent 接到 IDA,完全本地,可同时操作多个数据库

  • IDA Assist:内建逆向 AI 骨架,兼容任意本地/云端模型,结合 IDA 分析引擎、模拟执行与 SMT 求解器给出可解释结果,可并行分析多个数据库

  • Malware Analysis:一键脱壳、可疑代码安全模拟、沙箱结果直接显示在反汇编中


二、高级语言支持

Swift 字符串:Swift 把字符串存成两个 64 位立即数(小串内嵌;大串是带标签指针,指向内容前的固定偏移)。9.5 内置解码逻辑,解码后加入字符串窗口(Shift-F12),由新的合成字符串 API 支撑、插件可用。反编译器把识别出的字符串表示为 Swift::String 实体:

c
// 9.4
v4._object = (void *)0xEE00444342413938LL;
v4._countAndFlagsBits = 0x3736353433323130LL;
// 9.5
v4 = Swift::String("0123456789ABCD");

Go 损坏/混淆元数据:pclntab 的 magic 被覆写、节被剥离或改名、被嵌入其他段,仍能找到;无构建字符串也能恢复版本;garble 混淆下恢复函数与名称;支持 Go 1.27。

Rust ABI 扩展到 ARM[64]/MIPS/PPC/RISC-V:CM_CC_RUST(9.4 仅 x86)现覆盖 ARM64、ARM32、MIPS o32/n64、PowerPC 32/64、RISC-V 32/64,得到真实参数与返回值。配套:字符串字面量进伪代码(切片类型名 &str)、panic/abort 识别为不返回、解析 Rust 异常处理表、丢弃零尺寸成员与参数(含 unit ())、恢复闭包隐藏环境指针;无 DWARF 也能识别 Rust(rust_eh_personality、只读数据中的 rustc- 标记、legacy/v0 修饰),函数默认 __rust;有 DWARF 时按 Rust ABI 校验并纠正 __usercall/__fastcall 误标与 clang/LLVM 的参数位置;打包/低对齐聚合返回不再只剩首字段。

其他:golang 字符串字面量在 microcode 中识别;更多 memcpy 变普通拷贝以便传播与删死码;批量反编译每函数即时入库(-noserialize 关闭)。修复:无符号目标上负 UnsafePoint 显示 0xFF、部分大端/ppc64 无类型信息、Go 1.24+ map 类型不完整、macOS arm64 的 u128 栈参数错位、Swift 双字值原型错误、调试信息描述 String 时调用丢参等。


三、反编译器

  • 跳转到函数指针成员所指函数:Enter/双击调用中的函数指针成员,跳到其指向的函数而非声明处(操作表/派发表常见)。对象可为全局、常量下标数组元素、其他结构成员或其链(g_dev.ops.call()、g_tab[1].call());对象无名时扫描该类型所有数据项,唯一则直跳、多个则开候选选择框;Dalvik 类视图同样可用

  • 寄存器变量“拆分变量”:拆分点须完全重定义寄存器、每个重命名使用须被其支配,循环携带自引用累加器被拒;拆分后的出现点在构建 use-def 链前改名到新寄存器

  • 散布寄存器对:见亮点 4;移位/乘法融合为 64 位操作

  • x87 FPU 栈:被调函数被定为返回 void/整数但实际在 st0 留值,不再放弃——以调用不固定方式重试、纠正返回类型、调用点加注释;原型无法解释栈残留时给红色头部注释(实际 vs 声明槽数),而不是整函数退化 __asm

  • 合并的结构体字段拆开:成员恰好铺满所访问区间时把宽操作还原为逐字段;== 用 &&、!= 用 ||;GUID 收益最大(可辨识十六进制而非大十进制数);填充、部分覆盖、union、带副作用基表达式不动;“取消拆分表达式”可逆

  • 去符号 Swift 正确反编译:恢复 swift 调用约定(分析时记录、反编译时应用,不存为原型,故调用点参数恢复仍有效)与抛出调用;抛出点错误结果以 __swift_get_error() 呈现,使 if (error) 读起来正常;重建 __swiftthrows 与结果类型;运行库枚举参数定型为枚举

  • ARM64e:用 16 位判别值解析认证虚调用(BLRAA/BRAA 得交叉引用,方法得调用者引用,跨 KEXT 亦有效,不需类型信息);列出方法所有重写;kernelcache 全 KEXT 映射时 92% 认证调用可命名被调者;Swift 值见证表调用同样解析;PAC 帧指针检查默认隐藏(HO_SHOW_PAC_INSNS 可恢复)

  • 其他:非 MSVC 用 GCC/Clang 内建名;裸常量按无符号显示(HRESULT 读作 0x80070057);x ^ ~x→-1、x & ~x→0;进位标志作布尔值时显示为 (x & 0x100) == 0;sizeof/offsetof 提示显示数值;无法把置位比特移到另一端的循环移位显示为移位;16 字节返回(Rust &str、Swift String)不再被截半;原型编辑器不再把 a1/a2 变成真名;PPC 线程指针 r13 显示为 R13;“标记为 outline 代码”开关;x64 按现代 System V psABI 丢弃空 C++ 记录(旧 GCC<8 布局为 -sysv_pre12)

  • 修复精选:bt reg, reg 残留高位依赖;向量寄存器 movq 复制 128 位;AVX 对齐帧指针函数丢栈变量;Rust STR Rt, [SP,#-N]! 值丢失;MIPS16 经 $s1 栈访问显示为未初始化;x87 指令残留 __asm;以及大量 INTERR(1098/50689/50708/50743/51111/51365/51625/51723/52369/52482/52870/53087 等)与大函数挂起、switch 巨区间 OOM、取消不停止搜索、-Ohexrays:-tmpfile 被忽略等。


四、反汇编器

  • 跨循环跟踪寄存器:固件/C 运行库在循环中遍历函数指针数组(__libc_init_array、.init_array、__libc_freeres、驱动表)过去无交叉引用、子系统不可见;现在跟踪被循环以常量步长改变的寄存器,数组内每个函数获得调用交叉引用(MIPS gzip uImage 新发现 18 个函数)。ARM/MIPS 上静态数组元素得数据与字符串交叉引用,ARM 结构体数组显示成员偏移;仅接受指向代码的项;REGTRACK_ALLOW_NUMLOOP 按处理器开启;Alt+Shift+V“查找值”也解析栈变量与 call $+5 压入的返回地址

  • ARC:bi/bih 跳转表还原为 switch、ARCtangent-A4 间接调用惯用法识别为调用、MetaWare millicode 与变参参数处理;enter_s/leave_s、bi/bih switch 跳转、乘法、条件设置、除法、bmskn、min/max 不再残留 __asm,以 asm+JUMPOUT 结尾的函数获得真实 return;magic-multiply 识别跑通后除法复原(g_timer_int_count / 6u);.f 形式按 ARCv2 PRM 的 STATUS32 表处理;修复 bbit0 r13, r15 把 r15 当暂存并清零导致后续读 0 的缺陷(asr/lsr/asl/ror、btst/bset/bclr/bxor/bmsk 同)

  • ARM:解码 FEAT_LUT / CMPBR / CPA / LSUI / FPRCVT / MOPS / FCMA / SPECRES2;支持 FEAT_PAuth_LR(Armv9.5,Apple 新内核已用):PACIBSPPC + RETABSPPC 的函数能创建、定位结尾并把返回链回函数

  • Hexagon:GP 相对(小数据)访问按 _SDA_BASE_ 解析(新 QDSP6_SDA_BASE 关键字或处理器选项);ELF 加载器按 ABI 算 GOT/GOTREL、处理 TLS 重定位、把 R_HEX_32 应用到 DWARF;尾声按所恢复的帧槽定位(覆盖带谓词的提前返回)

  • MIPS R6:反汇编器与反编译器完整支持(全部整数/FPU 指令含新编码、紧凑分支与跳转、R6 分支/跳转/select/FP 比较;无头二进制可选 R6,PLT stub 命名)

  • Renesas RX 大端:新处理器类型 rxb;大端模式下 CPU 按 32 位字取指,flash dump/已链接可执行文件把代码字按字节反序存放而数据仍大端;大端 ELF 自动选 rxb,binary/Intel HEX/S-record 加载时选“Renesas RX big-endian”;可在处理器选项关闭“Code is stored as byte-swapped words”;rts/rtsd/rte/rtfi 识别为返回

  • 游戏主机:PS3(celloslv2 ILP32,32 位指针的 64 位 PPC,TLS 地址正确)、Xbox 360 与 Green Hills/Wii U(__savegprlr_N/__restgprlr_N、__savefpr_N/__restfpr_N、__savevmx_N/__restvmx_N 具名,反编译器当作序言/尾声,调用者参数正确、无虚假调用,不必手工写 void __spoils<>())、Xbox 360(r12 作链接寄存器或保存向量寄存器的 stub;.pdata 按自身布局解码;清除 32 位标志的手写 stub 长度不再减半)、PSP Allegrex(新 single_float ABI 默认开,float 走连续 FP 寄存器、double 走 GPR;ELF 加载器支持打包 PRX 重定位;AltiVec/VMX128 指令显示为以 XDK 命名的 intrinsic)

  • WebAssembly 3.0:支持 GC、类型化引用、异常、SIMD、原子、尾调用、64 位与多内存;栈式代码折叠为操作数、块缩进与高亮、名称取自模块、签名变原型、GC 结构/数组变局部类型。实测(之前→之后):62 MB Qt/Emscripten 模块 45 分钟未完成→102 秒;27.8 MB/68,069 函数 39 分 40 秒→77 秒;22 MB Emscripten 379→40 秒;pyodide 121→15 秒。数据假偏移大幅减少、线性内存不再逐字节列出、畸形模块不再崩/挂

  • 修复:x86 SEG_XTRN 的 jmp 无代码引用;arm64e 各类虚调用丢引用;MIPS16/microMIPS 地址未成偏移、非对齐 usw/usd 被当作加载、延迟槽入口崩溃;PPC 多 TOC、操作数标志、128 位返回/栈参数位置;Dalvik 调试器多项(慢栈回溯、无 Java 帧后丢栈、JDWP NATIVE_METHOD、忽略 ANDROID_SDK_ROOT、Type Names 改名后断点失效等);Hexagon 多项跳转表识别与 dmwait 丢寄存器;SPU 按小端反汇编;V850 callt __ghsld4* 返回导致视图无限重载等


五、分析与内核

  • 异常处理栈层级:landing pad 由展开器进入而非前面的代码,过去取前一条指令的 SP 层级导致其后栈变量全错位。现在取其所守护区域的层级(修复在内核,覆盖 ARM/MIPS/PPC/RISC-V/SH4/Hexagon/NDS32/TriCore);x86 上 gcc 构建的 PE(MinGW/Cygwin)同样处理,Windows __try 的 handler/filter funclet 不再送入 SP 模型(OS 以自己的帧调用),不返回函数调用后的栈清理与未结束块的 handler 获得正确增量

  • 一个畸形 try 块不再丢弃同一范围内的其他块(过去 7 好 1 坏返回 0 个),越过程序末尾的块不再隐藏后述块;C++ try 守护区域即使以永不返回调用结尾也属于该函数;空异常规范的 landing pad 不再丢失

  • 识别从 [rsp] 无位移恢复寄存器的 x64 尾声;异常处理表巨大的文件分析更快,无 SEH 的文件跳过所有者搜索

  • 防病态二进制:ida.cfg 新增 OVERSIZED_FUNC_SIZE(默认 0/关)把超大函数标为 oversized 并跳过其栈帧/SP/跳转表/栈变量分析;JUMPTABLE_MAX_INSNS 限制单次 switch 模式匹配工作量

  • 最终分析阶段不再把字符串藏在数组中;列表在使用处显示合成字符串

  • 修复:~rN 结构体栈变量显示为 byte;首成员为空的结构体寄存器传递 INTERR 10147;从反修饰名猜的类型覆盖好原型;128 位值右移 64+ 位错误;Windows arm64 的 128 位乘除错误;gcc 枚举得 16 字节类型;"autoanalysis finished" 非末条消息;巨大数组初始分析耗时过久;关库 INTERR 840;thunk 名后缀重复;DBFL_COMP 被忽略;大端 fpvalue 字节交换;关交叉引用缓存时重定基库遍历跳过/重复


六、加载器

  • 新 UEFI 加载器与插件(本版重点是 DXE,后续版本继续完善):整份固件镜像(SPI flash dump、capsule body、firmware volume)可载入同一库;自动分析后运行,添加名称与类型,使已知协议调用可读:
c
gBS->LocateProtocol(&gEfiPcdProtocolGuid, NULL, (void **)&gEfiPcdProtocol);
gEfiPcdProtocol->GetBool(1068);

入口点按模块命名并按 FFS 文件类型定型,函数按模块分文件夹;gBS/gRT/gST/gSmst/gImageHandle 自动找到并定型;协议 install/locate/notify 都能找到,GUID、接口指针与实现定型命名(如 DiskIoDxe_EfiDriverBindingProtocol_Start),无类型库的厂商协议给合成结构体;新“UEFI 协议”窗口(View > Open subviews)列出所有 install/uninstall/locate/notify 并可过滤;跨模块的协议成员调用交叉引用(伪代码双击 x->Member 跳实现);.data 只读字符串内联显示,DebugPrint/DebugAssert 识别;选项在 cfg/uefi.cfg

  • 其他:zstd 输入透明解压;DEX 项显示为解码形式、支持 040 与 VDEX、>127 个 try 块完整保留;kernelcache 与 dyld 缓存头部展开显示、load command 按类型库定型、路径字段链接字符串、LC_FILESET_ENTRY 的 vmaddr 显示为相对 KEXT 头部偏移、arm64e.x1 识别、函数列表每 KEXT/缓存镜像一个文件夹、显示签名二进制的 entitlements 与 hardened runtime

  • 修复:Intel HEX 255 字节数据记录加载失败;R_MIPS_PC32 未应用;n64 对象外部函数调用未解析;多 HI16 配单 LO16 只应用最后一个;PSP 重定位双重应用;MIPS16/microMIPS 条目命名偏一字节、字面量池被当指令;RX 分支重定位与“symbol+offset 指向 symbol+2*offset”;畸形 uleb128 INTERR 2765、畸形 DEX 加载崩溃;dscu 部分段移动误判重定基、__auth_stub 未命名、Swift 函数不再按模块分组;kcu 重开库后按需 KEXT 无 C++ 类/引用、重定基后去旧地址、插件看不到按需 KEXT


七、类型系统

  • Clang 成为默认解析器:内置 clang 解析器,C/C++/Objective-C/Objective-C++ 开箱即用;旧解析器仍在“编译器选项”里可选。默认为 ida.cfg 中 TYPE_PARSER = "clang","legacy" 可用。类型编辑器与 Local Types 有语言选择器(按库保存)

  • 移除:9.4 已弃用的 old_clang 解析器、idaclang 插件与独立工具移除;用 tilib -TC 构建类型库(文档有 idaclang → tilib 命令对照)

  • 版本匹配的 XNU 类型库:加载 Apple Silicon macOS 内核时自动应用与 OS 版本匹配的 XNU 类型库

  • 元组按成员命名:多返回值函数(多返回值 Go、多寄存器返回、返回数组的 Rust)不再为每个函数单独造 retval_401000;返回两个 64 位值的统一用 _2__QWORDs,返回 (bool, error) 的 Go 函数用 _bool_error。相邻同类型成员写一次带计数({ _DWORD; _DWORD; double; } → _2__DWORDs_double),指针加 _ptr(char *→char_ptr),数组包装按元素与维度(int_x2x3);普通结构/union 加 struct_/union_ 前缀以避免与同成员元组冲突;无法命名的用 $+MD5。既有库的 retval_<地址> 继续可用。API:tinfo_t::create_tuple()、save_type(NTF_AUTONAME)、udt_type_data_t::build_autoname()

  • 修复:错误声明不报告;旧解析器能接受的声明(如 main 非标准原型)被拒;IDA 输出的匿名类型头文件无法回读;const 对象反修饰数据声明被拒;结构体打包标志被忽略;无调用约定的原型丢失平台默认;__intN 在非 32 位 int 目标跟随 int 宽度;不可解析 decltype() 崩溃;typedef 先经指针后按值使用崩溃;参数不能用寄存器命名(破坏 MIPS“添加参数”);__swiftself 未在指针参数上被拒


八、调试信息、反修饰与异常处理

  • Swift 6 反修饰;DWARF 丢弃零尺寸 Rust 参数、unit () 表示为零尺寸结构体、结构/union 丢零尺寸成员;遵循 DW_AT_noreturn;ObjC/Swift 运行库根类带 isa 指针;PDB 恢复位域分配顺序;goodname 新增 MSVS STL 模式

  • 修复:被替换 template-id 的 cv/引用限定符错位、花括号初始化列表实参不反修饰、某些局部 C++ 名不反修饰;DW_OP_addrx 定位的全局与函数内静态变量未应用类型与名称;溢写到 SP 相对槽的参数未命名定型;不完整 C++ 类型降 void;PPC 浮点参数寄存器映射错;Rust 闭包环境指针未恢复;小于 sizeof(base) 的基类子对象被拒;GCC -O0 函数 DWARF 原型被替换(int 返回变 __int64);PDB“加载类型”被忽略、/Z7 COFF 原型未应用、参数类型错、数据全局未布局、小结构体返回多/少结果指针


九、界面与交互

  • Qt 6.8 → 6.12 LTS:跟随桌面浅/深色(Linux 走 XDG portal,IDA_COLOR_SCHEME=light|dark|auto 可强制);键盘专用 Copy/Undo/Back/Exit 键注册为快捷键并被编辑器/速查表/命令面板列出;PySide6 同步升级(用 PySide 的插件请重测)

  • HTML 导出:所有列表(反汇编、十六进制、伪代码、类型列表)可连同颜色忠实复制/导出。右键新“复制”子菜单:作为文本(Ctrl+C)、作为 HTML(粘进 HTML 编辑器保留样式)、作为深链。File > Produce file > Export to HTML... 导出独立页面、带函数侧栏且交叉引用可用的交互页面、或可粘贴片段;模板是普通 IDAPython 脚本,插件/IDAPython/idalib 均可用。反编译器自带的“生成 HTML”退役

  • 交互式 Pathfinder:边加途经点与排除项边看路径即时更新;左列表右图同为一条路径;两途经点间显示有多少函数连接、最短多短、或根本无路径;路径入库。交叉引用图也更好读:直角走线、字符串字面量显示内容。“打开 Pathfinder”把 Shift+F9 让给“创建新路径”

  • 重做快速过滤:在列表窗口键入即过滤(不再跑难被发现的增量搜索),快捷键始终优先;过滤条常驻可见。旧行为 9.5 期间在 Options > Feature Flags 可开,9.6 移除

  • Jump Anywhere 更强:一个框找到函数、名称、字符串、局部类型及其成员与枚举常量;结果语法着色、函数显示参数、逐项预览(反汇编/伪代码/十六进制,始终开启);表达式可用 IDC 或 Python 求值;调试时还找调试器已加载模块的符号

  • 其他:Alt+ 编号 500 ms 出现;默认显示反修饰名;Alt+单击限定名只高亮光标下组件;双击跳类型定义或结构成员;Shift+Enter 在选择框/树中跳项不移动焦点;类型编辑器新增“声明”标签页;Ctrl+拖动选整行;美化名背后原始名半透明;悬停显示全名;types 窗口按美化名过滤;dsc/kc 索引树按字母排序;Teams 状态单面板;新增“扩展”菜单汇集 Lumina/Teams 等(顶层菜单移除,但挂到 "Lumina/..."/"Teams/..." 的插件仍可用);新文件在主窗口所在显示器打开;pathfinder 与交叉引用图大量易用性改进;选择框/树新增“复制”子菜单;插件可用斜杠把自己归入 Edit>Plugins 子菜单(SDK 示例归 "Examples");git 仓库跟随升级、git-ida 条目自动重定向

  • 修复:Teams 拉取文件后 INTERR 80130、打开 Vault 控件 INTERR 72549;macOS 上 Alt+ 编号在按住 Cmd 时出现;运行时选的许可证服务器关库后被遗忘;分析空闲指示器不变绿;Local Types 限定名不高亮整个;焦点在复选框时 Enter 不接受表单;共享历史视图导航下拉崩溃;树视图快速过滤无反应;中键关两个视图;深色主题禁用控件看似可用;Pathfinder/脚本窗口无 Alt+N;Wayland 清空剪贴板;书签/断点菜单出现“编辑/删除函数”;原型编辑器校验过期文本;浅色模式途经点行不可读;节点同时是途经点与排除项;向后搜索/标识符搜索不按序;r8 在 cr8 中被误高亮;VoiceOver 过滤崩溃;过期许可证切换崩溃等


十、调试器

  • 修复:Android 挂起 JIT 应用可能挂死并被杀;Linux/Android 附加繁忙应用 INTERR 30057、作业控制停止冻结进程、分离后仍停在停止态、新线程未受调试可能崩溃、SIGCONT 使服务器中止并杀进程

  • 安全:恶意客户端可用错误文件索引打崩远程调试服务器(已加固)

  • bochs:带页断点的单步略快;线程窗口显示每线程指令指针


十一、FLIRT 与 FLAIR

  • 从选中字节区间创建模式;pelf 支持 ARC ELF;签名可带未修饰原名;窄/宽 MSVC 运行库孪生函数依证据命名;ARM/ARM64 签名重生成覆盖 VC11–14.52;64 位 MSVC 签名按 CRT 链接方式选择;启动签名的入口模块引用被命名、引用未解析也接受、窄/宽启动全局名保留;识别 VC 14.39–14.52 的 32 位 MSVC;arc 新签名覆盖 millicode

  • 修复:32 位 wWinMain 丢入口名;启动签名被当普通签名应用时入口模块按指令字符串命名;短包装函数取到 exit 这类库名;分析后期发现的库函数仍未识别;sigmake 对 >65535 字节模式崩溃;ppsx/pmacho/pelf 对构造文件的越界读写;zipsig 重复关闭输出与空节点防护


十二、性能与资源占用

  • DWARF 规模化:调试节改内存映射,2.6 GB C++ 二进制省约 2 GB(−30%);8950 万 DIE 的按 DIE 索引 2048 MB → 1109 MB;新增 -Odwarf:lazy_types=1 只导入可达类型,过去 OOM 的巨大 C++ 二进制可加载

  • dyld 共享缓存:启用地址范围不再重写整库;2.7 GB 缓存上初始加载+分析冻结总计 8.1 秒(原 42–48 秒),单次最长冻结 5.4 秒(原 13.5–15.9 秒),UI 线程 I/O 21 GB(原 234 GB);区域映射 1 秒(原 5 秒)

  • 病态输入:800 类/20 万字符串的 RTTI 复制数据 37.1 GB → 36 MB;控制流扁平化的巨大函数自动分析 1751 秒 → 253 秒;重开库中创建名称不再随规模变慢

  • 反编译:批量反编译不再二次方变慢(2.6 万函数快 8%、7.4 万快 11.8%);含单个 5506 条指令基本块的函数 2929 秒 → 148 秒

  • 其他:签名文件改缓冲读取;并行实例不再反复重建处理器模块缓存,不启用 IDAPython 的运行不再迫使下次重载所有处理器模块;“收集垃圾”回收已删地址范围;原型编辑器不再把光标位置写库;数据库可按多个独立 zstd 帧打包(PACK_ZSTD_FRAME_SIZE,单位 MB,默认 32),IDA Teams 可并行解码(9 GB 库检出 2.3 秒 → 0.3 秒);链位块常数时间检查、规则 CMB7 最多回看 128 条指令、泄漏检查统计而非复制、表达式可打印性每函数查一次;类型库批量加名、tilib 解析大枚举、apply_regexes/qregsubst 名称打印更快;大型文件夹树过滤选择更快;clang 每次脱离持久实例的解析曾泄漏 AST 且持久实例无界增长(已修)


十三、配置、IDAPython、SDK 与 API

  • 安装清单:加载器、处理器模块、类型库、FLIRT 签名、IDS 文件与主题现在可像插件一样以“目录 + 清单”安装:ida-loader.json(loaders/)、ida-proc.json(procs/)、ida-til.json(til/)、ida-sig.json(sig/)、ida-ids.json(ids/)、ida-theme.json(themes/);加载器与处理器模块需 entryPoint。类型库/签名目录可带多个处理器子目录(<dir>/pc/、<dir>/arm/…),类型库也可直接在 <dir>/,签名必须在处理器子目录。扩展包用 $IDAUSR/extensions/<pack>/ 下的 ida-extension.json 加各子目录。搜索顺序:$IDAUSR/<kind>/ → $IDAUSR/extensions/ 的包 → IDATIL/IDASGN/IDAIDS 目录 → $IDADIR/<kind>/ → $IDADIR/extensions/;同名取第一个,仅大小写不同视为同名;每会话只找一次扩展(装完重启)

  • 新增 API:合成字符串 API(添加只存在于代码中的字符串);License 类(license.hpp / ida_license.License)查询与控制许可证(可用性、产品与版本、激活期、附加组件与功能;设置活动许可证、签出签入、借还浮动许可证);export_listing(把反汇编/伪代码/类型列表渲染为文本或 HTML);类 API(get_classes()/get_class_info()/render_class()/render_member());qgetpid();try 块结构可用 ==/!= 比较;qvector 新增 append(first,last);NTF_AUTONAME;tinfo_t::create_tuple();set_decompiler_timeout(msecs)(超时以 MERR_TIMEOUT 失败,面向无界面/idalib);拆分设置与变参参数的保存/恢复 API;decompile_many() 空输出文件只反编译到缓存并导出 VDRUN_RECURSIVE;字符串字面量注释长度可配(STRLIT_COMMENT_LENGTH);ev_sanitize_name 收到名称种类;最大栈帧大小可配置;hexagon 的 QDSP6_VALIDATE_DUPLEX 与 ida.cfg 中的处理器选项

  • COLOR_GROUP → COLOR_SEMSPAN(“承载语义的跨度”):把一段带标签文本归为一个单元(限定名整体高亮即靠它)并携带语义——1 字节种类 + 大小可变的不透明负载,Hex-Rays 保留增大它的权利。永不假定头部大小:用 tag_skipcode()/tag_skipcodes()/tag_advance() 跳过,用 tag_get_semspan_kind() 读取。旧名为弃用别名;tag_semspan()、tag_semspan_off()、PRTYPE_SEMSPAN、GNCN_SEMSPAN 为 9.5 新增

  • XrefsTo() 包含指向 Thumb 函数的指针:ARM Thumb / MIPS16 中函数指针为地址+1,过去 XrefsTo() 不返回这些引用。现在 9.5 会返回(to 为 0x10121 而非请求的 0x10120),指向确切地址的排在前;要旧行为传新的 XREF_EXACT:

python
for x in idautils.XrefsTo(0x10120):
    print("%X -> %X" % (x.frm, x.to))
# 9.4: 10102 -> 10120
# 9.5: 10102 -> 10120 / 1010A -> 10121 / 10138 -> 10121

for x in idautils.XrefsTo(0x10120, ida_xref.XREF_EXACT):
    print("%X -> %X" % (x.frm, x.to))
# 10102 -> 10120
  • 其他变更:DSCU_USE_SEG_PREFIXES 用于缓存镜像段名;USE_SEG_PREFIXES 退役改用 SEGNAME_FORMAT(跨 kernelcache/dyld/Mach-O 统一,旧选项仍生效);clang 解析器在加载期也用;idalib 打开旧 .idb 自动转 .i64 并继续;安装程序不再在已装新版本时提示 vc_redist 错误

  • 修复:qtree.hpp 无法用 GCC 8.x 编译;qustrncpy() 截断本可放下的 4 字节 UTF-8;脚本创建的 hook 在脚本结束后仍存活;CLI 抛 SystemExit 关掉 IDA;ask_file 空串参数崩溃;idalib open_database 失败终止宿主进程;plugins/ 子目录同名插件由磁盘顺序决定加载哪个;处理器模块脚本无法导入相邻 Python 模块;CMake 构建的加载器在 Windows 上 loader_failure() 破坏堆;ev_decorate_name 收到被截断的调用约定


十四、网络与安全

  • 服务器异常时给明确答案:连接失败会指出服务器(host:port)并以原因为先导,缺少许可证报“license X is not available on this server”;License Manager 与 lsadm/hv/lc 共用同一分类

  • 许可证或 Lumina 服务器无响应时不再冻结(工作期间、退出时、云反编译期间皆然):阻塞网络操作有超时或可取消

  • macOS 使用系统随附的支持 TLS 1.3 的 LibreSSL,可连要求 TLS 1.3 的服务器与要求 Extended Master Secret 的 FIPS 服务器(过去握手会以 alert 80 失败)

  • 安全加固:Linux 构建完整 RELRO + 无 PLT 链接,更耐内存破坏利用

本文版权遵循 CC BY-NC 协议 和 本站版权政策

(。>︿<。) 已经一滴回复都不剩了哦~