如何手动创建可执行的.exe PE文件?

问题描述 投票:22回答:6

在解释了词法分析器和解析器之后,有关如何创建编译器的所有文章均停止。他们没有解释如何创建机器代码。我想了解端到端的过程。

[目前,我了解的是,Windows exe文件格式称为可移植可执行文件。我阅读了有关它的标题的信息,但还没有找到一个可以轻松解释此内容的资源。

我的下一个问题是,我看不到任何资源来解释机器代码如何存储在文件中。就像32位固定长度指令在.text节中一个接一个地存储吗?

是否有至少可以解释如何创建不执行任何操作的exe文件的地方(它具有No Op指令)。然后,我的下一步是链接到dll文件以打印到控制台。

windows compiler-construction linker executable portable-executable
6个回答
9
投票

很好的问题!我在这个特定问题上没有很多专业知识,但是这就是我的开始方式:

  1. PE或ELF不会创建纯机器代码。它还包含一些标头信息等。更多信息:Writing custom data to executable files in Windows and Linux

  2. 我假设您正在寻找ELF / PE文件如何保存机器代码,可以从以下问题中获取(使用objdump):How do you extract only contents of an ELF section

  3. 现在,如果您想首先了解内容部分是如何生成的,即机器代码是如何生成的,那么这就是compiler's code generation的任务。

  4. 尝试使用诸如ResourceEditor之类的资源编辑器来了解exe或只是ildasm

PS:这些主要是Unix解决方案,但是我敢肯定,PE应该做一些本质上相似的事情。

我认为解决该问题的最佳方法将是首先尝试分析现有的PE / ELF的工作原理,基本上是逆向工程。为此,Unix机器将是一个不错的起点。然后做你的魔术:)

不是相同但相似的问题here

更新:

我从示例C代码生成了一个对象转储。现在,我假设这就是您的目标对吗?您需要知道是否生成此文件(a.out)吗?

https://gist.github.com/1329947

看这张图,C代码的寿命。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS83TkxKZC5wbmcifQ==” alt =“在此处输入图像描述”>

Source现在,为了清楚起见,您正在寻求实现最后一步,即将目标代码转换为可执行代码?


3
投票

[在他的许多文章中,我会说Matt Pietrek's piece about PE internals在撰写后十多年来仍然是对此问题的最佳介绍。


2
投票

对于Linux,您可以阅读并运行以下示例乔纳森·巴特利特(Jonathan Bartlett)的“从头开始编程”:

http://www.cs.princeton.edu/courses/archive/spr08/cos217/reading/ProgrammingGroundUp-1-0-lettersize.pdf

然后,当然,您可能更喜欢破解Windows程序。但也许前者提供了一种更好的方法来了解实际情况。


1
投票

毫不奇怪,有关编写PE格式文件的最佳信息的网站都是关于创建病毒的信息。

VX Heavens中搜索“ PE”会提供大量有关修改PE文件的教程


1
投票

Iv使用“ Wotsit的文件格式”已经好几年了...一直追溯到MS-Dos时代:-)直到它只是一个文本文件集合,您都可以从大多数BBS系统中下载这些文件,称为“游戏程序员的文件类型百科全书”

现在由运行Gamedev.Net的人所有,并且可能是互联网上最保密的秘密之一。

您将在此页面上找到EXE格式:http://www.wotsit.org/list.asp?fc=5

享受。


1
投票

有关使PE文件尽可能小的一些信息:Tiny PE

如果您只是想尝试一些简单的事情,那么搞乱代码生成的简约方法是输出MS-DOS .COM files,它不包含标头或元数据。不幸的是,您只能使用16位代码。这种格式在demos中仍然比较流行。

至于指令格式,我记得x86指令集是可变长度的,包括1字节指令。 RISC CPU可能具有固定长度的指令。

© www.soinside.com 2019 - 2024. All rights reserved.