我搜索了互联网,但没有找到具体的答案,说明为什么反编译器无法生成原始源代码。我没有得到满意的答复。某处写到它类似于停止问题,但不能说明如何。那么创建一个完美的反编译器的理论和技术限制是什么。
问问题
335 次
4 回答
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))
于 2011-07-13T20:47:22.930 回答
3
对于初学者,编译程序时永远不会保留变量名。...所以它可能做的最好的事情就是在整个重组程序中使用无意义的变量名。编译通常是一种单向转换 - 就像单向散列函数一样。像散列一样,可能会生成其他可以散列到相同值的东西,但是反编译的程序不太可能与您的原始程序完全相同。
于 2011-07-13T20:46:51.540 回答
2
编译器抛出信息;并非源代码中的所有信息都在编译代码中。例如,在已编译的 Java 中,您无法区分参数化和非参数化泛型类型,因为这些信息仅供编译器使用;一些注释只在编译时使用,不包含在编译输出中。这并不意味着您无法通过反编译获得某种源代码;它只是不匹配,也不会像实际的源代码那样提供信息。
于 2011-07-13T20:47:40.697 回答
1
源代码和编译代码之间通常没有一一对应的关系。如果本质上无限数量的可能源可能导致相同的目标代码(给定无限的变量名称长度等),反编译器如何猜测要吐出哪个?
于 2011-07-13T20:47:49.540 回答