一个可执行文件如何可以在文件大小这么小?
我一直在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。
对可执行文件的需求很少,除非它包含我称之为垃圾邮件的代码,代码对于程序/ exe的功能实际上并不重要。这对其他文件也是有效的。看看手动编写的HTML页面与用FrontPage编写的HTML页面进行比较。这是spamcode。
我记得我的老DOS文件的大小都是KB,并且几乎在OS中执行任何需要的任务。其中一个.exes(实际上是.com)的大小只有20个字节。
想想这样:就像在某些情况下,Windows操作系统中包含的大部分文件都可以被删除,操作系统仍然可以完美运行,这与.exe文件一样:大部分该代码要么没有用,要么与相关目标不同,或者有意添加(见下文)。
这种畸变的高峰是现在在一些使用高级复制保护功能的游戏的.exe文件中添加的代码,它可以使文件大到几十MB。实际运行游戏所需的代码几乎不到完整代码的10%。
在您的示例中,文件大小为72 KB可以足够执行windows操作系统的任何操作。
要将它应用到您的编程中,就像在非常小的.exes中一样,保持简单。不要为代码的外观添加不必要的代码,或者考虑在某一点使用程序/代码的那部分代码。
对于EXE这个小的,最大的空间通常用于图标。通常情况下,图标包含各种尺寸和颜色方案,如果您不在乎有“旧的,生锈的”图标或根本没有图标,则可以将其删除。
当您签署EXE时,还会使用一些4k的空间。
作为一个小EXE的例子,请参见never10的grc。有一个细节网页,其中突出了以上几点:
https://www.grc.com/never10/details.htm
在最后一段:
最后请注意:我有点恼火,“Never10”是因为它的大是在 85千字节。数字签名使应用程序的大小增加了 4k,但Microsoft现在的高分辨率和高颜色图标 需要占用56k!所以,如果没有这些烦人的开销,应用程序 将是一个可敬的25k。而且,当然,我用 汇编语言编写了它。
声明:我不以任何方式隶属于grc。
我不同意。阅读我的初始答复。我有一个20字节的有效.com文件,我一直在MS-DOS时间使用。 – Overmind
@Overmind:COM文件不是PE文件,所以没有差异。该文件是否仍然在当今的Windows(7或更高版本)上运行? COM文件没有标题,也没有元数据等。另外请注意:这个问题是从Metasploit上下文中的Security.SE迁移过来的,我假设有人想要下载恶意负载,而您可能无法在20字节的COM文件中。 –
它不能在64位上运行,因为它是一个16位可执行文件。 – Overmind