即使是不成功的产品也会留下痕迹
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文件主要出于以下两个原因:
① 由于 Windows 在注册表中为 .pif 文件类型设置了“永不显示扩展名”(NeverShowExt),因此即使在资源管理器中取消勾选“隐藏已知文件类型的扩展名”,.pif 后缀通常也不会显示。同时,PIF 文件常被用作指向 DOS 程序的“快捷方式”式配置,所以极容易被伪装成 .txt 等会使人们放下戒心、毫不犹豫地点开的文件。

② 尽管真正的 PIF 文件不包含可执行代码(它缺少可执行文件的 MZ 头),但 Windows 的 ShellExecute 会读取文件头判断实际类型,而不是仅依赖扩展名。.COM、.EXE、.PIF 等文件都可能由 ShellExecute 按内容分析并运行。也就是说,上图中的Readme.txt (中间省去很多空格) .pif文件虽然以pif为后缀,但其中的内容并不按上文中所讲的PIF文件的格式排布,而是以EXE文件的格式,ShellExecute函数分析它时也不会认为它是一个PIF文件,而是会认为它是一个EXE文件,它将会以EXE文件的方式运行。上图中的文件的开头如下:

可以看出,这个文件仅仅是EXE文件改了后缀而已。
0x06
除了被用于隐藏恶意软件的文件后缀之外,在 NT 系列的 PIF 文件中(从 Windows NT 3.1 起),还有另一个被黑客利用的攻击媒介:NT PIF 文件增加了一种新的记录类型,即上面 _default.pif 的图中标出的最后一个块。该记录由 ID 字符串("WINDOWS NT 3.1")开始,然后是 12 个公开资料中未见明确解释的字节,接着是两个 64 字节的字段,用于保存两个文件的路径名:会话专用的 AUTOEXEC.BAT 和 CONFIG.SYS 文件。在仍支持 NTVDM 的 32 位 Windows 中(大致从 Windows NT 3.1 到 32 位 Windows 10),这种记录类型理论上都可能被滥用;攻击者可以利用这两个文件使 PIF 文件执行批处理脚本,实现一些非预期的行动。64 位 Windows 不再支持 NTVDM,因此这一攻击面主要限于 32 位系统。