自学者和学生的区别,不在于知识的广度,而在于生命力和自信心的差异。by 米兰·昆德拉
”0 1 Prefetch 简介Prefetch(严格来说称为“Prefetcher”),在Windows XP引入,用于监视应用执行的前10秒。使用prefetch的目的是通过将应用加载需要的文件和资源缓存到内存,提升应用后续加载的速度,降低磁盘访问的需求。
缓存管理器会监视每个应用或进程引用的文件和目录,然后将这些内容映射到.pf文件。被监控的应用包括GUI程序,命令行程序,.com程序等。
在XP和Vista/Win7,Prefetch目录限制保存128个文件,在Windows 8和Windows 10,增加为1024个文件。从Windows 10开始,Prefetch文件被进行了压缩。在Prefetch目录,旧的文件首先会被移除。
Prefetch文件的命名规则为可执行程序的文件名,然后跟破折号,然后是hash值,如CMD.EXE-0BD30981.pf。Prefetch文件位于C:\Windows\Prefetch目录。需要注意的是dllhost.exe,mmc.exe及rundll32.exe,这些可执行程序的命令行参数也包含在hash计算中。参数和路径中的空格也会影响hash的计算。
Prefetch hash计算过程如下:
1. 确定文件的完整路径(如:C:\Windows\NOTEPAD.EXE)
2. 路径转换为Unicode字符串
3. 路径转换为设备字符(如:\DEVICE\HARDDISKVOLUMEX\WINDOWS\NOTEPAD.EXE)
4. 调用计算hash的函数生成hash
5. 创建Prefetch文件名(如:NOTEPAD.EXE-xxxxxxxx.pf)
Prefetch默认仅在Windows工作站启用,服务器版本未启用。在Windows XP/2003/Vista/Win7 默认设置boot prefetching来减小启动时间。在SSD磁盘上运行的Windows 7默认未启用Prefetch,所有不存在Prefetch目录。
Prefetch文件包含应用执行的次数,执行时的原始路径,首次执行时间,最后一次执行时间等信息。
要禁用Prefetch,可通过修改注册表来实现,启用也一样:
Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters
名称: EnablePrefetcher
类型: REG_DWORD
值: 0 (0为禁用)
EnablePrefetcher可设置为下面的值:
0 = Disabled
1 = Application launch prefetching enabled
2 = Boot prefetching enabled
3 = Application launch and boot enabled
下面介绍具体如何分析Prefetch文件。
02 Prefetch分析 - 首次/最后执行下面以lycoris_x64.exe程序的运行结果为例进行分析,可以看到生成的prefetch文件名为LYCORIS_X64.EXE-A232FF77.pf:
.pf文件的创建日期为2020/12/2 22:33,说明程序lycoris_x64.exe首次执行时间大概为2020/12/2 22:33(实际执行时间约早10秒左右)。
.pf文件的修改日期为2020/12/2 22:36,说明lycoris_x64.exe的最后一次执行时间约为2020/12/2 22:26左右(实际时间可能早10秒左右)。准确的时间需要通过分析.pf文件获得。Windows 8和Windows 10在.pf文件里存储最近8次执行时间记录。
要分析.pf文件,可使用工具PECmd.exe,可将文件复制下来离线分析,也可以在运行的系统直接分析,下面演示在运行的系统直接分析。
PECmd.exe -f "c:\Windows\Prefetch\LYCORIS_X64.EXE-A232FF77.pf" -vss
上面命令中,-f指定分析的文件,-vss指定处理卷影副本,运行结果如下(注意时间加8小时):
在程序的运行结果中,可以看到程序运行了7次,第一次运行时间为2020-12-02 22:32:51,比创建.pf文件创建时间早10秒。最后一次运行时间为2020-12-02 22:36:26,比.pf文件的修改时间早11秒。
此外,还可以看到其他几次运行的时间,程序引用的文件和目录,程序的完整路径等信息。
如果要分析C:\Windows\prefetch\目录下的所有文件,并将结果保存到csv文件,可用命令:
PECmd.exe -d "C:\Windows\Prefetch" -csv "c:\prefetch_parser_output" -vss
需要注意的是,从Winodws 8开始,才包含能够解压Windows 10 prefetch文件的Windows API。因为PECmd.exe依赖Windows API解压Windows 10创建的prefetch文件,所以必须在Windows 8及以上系统运行程序处理Windows 10的prefetch文件。
此外,图形界面的工具WinPrefetchView也可用来分析prefetch文件,下载地址为:
https://www.nirsoft.net/utils/win_prefetch_view.html
由于使用比较简单,这里就不作说明。
03 内存分析Prefetch有时候可能会遇到攻击者删除了C:\Windows\Prefetch目录下的所有文件,此时,如果我们提取了系统内存,也可通过分析内存中的prefetch文件,对程序执行证据进行分析。
这里使用volatility的插件prefetchparser。首先下载插件到本地:
curl -O https://raw.githubusercontent.com/superponible/volatility-plugins/master/prefetch.py
在使用时,可用参数--plugins指定插件目录,但需要注意的是,--plugins参数必须紧跟在vol.py后面:
如果出现上面的错误,说明我们没有解压windows 10创建的prefetch文件的库,安装过程如下:
git clone https://github.com/coderforlife/ms-compress.git
./build.sh
将生成的.so文件复制的系统动态链接库的目录:
cp libMSCompressino.so /usr/lib/
再次运行程序,如果出现下面错误,是因为没有指定prefetch文件的dump目录,可用--mam-dir参数指定:
创建dump文件的目录并运行程序:
mkdir dumpdir
./vol_lin64 --plugins=./plugins/ -f ../OA-win10_x64_18363.dmp --profile=Win10x64 prefetchparser --mam-dir=./dumpdir
在终端中只会输出一部分内容,可以看到部分prefetch的文件名,执行时间为最后一次运行时间,运行次数,及文件大小。
虽然在终端只会显示一部分内容,但插件会将内存中所有prefetch文件都dump到我们指定的目录,这些文件可用PECmd.exe等工具进行分析:
使用PECmd.exe对dump的prefetch文件进行分析:
PECmd.exe -d dumpdir --csv .
程序运行的部分输出如下,虽然程序处理过程会提示错误,但结果仍包含一些有价值的信息:
程序运行完后,会在当前目录生成2个文件:
使用TimelineExplorer.exe查看结果,也能看到程序运行时间,运行次数,之前几次的运行时间等信息:
另一个输出文件按照时间线对运行过的程序进行了排序:
04 总结上面对windows prefetch文件进行了简单的介绍,然后介绍了使用文件系统和内存分析2种方式,通过对prefetch文件进行分析,来获得系统程序执行的相关信息,如执行过的程序名称,目录,运行次数,运行时间等信息。
希望本篇文章的内容对大家有所帮助,如有任何疑问,可在后台留言或者发送邮件。
参考资料https://www.nirsoft.net/utils/win_prefetch_view.html
https://github.com/superponible/volatility-plugins
https://ericzimmerman.github.io/
https://github.com/coderforlife/ms-compress
http://www.hexacorn.com/blog/2012/03/