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