0

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

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

我做了一个加载器,但它要求应用程序有一个重定位记录,所以它加载到哪个虚拟地址并不重要。

UPX 的 stub 的基地址为 0x400000,当它加载一个基地址为 0x400000 的可执行文件时,就没有问题了。这怎么可能,因为操作系统会拒绝您在当前进程的基地址分配虚拟内存的请求(至少在我看来是这样的)

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

4

1 回答 1

0

UPX 的 stub 的基地址为 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 不用于此

于 2016-12-15T07:26:34.120 回答