Делает ли подписание DLL недействительным PDB-файл?

#windbg #debug-symbols #pdb-files

#windbg #отладочные символы #pdb-файлы

Вопрос:

Анализируя аварийный дамп, WinDbg сообщает, что мои символы (PDB-файл) не соответствуют модулю. Символы — это те, которые были сгенерированы при компиляции библиотеки DLL. Единственное, что, как я могу себе представить, могло вызвать несоответствие, это то, что DLL была подписана.

Я использую !chksym для проверки символов:

 !chksym libcef.dll D:symlibcef.dll.pdb

libcef.dll
    Timestamp: 5BB3D477
  SizeOfImage: 626D000
          pdb: F:srcoutlibcef.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. Под подписью вы подразумеваете подписание Authenticode? Я не знаю, что это изменяет заголовок debug. Больше похоже, что вы перекомпилировали dll из тех же источников. Вы можете принудительно загрузить с помощью .reload -f -i libcef.dll если ваш символьный путь содержит каталог, в котором находится ваш новый pdb. Используйте .sympath F:srcout чтобы добавить его. Тогда отладка не должна быть проблемой.

2. @AloisKraus Да, подпись authenticode. Принудительная перезагрузка, похоже, работает нормально. Меня больше беспокоит, могу ли я отлаживать неправильные материалы из-за несоответствия символов. Скажите, пожалуйста, как я могу посмотреть заголовок debug?

3. Я заметил, что к вашему pdb добавлен файл .dll afaik vc создает pdb с . удаленная dll, т.Е. создается libcef.pdb вместо libcef.dll.pdb передан ли вам переключатель -Fxyz, который предоставляет другое имя для pdb в ваших проектах? отсутствие подписи afaik ничего не меняет внутри вашего двоичного файла (представьте, что ms внедряет бэкдор oops, если он это делает, не так ли? ) используйте dumpbin /headers для проверки пути, встроенного в двоичный файл

Ответ №1:

Подписание кода исполняемым файлом или DLL не влияет на заголовок debug исполняемого файла. Таким образом, он все равно будет соответствовать PDB.

 ...SigningPdbbinRelease>symchk signed.exe /s .

SYMCHK: FAILED files = 0
SYMCHK: PASSED   IGNORED files = 1

...SigningPdbbinRelease>symchk unsigned.exe /s .

SYMCHK: FAILED files = 0
SYMCHK: PASSED   IGNORED files = 1
  

И

 ...SigningPdbbinRelease>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: ...ReleaseSigningPdb.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, выдадут другую контрольную сумму.

Контрольные суммы исполняемых файлов

Что могло случиться с вашей DLL или EXE?

  • вы случайно перестроили его, поэтому временная метка вашей DLL больше не соответствует PDB
  • вы используете аспектно-ориентированное программирование (AOP) в .NET, и после перестройки происходит некоторое переплетение кода. Эти инструменты могут быть не в состоянии перестроить PDB после ткачества, поэтому несоответствие PDB уже существует до того, как DLL подписана кодом.