1

我正在尝试在汇编中编写一个程序并使生成的可执行文件尽可能。我正在做的一些事情需要对WriteProcessMemory 等函数进行Windows API 调用。我在调用这些函数方面取得了一些成功,但是在编译和链接之后,我的程序出现在 14-15 KB 的范围内。(来自不到 1 KB 的来源)我希望的远比这要少得多。

我对做这样的低级事情很陌生,所以我真的不知道需要做什么才能使程序更小。我知道 exe 格式本身占用了相当多的空间。有什么办法可以减少这种情况吗?

我应该提到我正在使用 NASM 和 GCC,但如果有帮助,我可以轻松更改。

4

5 回答 5

3

请参阅Tiny PE,了解可用于减小可执行文件最终大小的一系列提示和技巧。请注意,该文章中的一些后期技术非常脆弱。

于 2009-06-02T22:30:46.910 回答
2

大多数 PE 文件的默认节对齐方式是 4K,以与自然系统内存布局对齐。如果您有 .data、.text 和 .resource 部分 - 已经是 12K。大部分都是0,浪费空间。

您可以采取一些措施来尽量减少这种浪费。首先,将节对齐减少到 512 字节(不知道 nasm/gcc 所需的选项)。其次,合并这些部分,以便您只有一个 .text 部分。尽管对于打开 NX 位的现代机器来说,这可能是一个问题。此安全功能可防止对可执行代码部分的修改,例如病毒。

还有大量的 PE 压缩工具可以压缩你的 PE 并在执行时解压缩它。

于 2009-06-02T22:22:11.950 回答
0

我建议使用DumpBin实用程序(或 GNU 的 objdump)来确定占用最多空间的内容。它可能是资源文件、巨大的全局变量或类似的东西。

于 2009-06-02T22:12:27.850 回答
0

FWIW,我可以使用 ML 或 ML64 组装的最小程序约为 3kb。(这只是说你好世界并退出。)

于 2009-06-03T06:52:57.797 回答
0

给我一个小 C 程序(不是 C++),我会告诉你如何用它制作一个 1 ko .exe。我推荐的最小可执行文件大小是 1K,因为如果它不是至少这个大小,它将无法在某些 Windows 上运行。

您只需使用链接器开关即可实现!polink 是一个很好的链接器。

如果您在 Assembly 中完成所有操作,那就更容易了。只要去 MASM32 论坛,你就会看到很多这样的程序。

于 2009-06-08T00:15:21.270 回答