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