Почему символ "_main" не найден, если файл.exe загружен в x64dbg?
Написание простой программы hello_world.c и компиляция с 32-битным MinGW,objdump
может показать таблицу символов используя:
objdump -t hello_world.exe
И таблица символов тогда есть запись для _main
как:
...
[ 32](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 1) 0x00000460 _main
...
Однако при загрузке hello_world.exe
файл в x64dbg
отладчик_main
символ не отображается, как видно из списка символов ниже, когда hello_world
модуль выбран.
Это раздражает, так как я хотел бы создать точку останова при запуске кода пользователя в hello_world
и использование символов для перехода к стартовой позиции было бы очень удобно.
Любая идея о том, как получить _main
символы включены в список символов?
1 ответ
В то время как PE поддерживает хранение отладочной информации, таблица символов в основном представляет собой концепцию ELF.
Если вы посмотрите на разделы PE (используйте objdump -h), вы увидите много дополнительных разделов, на которые нет ссылок в каталогах PE.
Они используются binutils для извлечения информации DWARF и показывают, например, таблицу символов.
x64dbg - это чистый инструмент для Windows/PE и не понимает DWARF.
Тем не менее, он покажет вам адрес точки входа PE (редко адрес " main
"само по себе) и автоматически установит для вас точку останова.
Точка входа отображается под символами экспорта проверяемого двоичного файла.
Кроме того, x64dbg сломается на 'ntdll`, что позволит вам достичь точки входа с использованием ниндзя CTRL+F9 (остерегайтесь обратных вызовов инициализации TLS).
Чтобы добраться до main
Вы можете переходить по коду, пока не найдете вызов по адресу .text
раздел или просто звонок, за которым следуют два звонка cexit
а также ExitProcess
,
Кроме того, учитывая смещение _main
восстановлено с objdumpt -t
ВА из _main
это есть BASE ADDRESS
+ .text RVA
+ __main OFFSET
,
В моем случае это было 4010460h