天堂之门(Heaven’s Gate)是一种特殊的代码注入技术,主要用于在32位进程中执行64位代码,或者绕过 某些安全机制。这项技术得名于Windows系统中一个特殊的调用门机制。
关于windows系统32位程序在64位系统上的运行机制
在64位Windows系统上运行32位程序时,系统通过一套称为WOW64(Windows-on-Windows 64-bit)的兼容层机制实现无缝运行。
API调用转换:当32位程序调用Windows API时,WOW64将32位API调用动态转换为对应的64位API(例如将kernel32.dll重定向到kernel64.dll)。
注册表重定向:32位程序访问HKEY_LOCAL_MACHINE\SOFTWARE时,会被重定向到HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node,避免与64位程序冲突。
文件系统重定向:32位程序访问C:\Program Files时,实际指向C:\Program Files (x86)(可通过Wow64DisableWow64FsRedirection API禁用重定向)。
DLL加载:32位程序加载的DLL来自SysWOW64目录(如C:\Windows\SysWOW64),64位程序则使用System32目录(如C:\Windows\System32)。
效果作用
即便调用了API函数CreateFileA来创建文件,在Xdbg中仍然无法断下,这可以给软件逆向分析人员造成困难,使其没注意到关键操作
不过如果分析人员断下的是ntdll64中的zwcreatefie,就仍然能够断点断下
微步的在线沙箱分析无法获取天堂之门的操作,即使其创建了文件,仍然没有监测到
病毒分析常用的进程监控工具是可以捕获到文件创建的
关键实现
编写一个x64call函数,将要调用的64位API名称传入进行调用
1 | uint64_t X64Call(uint64_t proc, uint32_t argc, ...) { |
在调用x64call时,传入的函数地址也得是x64下获取的函数地址,这点可以通过访问64位系统的PEB来实现。
在windows操作系统中 32位程序(WoW64) 下,进程确实同时拥有 32位PEB(_PEB) 和 64位PEB(_PEB64)
PEB存放的位置
首先切换到64位模式下,通过x64汇编获取GS:[0x60]处的PEB64结构,其他部分手法与上个函数相同,就不写注释了
1 | void GetPEB64(void *peb64) { |
memcopy函数的32转64写法实现
1 | void memcpy64(uint64_t dst, uint64_t src, uint64_t sz) { |
经典动态获取指定模块的地址,从PEB+0x18获取Ldr的地址从Ldr+0x10获取InLoadOrderModuleList地址遍历InLoadOrderModuleList获取模块基址通过模块基址获取模块名,并与moduleName比对,比对成功则返回该模块基址
1 | uint64_t GetModuleHandle64(const WCHAR *moduleName) { |
从kernelbase中获取getprocessadress的地址
1 | uint64_t MyGetProcAddress(uint64_t hModule, const char* func) { |
创建文件测试
1 | int main() { |
总结
天堂之门主要作用于反沙箱,对于hook在ntdll.dll(64位版本)的EDR等杀毒产品用处不大
这里有一点要注意,虽然ntdll也有32位版本,但是32位版本经过转换后仍然会调用64位版本的ntdll