下载 hex 并从 avr 反编译
Download hex and decompile it from avr
我有 Orange PI ubuntu 通过 usbasp 连接到 atmega328p。
我用 C 开发了一个程序,编译它,翻译成十六进制并上传到 atmega,但是由于一些奇怪的行为,file.c 丢失了。
我怎样才能从 atmega 取回我的程序?
好消息:绝对有可能。
坏消息:但这需要大量工作,具体取决于应用程序的大小。我用 C、BASCOM 或 C++ (Arduino) 编写的 AVR 代码不止一次这样做。这需要几个小时,例如 BASCOM 中的 100 衬里大约需要 20 个小时。
方法是:
- 反汇编十六进制文件。使用此输出作为参考。您可能需要一些选项才能在输出中包含所有常量数据。
- 从您记忆中最接近的来源开始。
- 编译,link也转换成HEX文件。
- 反汇编此 HEX 文件,并将输出与参考文件进行比较。
- 重复编辑您的源代码,直到两个反汇编相等。
备注:
- 您需要深入了解从 C 语言到机器代码的翻译。
- 函数名和变量名无法准确重建。这些名称在编译和 linking 后消失了。
- 请注意,结果代码中函数的顺序可能不取决于它们在源代码中的出现。不过,大多数编译器都会这样做。
- 请注意,变量在内存中的顺序可能不取决于它们在源代码中的出现,而是取决于它们的名称。此外,它们通常不按词法排序,例如我发现 GCC 使用某种哈希算法。但是,结构成员保持其顺序,因为标准要求如此。
- 在第一阶段,忽略变量放置的差异。
- 尝试识别 C 库的函数,并忽略它们。尤其是
printf()
家族用它绘制了很多其他函数。当您完成自己的代码时,库函数很可能也会在那里。
最后说明:如果你碰巧有ELF文件,用它来反汇编和查找名称。你会快很多。
我有 Orange PI ubuntu 通过 usbasp 连接到 atmega328p。 我用 C 开发了一个程序,编译它,翻译成十六进制并上传到 atmega,但是由于一些奇怪的行为,file.c 丢失了。 我怎样才能从 atmega 取回我的程序?
好消息:绝对有可能。
坏消息:但这需要大量工作,具体取决于应用程序的大小。我用 C、BASCOM 或 C++ (Arduino) 编写的 AVR 代码不止一次这样做。这需要几个小时,例如 BASCOM 中的 100 衬里大约需要 20 个小时。
方法是:
- 反汇编十六进制文件。使用此输出作为参考。您可能需要一些选项才能在输出中包含所有常量数据。
- 从您记忆中最接近的来源开始。
- 编译,link也转换成HEX文件。
- 反汇编此 HEX 文件,并将输出与参考文件进行比较。
- 重复编辑您的源代码,直到两个反汇编相等。
备注:
- 您需要深入了解从 C 语言到机器代码的翻译。
- 函数名和变量名无法准确重建。这些名称在编译和 linking 后消失了。
- 请注意,结果代码中函数的顺序可能不取决于它们在源代码中的出现。不过,大多数编译器都会这样做。
- 请注意,变量在内存中的顺序可能不取决于它们在源代码中的出现,而是取决于它们的名称。此外,它们通常不按词法排序,例如我发现 GCC 使用某种哈希算法。但是,结构成员保持其顺序,因为标准要求如此。
- 在第一阶段,忽略变量放置的差异。
- 尝试识别 C 库的函数,并忽略它们。尤其是
printf()
家族用它绘制了很多其他函数。当您完成自己的代码时,库函数很可能也会在那里。
最后说明:如果你碰巧有ELF文件,用它来反汇编和查找名称。你会快很多。