COM可执行格式非常简单,非常优雅。它们只是计算机将执行的指令包,放在DOS程序段前缀之后。没有重新定位,没有代码分析,也没有重新排序技巧-我们从今天复杂而混乱的格式中所期望的东西都没有。当然,这使得他们很容易受到恶意软件的攻击,但这也使得程序变得更小,更容易理解。我来告诉你我的意思。
所以,我写了两个程序来做同样的事情。一个被编译成一个COM文件,另一个被编译到一个DOS EXE中。程序集代码如下所示:
在编译时,COM文件是一个惊人的20个字节(!),而EXE是536字节。生成的二进制代码,只是为了比较:
左边的COM文件只包含说明。右边的EXE文件包含指令(文件末尾)、重定位和文件前28个字节中的程序信息。还有,有很多空旷的空间没有被利用。注意:如果您查看0x08和0x09,您将看到这些字节存储0x0020值(记住:PC也是小Endian)。这是为报头保留的16字节段落数,它将您带到地址0x0000200的可执行代码的开头。如果您正在编写病毒,则该信息为您提供了所有需要了解的信息,您可以在哪里填充代码以供以后执行。COM文件很容易被感染,而DOS EXE文件(或MZEXE文件,以文件前两个字节中神奇的数字命名)只是稍微困难一些。