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

问题描述 投票:1回答:1

分析崩溃转储,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

windbg debug-symbols pdb-files
1个回答
3
投票

对可执行文件或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不匹配已经存在。
© www.soinside.com 2019 - 2024. All rights reserved.