可执行文件的文件大小怎么会这么小?
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。
我一直在 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。