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