【问题标题】:Finding the elements in a structure in C language用C语言查找结构中的元素
【发布时间】:2011-06-09 00:36:52
【问题描述】:

是否可以确定库中结构(C 语言)中的元素(名称和数据类型)?如果是,如何用 C 语言来做?如果C语言不支持,是否可以通过其他技巧获取结构元素或者有什么工具可以实现?

【问题讨论】:

    标签: c programming-languages reverse-engineering structure


    【解决方案1】:

    不,这是不可能的。 C 没有内置的反射样式支持。

    【讨论】:

      【解决方案2】:

      您的意思是在编程时找出,还是在运行时动态找出?

      对于前者,当然。只需找到您包含的 .h 文件,您就会在那里找到包含所有字段的结构定义。

      对于后者,不,这是不可能的。 C 将结构编译为机器代码,以使所有这些信息都丢失。例如,如果您有一个结构 {int x, float y, int z},并且您有一些代码显示

      a = mystruct.y
      

      在机器代码中,剩下的就是找到指向mystruct的指针,向它添加4(int的大小),然后从那里读取4个字节,然后对其进行一些浮点运算.这些结构字段的名称和类型根本无法访问,因此无法在运行时找到它们。

      【讨论】:

      • 谢谢回复,但是如何在机器码中找到指向mystruct的指针呢?
      • 您需要阅读程序集并理解它(完全不同的语言)。但我不认为这就是你的意思。当我说“类似于找到指向 mystruct 的指针”时,您可能误解了。我的意思是生成的代码会知道mystruct 在哪里(也许它会从堆栈中取出地址),然后它将执行必要的算术。但是那里没有足够的信息来知道运行时字段的名称和类型。
      【解决方案3】:

      如果“确定结构的元素”是指“以编程方式获取该结构类型的声明”,那么我认为这是不可能的——至少不是可移植的。与 C++ 或 Java 等更现代的语言相反,C 不会以实际程序可用的形式保存类型信息。

      编辑:

      澄清我关于它不可能“便携”的评论:

      很可能有一些编译器+调试格式组合将必要的信息嵌入到它生成的目标文件中,尽管我不能说我知道其中之一。然后,假设您可以让程序打开自己的可执行文件并解析调试信息。但这是一种繁琐而脆弱的方法,充其量是......

      为什么你需要做这样的事情?

      【讨论】:

      • 我有一个结构,我通过 API 将数据打包到其中,但如果我尝试在控制台上打印值,它不会打印正确的值。因此,如果我知道数据存储在结构内部的确切位置,我将能够将其打印出来,从而尝试找到结构的特定元素。
      • @S.Man:你能用一些示例代码更新你的问题吗?大多数生成具有可变格式的结构(通常使用联合)的 C API 也有一个或多个字段,以便您可以判断每个实例符合哪种格式。如果格式不可变,那么你应该直接引用元素,
      • 根据 Wikipedia,C++ RTTI 仅适用于具有至少一个虚拟方法的对象。这意味着 C++ 不对 C 风格的结构执行 RTTI。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      相关资源
      最近更新 更多