Как узнать, где находится основная функция в exe-файле?

#executable #disassembly

#исполняемый файл #разборка

Вопрос:

Я создал простой exe-файл, который просто присваивает значение 3 целому числу с именем «x», а затем выводит это значение.Вот изображение исходного кода:

исходный код

Я открыл .exe-файл с помощью шестнадцатеричного редактора (с именем HxD) и использовал функцию дизассемблирования Visual Studio 2017, чтобы показать мне коды операций моей основной функции. После небольшого поиска я обнаружил, что основная функция хранится в файле со смещением 0xC10

Вот разборка:разборка

И вот файл в шестнадцатеричном редакторе:шестнадцатеричное представление exe-файла

Я знаю, что некоторые значения .exe-файла в шестнадцатеричном редакторе отличаются от того, что говорит отладчик visual studio, но я знаю, что там начинается main, потому что я изменил значение x в шестнадцатеричном редакторе, а затем, когда я запустил .exe, он напечатал другое значение вместо 3. Мой вопрос в том, где в .exe-файле находится значение, которое гласит: «В этой точке файла запускаются коды операций основной функции».

Например, в файле .bmp 4 байта в позициях 0x0A, 0x0B, 0x0C и 0x0D сообщают вам смещение первого байта первого пикселя.

Ответ №1:

В Windows точка входа исполняемого файла ( .exe ) устанавливается в PE-заголовке файла.

Википедия иллюстрирует структуру этого заголовка следующим образом (SVG-файл).

Относительно начала файла заголовок PE начинается с позиции, указанной в адресе

DWORD 0x3C Указатель на PE заголовок

       File Header / DOS Header
      -------------------- -------------------- 
0000 |  0x5A4D  |         |                    |
0008 |                    |                    |
0010 |                    |                    |
0018 |                    |                    |
0020 |                    |                    |
0028 |                    |                    |
0030 |                    |                    |
0038 |                    | PE Header addr     |
0040 |                    |                    |
.... | .................. | .................. |
  

И точка входа обозначается в позиции (относительно адреса выше)

DWORD 0x28 точка входа

       PE Header
      -------------------- -------------------- 
0000 | Signature          | Machine | NumOfSect|
0008 | TimeDateStamp      | PtrToSymTable      |
0010 | NumOfSymTable      |SizOfOHdr| Chars    |
0018 | Magic   | MJV| MNV | SizeOfCode         |
0020 | SizeOfInitData     | SizeOfUnInitData   |
0028 | EntryPoint (RVA)   | BaseOfCode (RVA)   |
0030 | BaseOfData (RVA)   | ImageBase          |
0038 | SectionAlignment   | FileAlignment      |
0040 | ...                | ...                |
  

с начала PE-заголовка. Этот адрес является RVA (относительным виртуальным адресом), что означает, что он относится к базовому адресу изображения, на который файл загружается загрузчиком:

Относительные виртуальные адреса (RVA) не следует путать со стандартными виртуальными адресами. Относительный виртуальный адрес — это виртуальный адрес объекта из файла после его загрузки в память, минус базовый адрес образа файла.

Этот адрес является адресом основной функции.

Комментарии:

1. Здравствуйте и, прежде всего, спасибо за ваш быстрый ответ. К сожалению, я не искал относительный начальный адрес моей программы в оперативной памяти. Я искал, где именно находятся коды операций, которые запускают мою программу в самом .exe-файле, и какое значение в .exe-файле указывает на эту позицию. Извините, если я не прояснил это в вопросе!

Ответ №2:

.exe Это переносимый исполняемый файл.

Макет

Структура переносимого исполняемого файла 32-разрядный PE-файл состоит из нескольких заголовков и разделов, которые сообщают динамическому компоновщику, как отобразить файл в память. Исполняемый образ состоит из нескольких разных областей, каждая из которых требует разной защиты памяти; поэтому начало каждой секции должно быть выровнено по границе страницы.[4] Например, обычно раздел .text (который содержит программный код) отображается как execute / только для чтения, и …

Итак, на самом деле это вопрос о том, где находится .text раздел в файле. Точное место зависит от заголовков и расположения других разделов.