Windbg如何在众多pdb中找到那个它?
2021-12-06 / Hell

在Windows中进行开发的小伙伴们肯定对Windbg毫不陌生。在查找符号的时候经常看到一个很复杂的路径:e:\symbolcache\wntdll.pdb\96EF4ED537402DAAA51D4A4212EA4B2C1\wntdll.pdb,我们查看e:\symbolcache\wntdll.pdb路径结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
E:.
\---wntdll.pdb
+---311630463D61412A89CC03B6FDBEC5CA2
| wntdll.pdb
|
+---7EDD56F06D47FF1247F446FD1B111F2C1
| wntdll.pdb
|
+---B5E8CE18E962F8DA78E5827CDFA3599E1
| wntdll.pdb
|
+---96EF4ED537402DAAA51D4A4212EA4B2C1
| wntdll.pdb
|
+---B6EB6DFF017F36A18E8034D67B4DA9941
| wntdll.pdb
|
\---D0427A66DFB9499890CEF7A97A667E221
wntdll.pdb

发现是不同版本的wntdll.pdb,也就是当想要某pdb时,只要去指定目录下就能找到对应的pdb文件。
我们在Windbg中使用!sym noisy指令开启详细模式。并使用.reload /f ntdll.dll指令观察Windbg的查找流程:

1
2
3
4
5
6
7
8
9
10
11
12
0:043> .reload /f ntdll.dll
DBGHELP: h:\workcode\xxxxxx\xxxxxxx\xxxxxx\wntdll.pdb - file not found
DBGHELP: h:\workcode\xxxxxx\xxxxxxx\xxxxxx\dll\wntdll.pdb - file not found
DBGHELP: h:\workcode\xxxxxx\xxxxxxx\xxxxxx\symbols\dll\wntdll.pdb - file not found
SYMSRV: BYINDEX: 0x9
e:\symbolcache*http://msdl.microsoft.com/download/symbols
wntdll.pdb
96EF4ED537402DAAA51D4A4212EA4B2C1
SYMSRV: PATH: e:\symbolcache\wntdll.pdb\96EF4ED537402DAAA51D4A4212EA4B2C1\wntdll.pdb
SYMSRV: RESULT: 0x00000000
DBGHELP: ntdll - public symbols
e:\symbolcache\wntdll.pdb\96EF4ED537402DAAA51D4A4212EA4B2C1\wntdll.pdb

可以看到SYMSRV直接就打印出了96EF4ED537402DAAA51D4A4212EA4B2C1而非通过枚举:

  1. 311630463D61412A89CC03B6FDBEC5CA2\wntdll.pdb
  2. 7EDD56F06D47FF1247F446FD1B111F2C1\wntdll.pdb
  3. B5E8CE18E962F8DA78E5827CDFA3599E1\wntdll.pdb
  4. 96EF4ED537402DAAA51D4A4212EA4B2C1\wntdll.pdb
  5. B6EB6DFF017F36A18E8034D67B4DA9941\wntdll.pdb
  6. D0427A66DFB9499890CEF7A97A667E221\wntdll.pdb

依次分析pdb来分析哪个pdb才是符合的!
所以,可以分析出二进制模块(exe\dll)可以通过一种方法得出96EF4ED537402DAAA51D4A4212EA4B2C1
那是如何计算出96EF4ED537402DAAA51D4A4212EA4B2C1呢?
尝试了多种摘要算法都没能得出结果。最后发现是直接写入在PE结构中:
PE结构

所以只需要去指定路径下就能快速找到想要的pdb,真的是非常方便✅✅✅

PermaLink:
https://lazywang.life/2021/12/06/How-Windbg-Seleclt-Pdb/