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

Debugging 从可执行文件中提取结构定义,debugging,elf,debug-symbols,readelf,Debugging,Elf,Debug Symbols,Readelf,我需要从可执行文件中提取结构定义。我该怎么做? 我听说我们可以用ELF来做,但不知道怎么做。有什么帮助吗?据我所知,你不能。C/C++程序不像java,结构不需要符号。它们只是为编译器定义了如何在堆栈帧或某些其他内存(结构数据成员)中对齐和打包变量。例如,与java不同的是,在加载共享对象(c程序中不包含头文件)时,没有类似于类加载的功能,只能加载全局变量和函数。定义一个结构就像创建一些数据类型,它的定义应该只在编译时出现,你在符号表中找不到int或char的符号,那么你为什么要为一些结构定义符

我需要从可执行文件中提取结构定义。我该怎么做?
我听说我们可以用ELF来做,但不知道怎么做。有什么帮助吗?

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

我听说我们可以用ELF来做,但不知道怎么做

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

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

此外,调试信息的格式在不同平台之间是不同的。一些常见的UNIX操作系统是
DWARF
stab
(其中
DWARF
更新,功能更强大)

如果您有一个
ELF
二进制文件,并且您怀疑它可能包含
DWARF
调试信息,您可以使用
readelf-wi a.out
对其进行解码(如果存在大量信息,请做好准备)
objdump-g
可用于解码
stab
(最近的
objdump
版本也可以解码
DWARF

或者,按照tristan的建议,您可以将可执行文件加载到GDB中,并使用
info-types
ptype
命令


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

如果二进制文件中有debuginfo,只需使用gdb
ptype
commandmy从原始内存中获取结构的方法是读取函数参数的文档,然后从那里开始,大多数结构的函数参数指向内存地址。“据我所知,你不能。”你还有很多东西要学。