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