Как узнать, где находится основная функция в файле .exe? - PullRequest
0 голосов
/ 09 апреля 2019

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

исходный код

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

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

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

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

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

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

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

DWORD 0x28 EntryPoint

      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) не следует путать со стандартными виртуальными адресами.Относительный виртуальный адрес - это виртуальный адрес объекта из файла после его загрузки в память, за вычетом базового адреса образа файла.

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

0 голосов
/ 09 апреля 2019

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

Компоновка

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

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

...