我正在编写一个基本的PE包装器,目的只是为了在内存中执行附加的目标PE。我花了几天的时间来熟悉格式,我认为我已经足够了解它了。这些是我使用的方法:首先,将目标插入到nasm生成的目标文件的.data部分中,然后将其与加载器捆绑在一起
执行后,将检查图像数据目录,并通过加载所需的库和函数来正确绑定导入地址表。
PE及其所有部分都需要正确地布置在内存中,因此,将读取ImageBaseSizeOfImage,并为接下来的两个操作分配足够的虚拟内存。
PE标头被写入新位置。新的内存空间,每个都放入其指定的虚拟地址。还设置了通过VirtualProtect()的适当权限。
最后,将调用OptionalHeader.AddressOfEntryPoint

加载器当然具有奇特的映像库,以免与标准0x00400000库冲突。我的问题就在那儿。几乎每个.exe的重定位表都被剥离,因此,如果所需的基址不可用,则无法进行基址重定位。具有非标准图像库的加载器在一定程度上解决了该问题。目标的所需基准仅在大约50%的运行中可用。我试图找出其他50%可能占用的内存,并且发现它几乎总是截面图。我不知道什么或谁。我尝试同时使用NtUnmapViewOfSectionNtFreeVirtualMemory,但它们不能解决问题。第一个似乎引入了内存损坏,第二个却什么也没有做。有什么办法可以要求那个记忆吗?这是ProcessHacker的屏幕截图:


欢迎所有想法。

#1 楼

您可能想要:


使您的打包程序存根具有相同的标准ImageBase
在其他地方分配内存
重新放置(独立于EIP的存根代码)在那里
在原始ImageBase上重建原始代码而没有任何风险。


评论


在问问题和来这里检查答案之间,我想到的完全是一样的!是的,我想会做到的。

– hauzer
13年8月30日在19:09

#2 楼

尝试从过程挖空中获取代码灵感。

这是一个在新空间上远程运行它的代码: />https://github.com/m0n0ph1/进程跟随到RWX分配的内存并从中运行。

我还没有深入研究资源加载。但是,如果新的PE映像使用LoadResource,则可能会读取加载程序的内容。对此不确定。

通过调试UPX打包的示例,您可以获得更多的想法。