Как соотнести символьную информацию из PDB с содержимым PE? - PullRequest
0 голосов
/ 16 февраля 2020

Я пытался лучше понять, где мой исходный код C ++ заканчивается в формате PE и как найти определенные c точек в моем исходном коде в PE. Например, у меня есть простая программа , которую я скомпилировал с флагами / Od и / ZI.

Есть один исходный файл со следующими функциями: main, PrintVector, AddOneToEach.

Когда я открываю main.exe в шестнадцатеричном редакторе, я могу сопоставить адреса и значения в изображении PE с определенными значениями из dumpbin ./main.exe /headers, используя Документация структуры PE в качестве ссылка. Например:

FILE HEADER VALUES
             14C machine (x86)
               7 number of sections
        5E48E9D4 time date stamp Sat Feb 15 23:05:56 2020
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
             102 characteristics
                   Executable
                   32 bit word machine

OPTIONAL HEADER VALUES
             10B magic # (PE32)
           14.16 linker version
           9DA00 size of code
           25400 size of initialized data
               0 size of uninitialized data
           4BD1C entry point (0044BD1C) @ILT+19735(_mainCRTStartup)

Я знаю, что по адресу 0x3 c я должен найти поле длиной 4 байта, содержащее адрес начала заголовка PE. Я нахожу в формате с прямым порядком байтов 0x00010000, что переводится как 0x00000100. По адресу 0x00000100 я нахожу ожидаемое младшее порядковое значение 0x50450000 в документации формата PE .

При проверке соответствующего файла PDB я ищу символ PrintVector через powershell & $dbh ./main.pdb n PrintVector, где $dbh = C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbh.exe. Выход:

   name : PrintVector
   addr :  1059090
   size : 86
  flags : 0
   type : 2
modbase :  1000000
  value :        0
    reg : 0
  scope : SymTagExe (1)
    tag : SymTagFunction (5)
  index : 1

Учитывая значение адреса 0x01059090, я ожидаю, что смогу найти начало функции PrintVector по адресу 0x01059090 в main.exe. Однако диапазон адресов main.exe заканчивается на 0x000cf15f0, что говорит о том, что с моим пониманием виртуальной адресации и формата PE что-то не так. Я ожидаю, что я смогу найти точку входа в функцию PrintVector где-нибудь в main.exe на основе адреса, полученного через Dumpbin с использованием DBH для файла PDB. Где мое понимание рушится?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...