Compilation .exe是否仅由纯机器代码组成?

Compilation .exe是否仅由纯机器代码组成?,compilation,exe,Compilation,Exe,当任何高级编程语言被编译时,它被编译成对象代码,然后链接器将对象代码链接在一起,形成一个可执行文件 既然目标代码基本上是机器代码,那就意味着.exe是纯机器代码,对吗 如果这是真的,如果您知道.exe是用哪个机器代码生成的,是否可以将(.exe)机器代码转换为汇编语言,然后转换为高级语言(源代码) 回答第一个问题,不。可执行文件通常不包含纯机器代码,但也包含各种元数据,以帮助操作系统定位程序的依赖项(假设程序使用外部库),并包含嵌入其中的各种静态数据 通常,可执行文件由多个部分组成(尽管请记住“

当任何高级编程语言被编译时,它被编译成对象代码,然后链接器将对象代码链接在一起,形成一个可执行文件

  • 既然目标代码基本上是机器代码,那就意味着.exe是纯机器代码,对吗

  • 如果这是真的,如果您知道.exe是用哪个机器代码生成的,是否可以将(.exe)机器代码转换为汇编语言,然后转换为高级语言(源代码)


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

    通常,可执行文件由多个部分组成(尽管请记住“可执行文件”是什么取决于平台和操作系统),这些部分指定用于包含元数据、静态数据和可执行代码

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


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

    这一问题以前已经被问过很多次了

    对象文件和“二进制”文件(exe、coff、elf等)主要是机器代码,但通常不是所有的机器代码,文件中通常有一些信息来描述在何处加载二进制blob,以及调试信息,如标签等,如果你在其中构建了这些东西

    不可能完全确定使用哪种语言、编译器或汇编程序来创建可执行文件或对象。其中可能有一些元数据来指示这一点,但这很容易伪造。随着时间和经验的推移,您可能能够找出编译器或com版本特有的代码序列皮尔,但这也可能是某人手工编码或巧合

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

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


    对于处理处理器引导的工作,如微控制器或pc上的引导闪存,或类似需要prom映像的工作,有时会创建一个纯二进制文件,因为这是引导加载程序或prom程序员工具所需要的,尽管随着时间的推移,引导加载程序和prom程序员开始使用除了其他文件格式。

    .exe
    只是一个文件扩展名。许多文件在没有此文件扩展名的情况下是可执行的,比如
    .jar
    s、
    .bat
    s等等……这些文件不全是编译文件,有些甚至是解释文件。它可以“生成”它只需要响应适当的操作系统操作来调用它。例如,可以是一个简单的基本解释器和一堆要解释的基本语句。有“反汇编程序”和“反编译程序”,它们可以在任何地方执行从低级到普通的提取“原始”的工作代码。它们实际上只对那些一开始就相当优秀的黑客有用。@d请原谅,是的。我那些处理汇编语言和机器代码的朋友通常把它们当作同义词使用,所以我甚至没想过。我相信你把机器代码和