Как UPX обрабатывает приложения без каталога перемещения?

Я проводил некоторые исследования исполняемых загрузчиков, и одна вещь, которая меня смущает, это то, как они справляются с исполняемым файлом, который требует, чтобы он загружался по определенному виртуальному адресу (то есть не имеет записи перемещения)

Я знаю, что у UPX есть возможность сделать это, но я не вижу, как это обрабатывается в источнике UPX (я даже не уверен, какой именно код отвечает за загрузку...)

Я сделал загрузчик, но он требует, чтобы у приложения была запись перемещения, чтобы не имело значения, на какой виртуальный адрес оно загружено.

Заглушка UPX имеет базовый адрес 0x400000, и когда он загружает исполняемый файл с базовым адресом 0x400000, у него не возникает проблем. Как это возможно, поскольку ОС отклонит ваш запрос на выделение виртуальной памяти по базовому адресу текущего процесса (по крайней мере, мне так кажется)

Я попытался найти в источнике UPX VirtualAlloc, который, как мне кажется, потребовался бы для этого, и это происходит только один раз в источнике UPX ( https://github.com/upx/upx/search?utf8=%E2%9C%93&q=VirtualAlloc) в, казалось бы, не связанном фрагменте кода, так что я очень запутался.

1 ответ

Решение

Заглушка UPX имеет базовый адрес 0x400000

это неправда. Upx сохранить приложение IMAGE_OPTIONAL_HEADER.ImageBase - так что сжатое изображение UPX всегда загружается на одной базе.

UPX создает 3 раздела:

UPX0 - VirtualSize = OriginalSizeOfImage - UPX0.VirtualAddress; SizeOfRawData = 0 ERW
UPX1 - stub code + packed data
.rsrc - copy of original .rsrc

Таким образом, UPX0 - это место для оригинального изображения - оно содержит адрес и размер исходного изображения. и нулевой размер на диске. Код заглушки UPX распаковывает оригинальный код / ​​данные в UPX0. VirtualAlloc не используется для этого

Другие вопросы по тегам