IDA Pro支持.so库的Class Informer插件及虚函数分析咨询
解答
关于Class Informer的兼容性与替代工具
Class Informer插件原生仅支持MSVC编译生成的PE格式文件,针对GNU C++(GCC/Clang)编译输出的ELF格式.so库无适配支持,插件栏不显示属于正常情况,可选择以下替代方案完成类与虚表识别:
- 优先使用IDA原生GNU C++分析能力:若目标
.so未完全剔除RTTI信息,在IDA类型库中加载对应版本的libstdc++类型库,开启GNU符号反修饰选项后,IDA可自动识别多态类结构、虚表布局与RTTI关联的类名,无需额外插件。 - 使用适配GCC生态的IDA虚表分析插件:专门针对GNU C++ ELF文件开发的虚表解析插件可自动扫描全文件虚表、识别继承关系、批量重命名虚表项,功能覆盖Class Informer在PE文件上的核心能力。
- 切换至Ghidra完成类恢复:Ghidra内置的GNU二进制分析模块原生支持ELF文件的C++类恢复,导入文件时开启GNU符号反修饰、RTTI解析、类结构恢复三个分析开关,即可自动完成虚表识别与类结构重建,无需安装第三方插件。
无sub_前缀虚函数的定位与伪代码转换方法
虚函数调用位置未显示sub_前缀,本质是IDA未自动解析虚表指针指向的虚表结构,未将虚表内存储的地址识别为函数入口,按以下步骤操作即可完成定位与伪代码生成:
- 定位虚表基址:从给出的调用形式:
(retvaltype...)(argstype...)(*(_DWORD*)(this + 0x40) + 0x38)(args...)
可知,对象this偏移0x40处存储虚表指针。静态分析时可通过查找该偏移位置的赋值指令,直接定位虚表的起始地址;动态调试时可直接在调用断点处读取this+0x40位置的内存值,即为虚表基址。
2. 计算目标虚函数入口地址:虚表为连续存储的函数指针数组,32位程序单指针长度为4字节,64位程序为8字节。调用偏移为0x38时,对应虚表内的索引值为0x38 / 单指针长度,从虚表基址开始按索引读取对应指针值,即为目标虚函数的实际入口地址。
3. 完成函数识别与伪代码生成:跳转到计算得到的入口地址,若IDA未将该地址标记为函数,按下P键手动创建函数。回到虚调用位置,给虚表指针补充对应类结构的类型定义后,IDA会自动将间接虚调用转换为直接函数引用,按下F5即可生成正常的伪代码。
若目标
.so经过strip处理、完全剔除了符号与RTTI信息,需要先通过交叉引用收集虚表的所有引用位置,手动梳理类的内存布局与继承关系后再做虚函数识别,避免将数据段的普通数值误判为函数指针。
内容的提问来源于stack exchange,提问作者Yang Jim
相关产品推荐
相关产品推荐

