Как 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 не используется для этого