可执行文件的文件大小怎么会这么小?

How can an executable be this small in file size?

我一直在 Metasploit 上生成有效载荷,并且一直在试验不同的模板和其中一种模板,您可以按原样使用有效载荷 exe-small。我生成的有效载荷类型是 windows/meterpreter/reverse_tcp,仅使用普通的 exe 模板,它的文件大小约为 72 KB,但 exe-small 输出的有效载荷大小为 2.4kb。为什么是这样?我如何将其应用到我的编程中?

几乎不需要可执行文件很大,除非它包含我称之为垃圾代码的代码,这些代码实际上对 program/exe 的功能并不重要。这对其他文件也有效。查看手动编写的 HTML 页面与 FrontPage 中编写的页面的对比。那是垃圾邮件代码。

我记得我的旧 DOS 文件都是 KB 大小,并且在 OS 中执行几乎任何需要的任务。我的一个 .exe(实际上是 .com)只有 20 个字节。

这样想:就像在某些情况下,Windows OS 中包含的大部分文件都可以删除,但 OS 仍然可以完美运行, 它与 .exe 文件相同:大部分代码要么无用,要么与 objective 目的不同,或者是有意添加的(见下文)。

这种畸变的高峰是现在一些使用高级复制保护的游戏.exe文件中添加的代码,可以使文件大到几十MB。 运行 游戏实际需要的代码实际上不到完整代码的 10%。

在您的示例中,72 KB 的文件大小几乎足以对 windows OS.

执行任何操作

要将此应用于您的编程,如制作非常小的 .exe,请保持简单。不要仅仅为了它的外观而添加不必要的代码,或者认为您将在某个点使用 program/code 的那部分。

这么小的EXE,图标一般用得最多space。通常,该图标包含各种大小和配色方案,如果您不在乎有 "old, rusty" 图标或根本没有图标,您可以删除它们。

当您签署 EXE 时,space 也使用了一些 4k。

作为小型 EXE 的示例,请参阅 never10 by grc。有一个详细页面突出了以上几点:

https://www.grc.com/never10/details.htm

在最后一段中:

A final note: I'm a bit annoyed that “Never10” is as large as it is at 85 kbyte. The digital signature increases the application's size by 4k, but the high-resolution and high-color icons Microsoft now requires takes up 56k! So without all that annoying overhead, the app would be a respectable 25k. And, yes, of course I wrote it in assembly language.

免责声明:我与 grc 没有任何关联。

最小的 PE 文件只有 97 个字节 - 而且它什么都不做(只是 return)。

今天最小的可运行 executable 是 133 字节,因为 Windows 需要加载 kernel32。无法执行没有导入的 PE 文件。

在那个大小下,它已经可以通过在导入中指定 UNC 路径从 Internet 下载负载 table。

要实现这么小的executable,你必须

  • 在汇编程序中实现,主要是摆脱 C 运行时
  • 减少默认为 1024 的文件对齐方式
  • 删除打印消息 "This program cannot be run in DOS mode"
  • 的 DOS 存根
  • 将部分PE部分合并到MZ中header
  • 删除数据目录

完整的描述可在更大的研究中找到 blog post called TinyPE