2012-08-30 183 views
3

我正在寻找10,000+行汇编程序中的错误,并在将来进行维护。它涉及PIC18微芯片微控制器的汇编代码。该代码是由一位不再可用的前同事编写的,他没有留下任何文档,他的代码评论很差。该代码还使用了一些直接转到和胸罩的和相对的(例如$ + 0x06),所以我非常不愿意编辑它。反编译汇编程序到c

我宁愿将他的汇编源代码反编译成'新'C代码(或C++)并从那里开始工作。我想知道:

  1. 是反编译汇编器 - > C代码100%的功能?
  2. 直接和相对goto会发生什么?
  3. 是否有任何免费或廉价的工具可用于反编译PIC18代码?
+1

正是因为这个原因,你应该正确地评论你的代码。 – poitroae

+2

我不认为你可以做到这一点。噢,我喜欢认为所有产品都有C编译器,包括PIC18。你是否用Google搜索过?一切重新开始。程序集的10000 LOC可能在C中大约为1000 LOC。 – nullpotent

+2

反编译器取得了一些进展,但它们仍然没有真正的工作,特别是对于看起来不像“典型编译器输出”的代码。你通常得到的是“汇编但是C语法” - 这并不能真正清除很多东西。 – harold

回答

4

我是这样看的:

  1. 没有,我期望这是可能的,因为没有保证C能准确地表达一切特定的CPU可以在组件级别的方式做这足够直接使得可以在反编译器中实现。当然,他们都是都灵完整的,但魔鬼肯定在细节中,在这里。
  2. 这是一个特定的问题,例如。装配当然可以跳过例如进入C语句的中间,这使得翻译变得复杂。
  3. 我不这么认为,没有。

有关问题空间的更多信息,请查看Boomerang project's FAQ

2

非mips图片编译器非常不友好,使用C在消耗极限资源方面速度慢并且代价高昂。

gotos和branches是处理器如何工作的,没有错。

我会先删除相关分支并将其替换为标签,但通过比较预修改代码和修改后代码的二进制代码,您应该检查一下是否没有添加新的错误。一旦相关分支都使用标签,您就可以添加或删除代码,而不用担心打破别的东西。

反编译器不工作,不能工作。这就像尝试从你的肠道中拿出午餐的薯条,并尝试恢复原来的马铃薯(当然,除非是皮肤上的薯条,否则不需要皮肤)。原始数据源经过多次烹饪和处理后,才会被汇入汇编器,然后如果使用对象和链接器,它会被再次烹饪(以及被加热)。在无法恢复的道路上丢失了太多的材料。

非常有可能做一个静态的二进制翻译,并获得一些C语言的东西,但比asm更难读取和维护,特别是带有标志的体系结构。翻译者不会完美地移除所有的死码。每条添加指令都将是自己加上代码以检测溢出,如果溢出设置标志,否则清除,如果结果等于零设置标志,否则清除是否设置了msbit设置n位否则清除,如果存在如果有符号溢出,则设置v位清除,一条简单的asm行会变成10行C代码,除非转换程序可以自动删除该死代码。

+0

“*反编译器不工作,不能工作*” - 也就是说“你不能从程序集中生成等价的高级代码”,这当然是错误的,因为将程序集转换为等效的C代码是非常常见的*逆向工程*实践。当然,没有办法通过反编译来恢复*原始*源代码,但是没有任何东西可以阻止将汇编逻辑转换为C逻辑 - 例如,如果生成的代码可以编译或不编译,则取决于反编译器的质量虽然。当然,反编译几乎总是只是一个工具,绝对不是最终的解决方案。 – zxcdw

+0

了解..... –

0

尽管反编译本身在某种程度上是可能的,但它是否适用于您的情况是另一件事情,它取决于可用的软件。就我个人而言,我会开始手动解密代码,并用C粗略重构代码。当然,这是一项单调乏味的任务,可能涉及很多错误和错误,但是如果您应该维护代码库,那么尝试使这个任务稍后会尽可能简单 - 也许未来的维护人员也会很感激你的工作。