如何从 .dll 或 ELF 文件生成 C++ 类头文件?

逆向工程 艾达 C++ ida插件 动态链接 班级重建
2021-06-16 18:26:52

我将动态库文件加载到 IDA。我可以从“函数名称列表”中清楚地看到函数签名。“结构”选项卡中也有 RTTI 项目,但我不太明白。我想.hpp从库中生成一个头文件,这样我就可以从我的 C++ 项目中使用这个 DLL。

我的最终目标是以某种方式重写这个库,它可以从依赖于原始 dll 的程序中使用。

我尝试使用IDA ClassInformer PlugIn,但我得到了这个结果:

>> Class Informer: v: 2.5, built: Jul 13 2018, By Sirmabus
Working..
** Failed to load the IDA TypeDescriptor type, generating one **

Processing C/C++ ctor & dtor tables..
-------------------------------------------------
0000000010705194 I: "_initterm", 6 bytes.
00000000107061B8 import: "__imp__initterm".
 
0000000010705194 processInitterm: "_initterm" 
  0000000010704FF2 "_initterm" xref.
  ** arguments not located!
 
00000000107061B8 processInitterm: "__imp__initterm" 
 
Processing time: 2.52 milliseconds.

Scanning for for RTTI Complete Object Locators..
-------------------------------------------------
 N: ".data", A: 000000001080A000 - 000000001080C000, S: 8 KB.
 N: ".rdata", A: 00000000108061CC - 000000001080A000, S: 15.6 KB.
 N: ".idata", A: 0000000010806000 - 00000000108061CC, S: 460 bytes.
 N: ".text", A: 0000000010801000 - 0000000010806000, S: 20 KB.
     Total COL: 0
COL scan time: 0.001

Scanning for Virtual Function Tables..
-------------------------------------------------
 N: ".data", A: 000000001080A000 - 000000001080C000, S: 8 KB.
 N: ".rdata", A: 00000000108061CC - 000000001080A000, S: 15.6 KB.
 N: ".idata", A: 0000000010806000 - 00000000108061CC, S: 460 bytes.
 N: ".text", A: 0000000010801000 - 0000000010806000, S: 20 KB.
Vftable scan time: 0.003
 

=========== Stats ===========
  RTTI vftables: 0
Processing time: 6.27 milliseconds
Done.

它没有显示任何内容。我怎么了?

1个回答

如果您期望具有字段和方法名称的完整类定义,那根本不可能:所有这些信息对于程序执行都不是必需的,并且会被编译器丢弃。有时,如果程序使用具有虚函数的类并且开发人员没有禁用 RTTI,则有时可能会保留带有类名的运行时类型信息 (RTTI)。但是,您的目标似乎甚至还没有做到这一点。所以可能唯一的方法是分析代码并尝试通过手动检查来恢复可能的类。

另请参阅:为什么机器代码反编译器的能力不如 CLR 和 JVM 的机器代码反编译器?

也可能是目标不使用任何类而仅由独立函数组成,每个函数都做自己的工作。