Почему символ "_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 "само по себе) и автоматически установит для вас точку останова.
Точка входа отображается под символами экспорта проверяемого двоичного файла.

Точка входа PE с автоматической точкой останова, показанная в экспортированных символах двоичного файла

Кроме того, x64dbg сломается на 'ntdll`, что позволит вам достичь точки входа с использованием ниндзя CTRL+F9 (остерегайтесь обратных вызовов инициализации TLS).

Чтобы добраться до main Вы можете переходить по коду, пока не найдете вызов по адресу .text раздел или просто звонок, за которым следуют два звонка cexit а также ExitProcess,

Кроме того, учитывая смещение _main восстановлено с objdumpt -t ВА из _main это есть BASE ADDRESS + .text RVA + __main OFFSET,
В моем случае это было 4010460h

После вызова <code> main </ code> следует вызов <code> cexit </ code> и <code> ExitProcess </ code main следует вызов cexit и ExitProcess

Другие вопросы по тегам