为什么反编译器理论上不能生成原始代码

时间:2011-07-13 20:42:41

标签: decompiler

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

4 个答案:

答案 0 :(得分:4)

很简单,这是一个多对一的问题。例如,在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))

答案 1 :(得分:3)

对于初学者,编译程序时永远不会保留变量名。 ...所以可能做的最好的事情就是在整个重组程序中使用无意义的变量名。编译通常是单向转换 - 就像单向散列函数一样。与散列一样,可能会生成其他可以散列到相同值的其他内容,但反编译程序与原始程序完全相同的可能性极小。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

源代码和编译代码之间通常不存在一对一的对应关系。如果基本上无限多个可能的源可能导致相同的目标代码(给定无限的变量名称长度等),反编译器如何猜测哪一个吐出来?