2

我需要从可执行文件中提取结构定义。我怎样才能做到这一点?我读到我们可以使用 ELF 做到这一点,但不知道如何做到这一点。这里有什么帮助吗?

4

2 回答 2

3

我读到我们可以使用 ELF 做到这一点,但不知道如何做到这一点。

可能读到的是,如果二进制文件包含调试信息,那么可以从该二进制文件中提取变量、结构和许多其他类型的信息。

这并不特定于ELF:许多其他可执行格式(例如COFF)也允许嵌入调试信息。

此外,该调试信息的格式在不同平台之间是不同的。一些常见的 UNIX 是DWARFand STABS(随着DWARF更新和更强大)。

如果你有一个ELF二进制文件,并且你怀疑它可能包含DWARF调试信息,你可以使用它来解码它readelf -wi a.out(准备好有很多信息,如果有的话)。objdump -g可用于解码STABS(最近的objdump版本也可以解码DWARF)。

或者,正如 tristan 所建议的,您可以将可执行文件加载到 GDB 中并使用info typesptype命令。

如果二进制文件不包含调试信息,那么 DrPrItay 的回答是正确的:你不能轻易地从中恢复结构定义。但是,您仍然可以使用逆向工程技术来恢复它们。例如,Wine项目(example)使用的许多结构定义都是通过这种技术获得的。

于 2016-08-14T04:01:32.483 回答
-1

据我所知,你不能。c / c++程序不像java,结构没有符号。它们只是为您的编译器定义了如何在堆栈帧或其他一些内存(结构数据成员)中对齐和打包变量。例如,与 java 不同的是,在加载共享对象(c 程序中不包含头文件)时,您没有类似于类加载的内容,您只能加载全局变量和函数。定义一个结构就像创建一些数据类型一样,它的定义应该只存在于编译,你没有在符号表中得到一个符号,int或者char为什么你应该为一些结构?这根本没有意义。符号 aee soley 表示编译器在编译期间无法识别的对象 - 链接时间/加载时间/运行时间

于 2016-08-10T05:21:58.057 回答