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

我一直在Metasploit上生成有效载荷,我一直在尝试使用不同的模板,其中一个模板可以使您的有效载荷像exe-small 。 我已经生成的有效载荷的types是一个Windows / Meterpreter / reverse_tcp,只是使用正常的exe文件模板,它有一个文件大小约72 KB但exe-small输出有效载荷大小为2.4kb。 为什么是这样? 我怎么能把这个应用到我的编程?

    最小的可能的PE文件只有97个字节 – 它什么都不做(只是返回)。

    现在最小的可运行可执行文件是133字节,因为Windows需要加载kernel32 。 执行没有导入的PE文件是不可能的。

    在这个尺寸下,它可以通过在导入表中指定一个UNC路径从Internet下载有效载荷。

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

    • 在汇编器中实现,主要是为了摆脱C运行时
    • 减少文件对齐,默认为1024
    • 删除打印消息“DOS程序无法在DOS模式下运行”的DOS存根(stub)
    • 将一些PE部分合并到MZ头部
    • 删除数据目录

    完整的描述可以在名为TinyPE的更大的研究博客文章中找到 。

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

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

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

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

    在最后一段中:

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

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

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

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

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

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

    在你的例子中,一个72 KB的文件大小对于Windows操作系统来说几乎可以做任何事情。

    要把它应用到你的程序中,就像在做很小的.exes一样,保持简单。 不要仅仅为了它的外观添加不必要的代码,或者认为你将在一个点上使用程序/代码的那一部分。