【电子垃圾场】关于PIF文件的一些事实
即使是不成功的产品也会留下痕迹
0x00
PIF文件(Program Information File)是Windows系统中的一种可执行文件,用来帮助MS-DOS应用程序知道如何在Windows多任务环境里运行,避免一些资源的浪费。换句话说,它是为了“兼容性”而存在的,一种新旧交替的混乱产物。
0x01
微软官方没有说明PIF文件的格式。但是Mike(EDOS的作者)以实验的方式得到了大概的结构:
偏移量 | 长度 | 文件相对应的部分 |
---|---|---|
0000h | 0171h | 基本块 |
0171h | 0016h | 基本块的头 |
0187h | 0016h | 第一块的头 |
019Dh | 第一块 | |
0016h | 第二块的头 | |
第二块 | ||
…… | ||
0016h | 最后一块的头 | |
最后一块 |
这里的“第一块”“第二块”等指的是WINDOWS 386 3.0块,WINDOWS 286 3.0块,WINDOWS VMM 4.0块等,这些块内的结构也由实验得到了,由于篇幅过长这里不放了,请从此处下载查看:https://www.jianguoyun.com/p/DQiFmlMQ4auPBxjAqI8FIAA
0x02
Windows 2000中的一个pif文件的例子:
_default.pif
0x03
PIF文件的鼻祖是TopView。TopView是IBM开发的第一个面向对象、多任务和窗口的PC DOS个人计算机操作环境。它并不是一个成功的产品,销量从一开始就低于预期,并迅速衰落。但是正如本文开头所说,即使是不成功的产品也会留下痕迹,在Topview衰落和死亡之后很长一段时间,微软仍然继续着对PIF文件的改造与使用,事实上,本文的第二条所展示的_default.pif正是Windows 2000系统下的默认PIF文件,即使到了NT时期,微软也没有停止对PIF文件的使用。
0x04
Windows使用PIF文件的流程:DOS会话是通过调用WinExec函数启动的。当WinExec函数发现它所启动的是DOS而不是Windows程序时,它会启动WinOldAp(增强模式下的WINOA386.MOD)程序,并为其指定要运行的PIF或DOS应用程序名称。如果给出的是DOS应用程序名称,WinOldAp将使用 _DEFAULT.PIF(上文给出的)。如果使用显式 PIF 名称,它将包含要执行的 DOS 应用程序或批处理文件的名称。当WinOldAp的第一个实例启动时,将加载 386 采集器。WinOldAp创建虚拟机 (VM),然后WSHELL(内置于 WIN386.EXE 中的虚拟设备驱动程序VxD)强制 DOS 应用程序在新 VM中启动。然后WinOldAp打开要使用的PIF文件,并读出启动会话所需的数据。
0x05
PIF文件曾作为病毒文件的伪装被黑客大量使用,黑客们选中PIF文件主要出于以下两个原因:
①由于PIF文件以快捷方式文件存在,故即使在去掉勾选“隐藏已知文件类型的扩展名”的情况下,该文件的后缀名也不会显示,所以极容易被伪装成.txt等会使人们放下戒心、毫不犹豫地点开的文件。比方说这个文件,它就是某个会被附在邮件里发送给受害者的病毒样本。
②尽管PIF格式的文件不包含任何可执行代码,但Windows以相同的方式处理具有(伪)可执行文件扩展名的所有文件:所有.COM、.EXE、.PIF都由ShellExecute函数分析,并根据其内容而不是扩展名运行。也就是说,上图中的Readme.txt (中间省去很多空格) .pif文件虽然以pif为后缀,但其中的内容并不按上文中所讲的PIF文件的格式排布,而是以EXE文件的格式,ShellExecute函数分析它时也不会认为它是一个PIF文件,而是会认为它是一个EXE文件,它将会以EXE文件的方式运行。上图中的文件的开头如下:
可以看出,这个文件仅仅是EXE文件改了后缀而已。
0x06
除了被用于隐藏恶意软件的文件后缀之外,VMM 4.0之后,Windows XP之前的PIF文件也有另一个被黑客利用的攻击媒介:NT PIF文件增加了一种新的记录类型,即上面_default.pif的图中标出的最后一个块。该记录由ID字符串(”WINDOWS NT 3.1”)开始,然后是12个未知字节,接着是两个64字节的字段,用于保存两个文件的路径名:会话专用的AUTOEXEC.BAT和CONFIG.SYS文件。可以利用这两个文件使PIF文件执行批处理脚本,实现一些非预期的行动。