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

时间:2016-08-09 20:28:05

标签: debugging elf debug-symbols readelf

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

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

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

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

此外,调试信息的格式在不同平台之间是不同的。一些常见的UNIX是DWARFSTABSDWARF更新,更强大)。

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

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

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