在分析故障转储时,WinDbg 说我的符号(PDB 文件)与模块不匹配。这些符号是编译 DLL 时生成的符号。我能想到的唯一会导致不匹配的是 DLL 已签名。
我正在使用 !chksym
来验证符号:
!chksym libcef.dll D:\sym\libcef.dll.pdb
libcef.dll
Timestamp: 5BB3D477
SizeOfImage: 626D000
pdb: F:\src\out\libcef.dll.pdb
pdb sig: B0065D83-113F-63BE-53BC-AEF07EC816B4
age: 1
libcef.dll.pdb
pdb sig: 9BA88A40-D168-44F2-44C1-DD2D73A38B38
age: 1
sig MISMATCH: libcef.dll.pdb and libcef.dll
最佳答案
对可执行文件或 DLL 进行代码签名不会影响可执行文件的调试 header 。因此,它仍将匹配 PDB。
...\SigningPdb\bin\Release>symchk signed.exe /s .
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
...\SigningPdb\bin\Release>symchk unsigned.exe /s .
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
和
...\SigningPdb\bin\Release>ChkMatch.exe -c signed.exe SigningPdb.pdb
ChkMatch - version 1.0
Copyright (C) 2004 Oleg Starodumov
http://www.debuginfo.com/
Executable: signed.exe
Debug info file: SigningPdb.pdb
Executable:
TimeDateStamp: bc78c18e
Debug info: 2 ( CodeView )
TimeStamp: a7b373e5 Characteristics: 0 MajorVer: 0 MinorVer: 0
Size: 97 RVA: 000026a0 FileOffset: 000008a0
CodeView format: RSDS
Signature: {b8ed520c-cdfc-486b-8e1a-7c0752a2a41f} Age: 1
PdbFile: ...\Release\SigningPdb.pdb
Debug info: 16 ( Unknown )
TimeStamp: 00000000 Characteristics: 0 MajorVer: 0 MinorVer: 0
Size: 0 RVA: 00000000 FileOffset: 00000000
Debug information file:
Format: PDB 7.00
Signature: {b8ed520c-cdfc-486b-8e1a-7c0752a2a41f} Age: 1
Result: Matched
时间戳在 COFF header 中。该 header 的大小仅为 24 个字节,并且在代码签名期间不会更改。
大部分更改将发生在证书的新部分中。但是,此部分在代码签名期间也将被忽略。否则,第二个签名会破坏第一个签名。 (顺便说一句:此部分已用于在已签名的可执行文件中传输恶意代码)
当然,不考虑 EXE/DLL 文件结构的“常规”校验和将报告不同的校验和。
您的 DLL 或 EXE 可能发生了什么?
- 你不小心重建了它,所以你的 DLL 的时间戳不再与 PDB 匹配
- 您在 .NET 中使用面向方面的编程 (AOP),并且在重建后发生了一些代码编织。这些工具可能无法在编织后重建 PDB,因此在 DLL 代码签名之前 PDB 不匹配已经存在。
关于windbg - 签署 DLL 是否会使 PDB 文件无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55309226/