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

Kar*_* K. 7 exe compilation

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

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

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

Mar*_*erg 7

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

通常,可执行文件由各个部分组成(但请记住"可执行文件"取决于平台和操作系统),这些部分被指定用于包含元数据,静态数据和可执行代码.

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

在Linux系统上,您通常可以使用readelfobjdump工具检查一些元数据.其他平台可能有等价物


Eag*_*Eye 5

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

  • 我相信您在答案中切换了机器代码和汇编。 (2认同)