我们可以将十六进制文件转换回 .c 文件吗?

Posted

技术标签:

【中文标题】我们可以将十六进制文件转换回 .c 文件吗?【英文标题】:Can we convert a hex file back to .c file? 【发布时间】:2021-08-05 11:01:54 【问题描述】:

第一个 .c 文件是用 KEIL IDE 编写的嵌入式编码,从中生成 hex 文件。 现在我想将十六进制文件转换回 .c 文件。 可能吗? 如果是,怎么做?

【问题讨论】:

【参考方案1】:

很遗憾,这是不可能的。

您可以使用objdump -D 将代码反汇编成一个对象列表,但您甚至需要了解目标系统的一些知识才能识别哪些部分是代码和数据。如果你有这个并且可以阅读汇编代码,那么你可以找出代码的某些特定部分做了什么,但这是一个非常耗时的过程。

要完全转换回像 C 这样的高级语言,您需要一个反编译器。如果没有您正在使用的特定目标的详细信息,那么最好的建议是您只需在 Google 上搜索“反编译器”。

问题在于,尽管反编译器的输出是有效的 C,但它可能看起来与原始输入完全不同。十六进制文件不包含任何有关函数或变量名称的信息,因此每个对象都会有一个自动生成的名称,但意义不大。

【讨论】:

【参考方案2】:

就像你不能将蛋糕转换成它的成分一样,你也不能将机器代码转换为创建它的源代码。

源代码中出现的大部分内容是为了人类的利益或促进编译/链接过程,并在 hex 文件中被丢弃。

“反编译器”的尝试确实存在,但本质上是学术性的或实验性的,或者使用由特定编译器生成的特定代码,并且难以处理通过编译器优化生成的代码。此外,此类工具与目标文件(Keil ARM 中的 .axf)一起工作,这些文件可能保留一些反编译器可以在其上工作的元数据,例如入口点或可能的符号或调试信息。十六进制文件只是一种二进制图像编码,并且剥离了所有元数据 - 它只是机器代码指令和程序数据。

【讨论】:

如果你有一个库,反汇编程序可能会使用 *.h(或 iow API 描述)来提供或多或少有意义的结果(不要忘记 ABI 约定) .所以,尝试反编译器毕竟不是坏主意。

以上是关于我们可以将十六进制文件转换回 .c 文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

批量将CSV文件转换为十六进制文件[关闭]

如何将十六进制字符串转换为C中的二进制文件

如何将十六进制值的总和转换回十六进制值

C语言 将99(十进制)转为0x99(十六进制)并输出?

java 十六进制到 int 的转换 - 必须删除 0X 吗?

c ++将字符串转换为十六进制[重复]