Я пытался лучше понять, где мой исходный код 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. Где мое понимание рушится?