Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2017, 20:52   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Загрузка PE-файла по адресу, равному ImageBase загрузчика

Мне нужно загрузить PE-имидж в память так, чтобы, желательно, он располагался по своему предпочтительному ImageBase (допустим, в нем нет релоков), в противном случае загрузить его по любому адресу и настроить релоки.

Проблема возникла при попытке загрузить его по своему ImageBase в случае, когда этот адрес загружаемого файла совпадает с ImageBase стаба-загрузчика: например, оба равны 0x400000.

Как поступить в таком случае? Я пытаюсь освободить память стаба, как это делал gr8, но мне кажется, это бессмысленно, т.к. тогда загрузчик не сможет работать.

Имеем: стаб загрузчика расположился по адресу 0x400000. Туда же хотим загрузить PE-имидж. Пытаемся освободить там память. Не приведет ли это вообще к исключению?

Код:
void* LoadPE_AllocateMemory(LoadPE_CONTEXT* ctx, PBYTE disk_image)
{
	PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)(disk_image);
	PIMAGE_NT_HEADERS NtHeaders = (PIMAGE_NT_HEADERS)(disk_image + DosHeader->e_lfanew);

	std::size_t ImageBase   = NtHeaders->OptionalHeader.ImageBase;
	std::size_t SizeOfImage = NtHeaders->OptionalHeader.SizeOfImage;
	UnmapViewOfFile((void *)ImageBase);
	VirtualFree((void *)ImageBase, SizeOfImage, MEM_DECOMMIT);
	VirtualFree((void *)ImageBase, SizeOfImage, MEM_RELEASE);
	void* mem = VirtualAlloc((void*)ImageBase,
                             SizeOfImage,
                             MEM_RESERVE | MEM_COMMIT,
                             PAGE_READWRITE);
	ctx->pbRealImageBase = PBYTE(mem);
	return mem;
}
Aoizora вне форума Ответить с цитированием
Старый 24.07.2017, 17:21   #2
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Попробую сделать код загрузчика базонезависимым и перемещать его при конфликте базовых адресов. Или копну в сторону динамической реконструкции релоков.
Aoizora вне форума Ответить с цитированием
Старый 24.07.2017, 19:43   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А зачем это надо? Система сама может загрузить и разобраться с адресами.
waleri вне форума Ответить с цитированием
Старый 24.07.2017, 22:07   #4
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А зачем это надо? Система сама может загрузить и разобраться с адресами.
Я пишу пакер.
Aoizora вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необработанное исключение по адресу 0x012A8F88 в Задачи.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x01020000. Мой повелитель Общие вопросы C/C++ 2 09.01.2016 19:53
Исправить ошибку: необработанное исключение по адресу, нарушение прав доступа при записи по адресу Анастасия_18 Общие вопросы C/C++ 3 16.07.2014 09:57
Найти сумму элементов расположенных ,после первого элемента равному нулю геннадий 2012 Visual C++ 13 26.12.2012 18:18
Проблема такова: язык:Delphi7; сохранения файла; загрузка файла в String Grid lightdevil Общие вопросы Delphi 3 06.03.2009 23:10