从微软符号服务器下载PE文件

假设有

_NT_SYMBOL_PATH=srvX:\symhttp://msdl.microsoft.com/download/symbols在”X:\sym\”下发现除了PDB文件,还有些PE文件。比如:

X:\sym\ntoskrnl.exe\6180891781b000\ntoskrnl.exe
X:\sym\lsasrv.dll\615BDF92179000\lsasrv.dll

http://msdl.microsoft.com/download/symbols/ntoskrnl.exe/6180891781b000/ntoskrnl.exe
http://msdl.microsoft.com/download/symbols/lsasrv.dll/615BDF92179000/lsasrv.dll

过去一直未深究过,为什么会出现这种情况?最近因某个实际需求出现,对此探索了一番。

假设用windbg调试”crash dump”,调试机与目标机不是同一套系统,在调试机上打开目标机产生的”crash dump”时需要加载目标机上的PE,此时就会从微软符号服务器下载PE文件。还有一些其他情况,比如Host+Guest+kd,总之,当windbg需要加载的PE因故无法访问时,就会从微软符号服务器下载PE文件。dbgsrv这种Process Servers应该不涉及。

dbghelp!SymFindFileInPath用于下载、加载PE文件。当加载PE时,需要从PE头析取TimeDateStamp、SizeOfImage两个字段,以构造下载URL。用CFF Explorer看

Nt Headers
File Header
TimeDateStamp
Optional Header
SizeOfImage

调试器中”lmv m”、”!lmi”都可以看

kd> lmv m lsass
start end module name
00007ff772ec0000 00007ff772ed1000 lsass

Image name: lsass.exe
Timestamp: Tue Oct 5 13:21:17 2021 (615BE0CD)

ImageSize: 00011000

kd> !lmi lsass
Loaded Module Info: [lsass]

Time Stamp: 615be0cd Tue Oct 5 13:21:17 2021
Size: 11000

具体拼接时,相当于

sprintf( buf, “%X%X”, TimeDateStamp, SizeOfImage )

http://msdl.microsoft.com/download/symbols/lsass.exe/615BE0CD11000/lsass.exe

本地缓存

X:\sym\lsass.exe\615BE0CD11000\lsass.exe

版权声明

本站“技术博客”所有内容的版权持有者为绿盟科技集团股份有限公司(“绿盟科技”)。作为分享技术资讯的平台,绿盟科技期待与广大用户互动交流,并欢迎在标明出处(绿盟科技-技术博客)及网址的情形下,全文转发。
上述情形之外的任何使用形式,均需提前向绿盟科技(010-68438880-5462)申请版权授权。如擅自使用,绿盟科技保留追责权利。同时,如因擅自使用博客内容引发法律纠纷,由使用者自行承担全部法律责任,与绿盟科技无关。

Spread the word. Share this post!

Meet The Author

C/ASM程序员

Leave Comment