UPX 如何处理没有重定位目录的应用程序?

How does UPX handle Applications without a Relocation Directory?

我一直在对可执行加载器进行一些研究,让我感到困惑的一件事是它们如何处理需要在特定虚拟地址加载的可执行文件(即没有重定位记录)

我知道 UPX 有能力做到这一点,但我没有看到 UPX 源代码中是如何处理的(我什至不确定到底是什么代码负责加载...)

我做了一个加载器,但是它要求应用程序有一个重定位记录,所以它加载到什么虚拟地址都没有关系。

UPX的存根的基地址是0x400000,加载基地址为0x400000的可执行文件时没有问题。这怎么可能,因为 OS 将拒绝您在当前进程的基地址分配虚拟内存的请求(至少在我看来是这样)

我尝试在 UPX 源代码中搜索 VirtualAlloc,我认为这是完成此操作所必需的一个函数,它只在 UPX 源代码 (https://github.com/upx/upx/search?utf8=%E2%9C%93&q=VirtualAlloc) 中的一个看似无关的片段中出现一次代码,所以我很困惑。

UPX's stub has a base address of 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 存根代码将原始 code/data 解压到 UPX0。 VirtualAlloc 不用于此