c++ - 手动创建PE

标签 c++ c windows winapi assembly

我在 Windows 7 中使用 nasm 制作了一个简单的 MessageBox,我对生成的文件的大小有点不满意:2.51 kb。

extern MessageBoxA
extern ExitProcess

import MessageBoxA user32.dll 
import ExitProcess kernel32.dll

section .text use32 

..start: 

push 0
push sCapt
push sText
push 0
call [MessageBoxA]


push 0
call [ExitProcess] 

section .data 

sCapt db 'test', 0
sText db 'test2', 0

所以我在 OllyDbg 中打开了可执行文件,它似乎生成了很多不必要的东西。

ollydbg

因此,为了了解更多信息,我想直接将这个程序制作为十六进制,以保持尽可能小的大小!我进行了搜索,但没有找到任何教导如何手动创建 PE 可执行文件的内容。

如果有人能给我链接或解释如何做,我将不胜感激!

最佳答案

您可以通过修改链接器的节对齐选项来使程序变得更小,但结果可能不严格符合 Win32 PE 镜像的对齐规则。 EXE 可能无论如何都会运行,但某人 - 或者 Windows、WINE 或 ReactOS 的某些部分 - 可能实际上依赖于这些规则,这意味着您会对 Heisenbugs 持开放态度。

也就是说,在 What is the smallest possible Windows (PE) executable? 中您可以找到制作最小的可行 PE 所需的信息。从那里链接的相关页面是 Tiny PE ,其中 Alexander Sotirov 描述了制作尽可能小的 EXE 的技巧。就像覆盖标题结构、将它们折叠起来等等......

wiki article on the PE format有概述和很多有用的链接。

P.S.:如果将一些较小的可执行文件映射到内存比必要的更复杂,那么它们实际上可能比正确对齐的可执行文件加载慢几微秒。除此之外,对于一页大小(即大多数 Win32 系统上的 4 KB)的任何内容,加载时间不应该有任何明显的差异,除非您正在处理扇区小于 Windows 的软盘和其他介质页面大小。无论如何,与创建进程(地址空间等)和动态链接的开销相比,它都显得相形见绌。

关于c++ - 手动创建PE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26475653/

相关文章:

CYGWIN Ms-Dos 路径检测到警告

windows - Windows 中的进程层次结构

c++ - linux和windows串口通信

c++ - 有没有办法在 C++ 中静态初始化动态分配的数组?

c++ - 输出声明堆在释放后被修改,但没有添加到堆中

c++ - C++ 中的异常类不起作用

c++ - fwrite 失败(返回 0,perror 给出 "Bad address")

c++ - 成员函数指针数组 : Getting 0xcccccccc when control reached pointer to member function

c - 减轻轮询环形缓冲区的影响

windows - 从两组文本文件中提取唯一的行