情况是这样的。
昨天,我得到了一个dump,这个dump是个full dump,
是一个系统蓝屏后的完全内存转储。
产品怀疑是我们的驱动导致出现了问题,
但是我们就不这么认为,所以就开始分析dump,
经过简单地查看调用栈,我们初步确认不是我们的问题。
但是如果要细挖细节的话,问题就来了,
我们只有dmp,没有对应的系统文件啊,
更可恶的是,实际上dmp里面没有记录目标系统文件的版本,
即,只记录了ntoskrnl、hal等模块的一些普通信息,如时间戳等,
但是没有记录属于哪个系统版本,如 18363、18362 等,
这里就导致我想拿到目标的系统文件非常困难。
怎么办,问题,还要解决,
突然我想到了一个方法。
微软其实是支持系统文件下载的,
只是下载路径需要自己拼凑出来,
而很巧,拼路径需要的三个关键信息,dmp 里面都给出了。
这里提供一段js脚本,来计算下载地址,计算出来的地址,其实是可以下载到文件的,而且是有效的。
1 var fileName = "PSHED.dll"; 2 var timestamp = 0xB21F9DDA; 3 var virtualSize = 0x0001A000; 4 var vtimes = timestamp.toString(16).toUpperCase(); 5 var vsizes = virtualSize.toString(16).toLowerCase(); 6 var fileId = ('0000000' + vtimes ).slice(-8) + vsizes; 7 var url = 'https://msdl.microsoft.com/download/symbols/' + fileName + '/' + fileId + '/' + fileName; 8 url;
关键元素其实就三个
filename :目标文件名
timestamp : 目标文件时间戳(这个时间戳是编译出来之后记录在文件中的那个时间戳,可能不是真正的时间戳,但是不重要)
virtualsize : 文件的体积
windbg 里面得到的模块信息如下,
10: kd> lmvm hal Browse full module list start end module name fffff805`0e75c000 fffff805`0e800000 hal (pdb symbols) d:symbolms_symbolhal.pdbF3383972E53BCF4212FB0F57D47870AF1hal.pdb Loaded symbol image file: hal.dll Image path: hal.dll Image name: hal.dll Browse all global symbols functions data Image was built with /Brepro flag. Timestamp: 5C190592 (This is a reproducible build file hash, not a timestamp) CheckSum: 0009F7AA ImageSize: 000A4000 Translations: 0000.04b0 0000.04e4 0409.04b0 0409.04e4 Information from resource tables:
挺惨的,啥都没有,
目标文件名,就是 hal.dll
目标时间戳是 Timestamp
文件体积是 ImageSize
都提供了,然后通过脚本可以算出来一个下载的路径,
我是很懒,所以没有用C#、Py 啥的改一下这个脚本,如果有时间,其实可以直接改一下这个脚本,
根据模块信息直接下载目标文件。