我一直在想,如果每个程序都基于机器码,我们是否可以在遇到机器码并使其成为真正的编程语言之前对程序进行反编译?
如何以100%的速度反编译exe文件?如果我的计算机理解它应该执行的过程,它是不是也能够返回我完成的步骤,从内存中提取的值……?
如何反编译一个exe文件而不出错?
我一直在想,如果每个程序都基于机器码,我们是否可以在遇到机器码并使其成为真正的编程语言之前对程序进行反编译?
如何以100%的速度反编译exe文件?如果我的计算机理解它应该执行的过程,它是不是也能够返回我完成的步骤,从内存中提取的值……?
如何反编译一个exe文件而不出错?
我一直在想,如果每个程序都基于机器码,我们是否可以在遇到机器码并使其成为真正的编程语言之前对程序进行反编译?
这个问题是基于一个错误的前提;即每个程序都基于机器代码。程序通常是用高级语言编写的,这些语言在设计上与体系结构无关,因此必须翻译成特定于体系结构的形式才能执行:
“高级”编程语言的名称来自它们提供的功能相对较高的级别或抽象程度,相对于它们最初设计用来替换的汇编语言的功能而言。在这种情况下,形容词“抽象”是指语言特征与任何特定计算机体系结构的细节分离的程度。1
机器独立是一个相当简单的概念。基本上它说编程语言不应该依赖任何特定指令集的特性来有效实现。1
编程语言是形式语言的例子:
将程序源文件中用编程语言编写的一系列语句翻译成语义上等效的目标代码是由编译器完成的。反编译涉及将依赖于体系结构的目标代码转换为非体系结构特定的语义等效表示(源代码),这是编译的逆过程。
如何以100%的速度反编译exe文件?
这似乎是不可能的。
当然,对任意机器代码程序进行全自动反编译是不可能的——这个问题在理论上等同于计算机科学中的一个不可判定的问题——停机问题。这意味着对于曾经编写过的所有可能的程序,无法实现自动(没有专家干预)反编译。此外,即使取得了一定程度的成功,自动生成的程序也可能缺少有意义的变量和函数名称,因为它们通常不会存储在可执行文件中(除非出于调试目的而存储)。2
可以在此处找到对反编译带来的挑战的进一步描述:
事实上,正确反汇编(更不用说反编译)是一个重大挑战:
1. Scott, Michael L.编程语言语用学。第 3 版。第 111 页
2.是否可以反编译?