Можно ли изменить точку входа процесса из DLL?

Точка входа по умолчанию для большинства процессов приложения обычно составляет 0x401000.

Есть ли способ, которым мы могли бы сдвинуть или изменить точку входа в процесс? Например, если я хотел изменить внешнюю точку входа на 0x901000, используя DLL (при условии, что процесс загрузил DLL через C ++)?

Я пытаюсь создать DLL для редактирования точки входа процесса по умолчанию.

-1

Решение

Да, вы можете изменить ImageBase в дополнительном заголовке переносимого исполняемого файла, если ваш компоновщик позволяет это.
Большинство компоновщиков устанавливают ImageBase = 0x10000 при компоновке исполняемого файла и 0x400000 при компоновке DLL. Однако это число выбирается произвольно (я полагаю, потому что его легко запомнить и хорошо выглядит в отладчиках), и оно может не слушаться загрузчиком, если память уже занята.
Увидеть http://msdn.microsoft.com/en-us/library/ms809762.aspx
Таблица 3. Абзац IMAGE_OPTIONAL_HEADER.ImageBase:

Когда компоновщик создает исполняемый файл, он предполагает, что файл будет отображен в памяти в определенном месте в памяти. Этот адрес хранится в этом поле, при условии, что адрес загрузки позволяет выполнять оптимизацию компоновщика. Если файл действительно отображен в памяти по этому адресу загрузчиком, код не нуждается в исправлении, прежде чем его можно будет запустить. В исполняемых файлах, созданных для Windows NT, база изображений по умолчанию — 0x10000. Для DLL по умолчанию 0x400000. В Windows 95 адрес 0x10000 нельзя использовать для загрузки 32-разрядных EXE-файлов, поскольку он находится в линейной области адресов, общей для всех процессов. Из-за этого Microsoft изменила базовый адрес по умолчанию для исполняемых файлов Win32 на 0x400000. Старые программы, которые были связаны, предполагая, что базовый адрес 0x10000, будут загружаться под Windows 95 дольше, потому что загрузчик должен применить базовые перемещения.

0

Другие решения

В Windows адрес загрузки по умолчанию для EXE-файлов равен 0x400000 — так вот откуда эта часть 0x401000.

Компонент 0x1000 — это смещение изображения в памяти, где (обычно) text начинается сегмент, содержащий основную часть кода. Вот где точка входа этой конкретной программы.

Это смещение является полем в PE-заголовке, как и адрес загрузки по умолчанию 0x400000. И то, и другое можно изменить, но имейте в виду, что для EXE информация о перемещении часто удаляется: поскольку адрес загрузки по умолчанию всегда гарантированно будет свободным при первом создании нового процесса, часто предполагается, что информация о перемещении не требуется для EXE-файлов.

Если это так для вашего EXE-файла, вы не можете изменить адрес загрузки, не выполнив серьезную операцию с изображением, чтобы вручную идентифицировать и исправить любые ссылки, относящиеся к предполагаемому адресу загрузки 0x400000, используемому во время компиляции / компоновки.

0

По вопросам рекламы [email protected]