【问题标题】:Why Decompilers cant produce original code theoretically为什么反编译器理论上不能产生原始代码
【发布时间】:2011-07-13 20:42:40
【问题描述】:

我搜索了互联网,但没有找到具体的答案,说明为什么反编译器无法生成原始源代码。我没有得到满意的答复。某处写到它类似于停止问题,但不能说明如何。那么创建一个完美的反编译器的理论和技术限制是什么。

【问题讨论】:

  • 什么,cmets 和所有?那么所有可能已经完成的优化呢,只是再次撤消它们?为什么我把煮熟的鸡蛋放在冰箱里几分钟就不能得到一个生鸡蛋?

标签: decompiler


【解决方案1】:

很简单,这是一个多对一的问题。例如,在 C 中:

b++;

b+=1;

b = b + 1;

一旦编译器和优化器完成,可能都被编译成相同的操作集。它对事物进行重新排序,删除无效操作,并重写整个代码部分。当它完成时,它不知道你写了什么,只是一个很好的想法,你打算在原始 CPU(或 vCPU)级别发生什么。

它甚至足够聪明,可以删除不需要的变量:

{
a=5;
b=func();
c=a+b;
d=func2(c);
}
## gets rewritten as:
REGISTERA=func()
REGISTERA+=5
return(func2(REGISTERA))

【讨论】:

    【解决方案2】:

    对于初学者,编译程序时永远不会保留变量名。 ...所以它可能能做的最好的事情就是在你重构的程序中使用无意义的变量名。编译通常是一种单向转换 - 就像单向散列函数一样。像哈希一样,可能会生成其他可以哈希到相同值的东西,但是反编译的程序不太可能与您的原始程序完全相同。

    【讨论】:

      【解决方案3】:

      编译器抛出信息;并非源代码中的所有信息都在编译代码中。例如,在已编译的 Java 中,您无法区分参数化泛型类型和非参数化泛型类型,因为这些信息仅供编译器使用;一些注释只在编译时使用,不包含在编译输出中。这并不意味着您无法通过反编译获得某种源代码;它只是与实际源代码不匹配,也不会提供更多信息。

      【讨论】:

        【解决方案4】:

        源代码和编译代码之间通常不是一一对应的。如果实质上无限数量的可能源可以产生相同的目标代码(给定无限的变量名长度等),反编译器如何猜测要吐出哪个?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-27
          • 2012-07-06
          相关资源
          最近更新 更多