我一直在对可执行加载器进行一些研究,有一件让我感到困惑的事情是他们如何应对需要在特定虚拟地址加载的可执行文件(即没有重定位记录)
我知道UPX有能力做到这一点,但是我不知道在UPX源代码中如何处理这个问题(我甚至不知道究竟是什么代码负责加载...)
我制作了一个加载器,但它要求应用程序有一个重定位记录,因此加载它的虚拟地址无关紧要。
UPX的存根的基地址为0x400000,当它加载基地址为0x400000的可执行文件时,它没有问题。这怎么可能,因为操作系统会拒绝你在当前进程的基地址分配虚拟内存的请求(至少在我看来是这样的)
我尝试在UPX源代码中搜索VirtualAlloc,这是我认为完成此操作所需的函数,它只在UPX源代码(https://github.com/upx/upx/search?utf8=%E2%9C%93&q=VirtualAlloc)中出现一次看似无关的代码段,所以我很困惑。
答案 0 :(得分:0)
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不用于此