我需要从可执行文件中提取结构定义。我怎样才能做到这一点?我读到我们可以使用 ELF 做到这一点,但不知道如何做到这一点。这里有什么帮助吗?
2 回答
我读到我们可以使用 ELF 做到这一点,但不知道如何做到这一点。
您可能读到的是,如果二进制文件包含调试信息,那么可以从该二进制文件中提取变量、结构和许多其他类型的信息。
这并不特定于ELF
:许多其他可执行格式(例如COFF
)也允许嵌入调试信息。
此外,该调试信息的格式在不同平台之间是不同的。一些常见的 UNIX 是DWARF
and STABS
(随着DWARF
更新和更强大)。
如果你有一个ELF
二进制文件,并且你怀疑它可能包含DWARF
调试信息,你可以使用它来解码它readelf -wi a.out
(准备好有很多信息,如果有的话)。objdump -g
可用于解码STABS
(最近的objdump
版本也可以解码DWARF
)。
或者,正如 tristan 所建议的,您可以将可执行文件加载到 GDB 中并使用info types
和ptype
命令。
如果二进制文件不包含调试信息,那么 DrPrItay 的回答是正确的:你不能轻易地从中恢复结构定义。但是,您仍然可以使用逆向工程技术来恢复它们。例如,Wine
项目(example)使用的许多结构定义都是通过这种技术获得的。
据我所知,你不能。c / c++程序不像java,结构没有符号。它们只是为您的编译器定义了如何在堆栈帧或其他一些内存(结构数据成员)中对齐和打包变量。例如,与 java 不同的是,在加载共享对象(c 程序中不包含头文件)时,您没有类似于类加载的内容,您只能加载全局变量和函数。定义一个结构就像创建一些数据类型一样,它的定义应该只存在于编译,你没有在符号表中得到一个符号,int
或者char
为什么你应该为一些结构?这根本没有意义。符号 aee soley 表示编译器在编译期间无法识别的对象 - 链接时间/加载时间/运行时间