Изначальная память процесса и 4-х миллионный байт?

Всем приятного чтения,
Решил я значит своими руками сделать .exe aka PE и он же исполняемый файл. Если конкретней, то на фасме(или я уже на тасм перешёл) пишу с помощью db,rb,dw и dd всякие плюшки дабы в итоге получился полностью рабочий Шник.exe
Но тут я наткнулся на поля ImageBase и Секцию импорта. При этом в статейках со всей уверенностью смешивают противоречивую информацию, сначала говорят, что без импорта никак и нечего я сделать не смогу и тут же говорят, что код надо грузить over4_000_000 byte, но если сделать финт ушами то и 1.млн тоже получится, так как перед этим всё занято системными библиотеками. И тут я выпал. Расскажите пожалуйста откуда можно начинать грузиться, что надо подгружать отдельно через импорт и что будет если я обращусь к нижним адресам ни чего там не проинициализировав?
  • Вопрос задан
  • 299 просмотров
Решения вопроса 1
@none7
Поле ImageBase указывающее системе в какую часть виртуальной памяти процесса нужно разместить исполняемый файл. Традиционно .exe файлы размещают по адресу 0x400000, это не значит, что он занимает 4 мегабайта, просто адрес. Dll традиционно размещают по адресу 0x10000000; поскольку для dll весьма возможен конфликт адресов, к ним обязательно прикрепляют релоки. Адрес размещения .exe и .dll строго говоря может быть любым кратным 0x10000, но не 0, не адрес ntdll.dll и не в пространстве ядра. Сам же исполняемый файл может занимать минимум 1 страницу(4Кбайт на x86) памяти + минимум по 1 странице на секцию, независимо от адреса размещения исполняемого файла.
То, что без таблицы импорта нельзя ничего сделать, строго говоря неверно. Можно через стандартные адреса выяснить где расположены системные .dll и их экспортируемые функции и через них загрузить всё, что необходимо. Но без самих системных .dll можно только зависнуть или умереть. Подгружать нужно то, что необходимо для работы кода приложения, это полностью зависит от самого приложения. Например для классического HelloWorld
void func() {
    MessageBoxA(NULL, "Hello", "Hello, World!", MB_OK);
    ExitProcess(0);
}
нужны user32.dll:MessageBoxA и kernel32.dll:ExitProcess.
Если обратиться к адресам памяти никак их не проинициализировав, то произойдёт исключение. Если при этом не настроены обработчики исключений, то выскочет традиционное окошко.ef716e0677a846e0a53b4665103d2029.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы