debugging 从可执行文件中提取结构定义

bn31dyow  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(147)

我需要从一个可执行文件中提取结构定义。我该怎么做呢?我读到我们可以用ELF来做,但是不知道怎么做。这里有帮助吗?

ve7v8dk2

ve7v8dk21#

我读到我们可以用ELF来做,但不知道怎么做。
您 * 可能 * 读到的是如果一个二进制文件包含调试信息,那么变量类型、结构和许多其他类型的信息都可以从该二进制文件中提取出来。
这并不是特定于ELF的:许多其它可执行格式(诸如COFF)也允许嵌入调试信息。
此外,调试信息的 * 格式 * 在不同的平台上是不同的。一些常见的UNIX调试信息是DWARFSTABSDWARF是更新的,功能更强大)。
如果您有一个ELF二进制文件,并且您怀疑它可能包含DWARF调试信息,您可以使用readelf -wi a.out对其进行解码(准备好有 * 很多 * 信息,如果存在的话)。objdump -g可以用于解码STABS(最近的objdump版本也可以解码DWARF)。
或者,正如tristan所建议的,您可以将可执行文件加载到GDB中并使用info typesptype命令。
如果二进制文件不包含调试信息,则DrPrItay的答案是正确的:您不能 * 轻易地 * 从它恢复结构定义。但是,您 * 仍然 * 可以通过使用反向工程技术来恢复它们。例如,Wine项目(example)使用的许多结构定义就是通过此类技术获得的。

xdyibdwo

xdyibdwo2#

据我所知,你不能。c / c++程序不像java,结构体不会获得符号。它们只是为编译器定义了如何在堆栈帧或其他内存中对齐和压缩变量(struct数据成员)。例如,与java不同,在加载共享对象的(c程序中没有头文件)你只能加载全局变量和函数。定义一个结构体就像创建一些数据类型,它的定义应该只在编译时出现,你没有在symtable中得到intchar的符号,那么为什么要为某个结构体得到符号呢?这根本没有意义。符号只用于编译器在编译时无法识别的对象-链接时/加载时/运行时

相关问题