c-下载十六进制并从avr反编译



我有Orange PI,ubuntu通过usbasp连接到atmega328p。我用C语言开发了一个程序,编译后翻译成十六进制并上传到atmega上,但由于一些奇怪的行为,文件.C丢失了。如何从atmega取回我的程序?

好消息是:这是可能的。

坏消息:但这需要做很多工作,具体取决于应用程序的大小。我用C、BASCOM或C++(Arduino(编写的AVR代码不止一次这样做。这需要几个小时,例如BASCOM的100班轮大约需要20个小时。

方法是:

  1. 拆下HEX文件。使用此输出作为参考。您可能需要一些选项来在输出中包含所有常量数据
  2. 从你记忆中保存的来源的最佳近似值开始
  3. 编译、链接并将其转换为HEX文件
  4. 拆下这个HEX文件,并将输出与参考进行比较
  5. 重复编辑源,直到两个反汇编相等

备注:

  • 您需要深入了解从C到机器代码的翻译
  • 函数和变量的名称无法准确地重建。经过编译和链接,这些名称就不见了
  • 请注意,结果代码中函数的顺序可能不取决于它们在源代码中的外观。不过,大多数编译器都是这样做的
  • 请注意,变量在内存中的顺序可能不取决于它们在源中的外观,而是取决于它们的名称。此外,它们通常不按词汇排序,例如,我发现GCC使用某种哈希算法。然而,structs的成员保持它们的顺序,因为标准要求这样做
  • 在第一阶段,忽略变量放置的差异
  • 尝试识别C库的函数,并忽略它们。尤其是printf()家族,它还绘制了许多其他函数。当你自己的代码完成后,库函数很可能也会出现

最后注意:如果您碰巧有ELF文件,请使用它来分解和查找名称。你会更快。

最新更新