Я пытаюсь найти адрес (или смещение от базового адреса) символа vftable для класса Greeter путем статического анализа исполняемого файла. При динамическом анализе в Visual Studio путем добавления точки останова и дизассемблирования конструктора класса Greeter я смог найти адрес символа.
00007FF76A891951 lea rcx,[Greeter::`vftable' (07FF76A89ACE0h)]
00007FF76A891958 mov qword ptr [rax],rcx
Но это адрес времени выполнения. Мне нужно найти способ определить смещение, возможно, используя такой инструмент, как «dumpbin» или что-то подобное. Я знаю, что могу вычислить смещение, используя адрес, указанный выше, но мне нужен способ автоматизировать это, поэтому это должно быть сделано с помощью инструмента.
Я пробовал использовать dumpbin на exe для разборки и найдите те же инструкции класса Greeter:
0000000140011951: 48 8D 0D 88 93 00 lea rcx,[??_7Greeter@@6B@]
0000000140011958: 48 89 08 mov qword ptr [rax],rcx
Итак, я решил попытаться найти ссылки на этот символ ??_7Greeter@@6B@
Я попытался использовать 'dumpbin' с следующая команда:
dumpbin /all ConsoleApplication.obj > cout
Я получил следующий соответствующий результат:
Section length 18, #relocs 3, #linenums 0, checksum 0, selection 6 (pick largest)
Relocation CRC BDB82F45
134 00000008 SECT43 notype External | ??_7Greeter@@6B@ (const Greeter::`vftable')
135 00000000 SECT44 notype Static | .rdata
Я также получил этот результат:
SECTION HEADER #43
.rdata name
0 physical address
0 virtual address
18 size of raw data
DA3B file pointer to raw data (0000DA3B to 0000DA52)
DA53 file pointer to relocation table
0 file pointer to line numbers
3 number of relocations
0 number of line numbers
40401040 flags
Initialized Data
COMDAT; sym= "const Greeter::`vftable'" (??_7Greeter@@6B@)
8 byte align
Read Only
RAW DATA #43
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000010: 00 00 00 00 00 00 00 00 ........
RELOCATIONS #43
Symbol Symbol
Offset Type Applied To Index Name
-------- ---------------- ----------------- -------- ------
00000000 ADDR64 00000000 00000000 14C ??_R4Greeter@@6B@ (const Greeter::`RTTI Complete Object Locator')
00000008 ADDR64 00000000 00000000 8C ?sayHello@Greeter@@UEAAX_J00@Z (public: virtual void __cdecl Greeter::sayHello(__int64,__int64,__int64))
00000010 ADDR64 00000000 00000000 8D ?initUser@Greeter@@UEAAXXZ (public: virtual void __cdecl Greeter::initUser(void))
Кто-нибудь знает, как я go о нахождении смещения этого символа? Есть ли специальный параметр c 'dumpbin', который мне нужно использовать для печати смещения символов, упомянутых в разборке?