一个可执行文件如何可以在文件大小这么小?

问题描述:

我一直在Metasploit上生成有效载荷,我一直在尝试使用不同的模板和其中一个模板,您可以使用有效载荷为exe-small。我已经生成的有效载荷类型是windows/meterpreter/reverse_tcp,只是使用正常的exe模板,它的文件大小约为72 KB,但是exe-small输出的大小为2.4kb。为什么是这样?我怎么能将这个应用于我的编程?一个可执行文件如何可以在文件大小这么小?

尽可能最小的PE文件只有97个字节 - 它什么也没做(只是返回)。

今天最小的可运行可执行文件是133字节,因为Windows需要加载kernel32。无法导入的情况下执行PE文件是不可能的。

在此大小下,它可以通过在导入表中指定UNC路径从Internet下载有效载荷。

要实现这样一个小的可执行文件,你必须

  • 汇编实现,主要是为了摆脱C运行时的
  • 减小文件对准它默认
  • 是1024取出DOS存根打印信息“此程序无法在DOS模式下运行”
  • 将部分PE部件合并到MZ标头
  • 删除数据目录

完整的说明可在较大的研究blog post called TinyPE

+0

我不同意。阅读我的初始答复。我有一个20字节的有效.com文件,我一直在MS-DOS时间使用。 – Overmind

+0

@Overmind:COM文件不是PE文件,所以没有差异。该文件是否仍然在当今的Windows(7或更高版本)上运行? COM文件没有标题,也没有元数据等。另外请注意:这个问题是从Metasploit上下文中的Security.SE迁移过来的,我假设有人想要下载恶意负载,而您可能无法在20字节的COM文件中。 –

+2

它不能在64位上运行,因为它是一个16位可执行文件。 – Overmind

对可执行文件的需求很少,除非它包含我称之为垃圾邮件的代码,代码对于程序/ exe的功能实际上并不重要。这对其他文件也是有效的。看看手动编写的HTML页面与用FrontPage编写的HTML页面进行比较。这是spamcode。

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

想想这样:就像在某些情况下,Windows操作系统中包含的大部分文件都可以被删除,操作系统仍然可以完美运行,这与.exe文件一样:大部分该代码要么没有用,要么与相关目标不同,或者有意添加(见下文)。

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

在您的示例中,文件大小为72 KB可以足够执行windows操作系统的任何操作。

要将它应用到您的编程中,就像在非常小的.exes中一样,保持简单。不要为代码的外观添加不必要的代码,或者考虑在某一点使用程序/代码的那部分代码。

对于EXE这个小的,最大的空间通常用于图标。通常情况下,图标包含各种尺寸和颜色方案,如果您不在乎有“旧的,生锈的”图标或根本没有图标,则可以将其删除。

当您签署EXE时,还会使用一些4k的空间。

作为一个小EXE的例子,请参见never10grc。有一个细节网页,其中突出了以上几点:

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

在最后一段:

最后请注意:我有点恼火,“Never10”是因为它的大是在 85千字节。数字签名使应用程序的大小增加了 4k,但Microsoft现在的高分辨率和高颜色图标 需要占用56k!所以,如果没有这些烦人的开销,应用程序 将是一个可敬的25k。而且,当然,我用 汇编语言编写了它。

声明:我不以任何方式隶属于grc。