.exe仅由纯机器代码组成吗?

时间:2014-07-26 18:03:33

标签: compilation exe

当编译任何高级编程语言时,它会被编译为目标代码,然后链接器将对象代码链接在一起以生成可执行文件。

  1. 由于目标代码基本上是机器代码,那意味着.exe是纯机器代码,我是对的吗?

  2. 如果这是真的,你是否可以知道使用.exe创建的机器代码将该(.exe)机器代码转换为汇编代码,然后转换为高级语言(源代码)?

3 个答案:

答案 0 :(得分:7)

回答你的第一个问题,没有。可执行文件通常不包含纯机器代码,但还包含各种元数据以帮助操作系统定位程序的依赖关系(假设程序使用外部库)并且还包含嵌入的各种静态数据。

通常,可执行文件包含各种部分(但请记住“可执行文件”取决于平台和操作系统),这些部分用于包含元数据,静态数据和可执行文件代码。

要回答您的第二个问题,是的,可以将您的可执行文件转换为程序集(至少 part 您的可执行文件将包含纯机器代码,它具有相关汇编语言的1:1映射但是,将它转换为更高级别的语言是不太可能的(虽然可能是一个智能应用程序可能会给出一些猜测)。通常你会发现能够进入EXE的调试器并向你显示当前正在执行的行和文件 - 这是唯一可能的,因为可执行文件本身的附加元数据将某个指令偏移量映射到某个文件/行中。代码。

在Linux系统上,您通常可以使用readelfobjdump工具检查部分元数据。其他平台也可以使用等价物

答案 1 :(得分:4)

标准的Windows .EXE文件主要包含x86或x86-64程序集,但它还包含一个标头。可以将该文件中的程序集拆分为机器代码。将x86或x86-64机器代码转换为更高级别的语言非常困难,而且我不知道任何以傻瓜式方式执行此操作的程序(IDA反汇编程序或其插件最接近,但是据我所知,但它没有使用可编译的C代码;实际上,它甚至没有使用标准汇编语言来显示它的纯反汇编代码,这意味着你无法将输出提取到文件中并使用从中创建新的.EXE的汇编程序。很难以傻瓜式的方式反汇编.EXE,因为你不能只从文件中的任意位置开始。操作码可以是可变长度的,并且可以采用可变数量的参数,因此给定位置可以是操作码,操作码的参数,存储在.EXE中的数据以供其他操作码访问,注入到.EXE中的诊断数据标题的一部分,甚至完全未使用(我确定我忘了一些可能性)。通过遵循程序流程,您通常可以确定程序用于什么的大量内容,但某些事情只能通过模拟从我理解的程序运行程序来确定。另外值得注意的是,您还可以拥有几乎完全包含CIL代码而不是程序集的.EXE文件(由.NET框架和Mono使用)。

答案 2 :(得分:3)

之前已经多次询问过这个问题。

目标文件和"二进制"文件(exe,coff,elf等)大多是机器代码,但通常不是所有机器代码,文件中通常会有一些信息来描述加载二进制blob的位置以及调试信息,如标签等等。建造那些东西。

不可能完全确定使用哪种语言或编译器或汇编程序来创建可执行文件或对象。可能存在一些元数据来表明这一点,但这很容易被伪造。有了时间和经验,您可以选择特定于编译器或编译器版本的代码序列,但也可能是某人手工编码或巧合。

从高级语言到二进制文件,每个阶段都会删除信息,从原始变量名称到死代码消除,优化等等。如果您的兴趣是反编译,那么你真的无法回到你的开始,它是一个有损的过程。

现在一些语言二进制文件不是目标的机器代码,而是一些下一级解释,例如java,或者JIT编译器二进制格式,后来运行时,它被解释或编译并组装成本机机器代码。即使在这些情况下,通常也会希望成为不是所有机器代码的文件格式。

对于处理处理器启动的工作,例如微控制器或PC上的启动闪存或需要prom图像的地方,有时会创建纯二进制文件,因为这是引导程序需要的或者舞会程序员工具需要,虽然随着时间的推移,bootloaders和舞会程序员开始接受其他文件格式。