签署DLL会使PDB文件无效吗?

时间:2019-03-22 23:55:48

标签: windbg debug-symbols pdb-files

分析故障转储,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

1 个答案:

答案 0 :(得分:2)

对可执行文件或DLL进行代码签名不会影响可执行文件的调试头。因此,它将仍然与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标头中。该标头只有24个字节,在代码签名期间不会更改。

大多数更改将在证书的新部分中发生。但是,在代码签名期间也将忽略此部分。否则,第二个签名将破坏第一个签名。 (顺便说一句:此部分已用于在已签名的可执行文件内传输恶意代码)

Stud_PE

当然,不考虑EXE / DLL文件结构的“常规”校验和将报告不同的校验和。

Checksums of executables

您的DLL或EXE可能发生了什么事?

  • 您不小心重建了它,因此DLL的时间戳不再与PDB匹配
  • 您正在.NET中使用面向方面的编程(AOP),并且在重建后会发生一些代码编织。这些工具在编织后可能无法重建PDB,因此在对DLL进行代码签名之前,PDB不匹配已经存在。