Поиск адреса символа vftable в файле .exe - PullRequest
2 голосов
/ 04 августа 2020

Я пытаюсь найти адрес (или смещение от базового адреса) символа 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', который мне нужно использовать для печати смещения символов, упомянутых в разборке?

...