【发布时间】:2011-06-09 00:36:52
【问题描述】:
是否可以确定库中结构(C 语言)中的元素(名称和数据类型)?如果是,如何用 C 语言来做?如果C语言不支持,是否可以通过其他技巧获取结构元素或者有什么工具可以实现?
【问题讨论】:
标签: c programming-languages reverse-engineering structure
是否可以确定库中结构(C 语言)中的元素(名称和数据类型)?如果是,如何用 C 语言来做?如果C语言不支持,是否可以通过其他技巧获取结构元素或者有什么工具可以实现?
【问题讨论】:
标签: c programming-languages reverse-engineering structure
不,这是不可能的。 C 没有内置的反射样式支持。
【讨论】:
您的意思是在编程时找出,还是在运行时动态找出?
对于前者,当然。只需找到您包含的 .h 文件,您就会在那里找到包含所有字段的结构定义。
对于后者,不,这是不可能的。 C 将结构编译为机器代码,以使所有这些信息都丢失。例如,如果您有一个结构 {int x, float y, int z},并且您有一些代码显示
a = mystruct.y
在机器代码中,剩下的就是找到指向mystruct的指针,向它添加4(int的大小),然后从那里读取4个字节,然后对其进行一些浮点运算.这些结构字段的名称和类型根本无法访问,因此无法在运行时找到它们。
【讨论】:
mystruct 在哪里(也许它会从堆栈中取出地址),然后它将执行必要的算术。但是那里没有足够的信息来知道运行时字段的名称和类型。
如果“确定结构的元素”是指“以编程方式获取该结构类型的声明”,那么我认为这是不可能的——至少不是可移植的。与 C++ 或 Java 等更现代的语言相反,C 不会以实际程序可用的形式保存类型信息。
编辑:
澄清我关于它不可能“便携”的评论:
很可能有一些编译器+调试格式组合将必要的信息嵌入到它生成的目标文件中,尽管我不能说我知道其中之一。然后,假设您可以让程序打开自己的可执行文件并解析调试信息。但这是一种繁琐而脆弱的方法,充其量是......
为什么你需要做这样的事情?
【讨论】: