windbg - 签署 DLL 是否会使 PDB 文件无效?

标签 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

最佳答案

对可执行文件或 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 个字节,并且在代码签名期间不会更改。

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

Stud_PE

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

Checksums of executables

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

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

关于windbg - 签署 DLL 是否会使 PDB 文件无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55309226/

相关文章:

C# 条件等效于 !DEBUG

visual-studio - 从 Visual Studio 中的符号服务器加载与正则表达式匹配的特定符号

c++ - WinDbg 可以告诉我什么是 Visual Studio 不能的?

c - 如何获取SSDT地址

c# - 调试混合模式应用程序(c# 和非托管 c++)时出现 "The breakpoint will not currently be hit"错误

ReSharper PdbNavigator 在符号服务器上找不到调试信息

visual-studio - 任何推荐的 VC++ 设置,以便更好地对发布版本进行 PDB 分析

visual-studio-2008 - 为什么 VS 2008 为某些 RELEASE 项目创建 PDB 而不是其他项目?

c - 在 Windows 上调试 Linux 应用程序的技巧?

windbg - 如何在 WinDbg 中显示数组中包含的嵌套结构成员的内容?