GalaxyGate:穿越EDR的星际之门
用户态对抗的技术演进
在端点检测与规避技术的博弈中 我们见证了一场精彩的猫鼠游戏 从早期Hell’s Gate的直接系统调用 到SysWhisper2的间接系统调用 攻击者不断寻找更隐蔽的方式掩盖恶意活动痕迹
如今,现代EDR在用户态主要依靠两大法宝:
- 内存扫描:深入进程内存寻找恶意特征
- 栈回溯:通过调用栈分析检测异常行为模式
而对抗栈回溯的终极武器——堆栈欺骗技术应运而生 SilentMoonWalk项目为我们展示了两种欺骗方案:
- Synthetic: 将可疑堆栈”洗白”
- Desync: 插入人造栈帧
但为什么不直接借用系统本身的自然调用栈呢?经过一个月的潜心研发与测试 我们推出了GalaxyGate——一种更自然 更优雅的解决方案
GalaxyGate技术揭秘
第一步:寻找完美的”替身演员”
想象你要潜入一场戒备森严的派对 最聪明的做法不是强行闯入 而是跟着一位受信任的嘉宾自然入场 这就是GalaxyGate的核心思想
当我们想调用敏感的NtCreateFile
时 不是直接叫门 而是先邀请一位人畜无害的函数 这个函数应当:
- 极不可能被标记为可疑
- 会间接调用
NtCreateFile
通过对ntdll.dll和kernelbase.dll的深入分析 我们精心挑选了这一完美的”替身”函数——GetTempFileName
第二步:巧妙的”魔术手”切换
现在到了最精妙的部分——在关键时刻完成”偷梁换柱”
精准定位:提取Syswhisper3的精华 我们能够精确定位系统调用地址 经修改的SW3 会将读取后的SYSCALL_LIST销毁以对抗内存扫描
无痕Hook:利用
NtSetContextThread
设置调试寄存器会留下明显痕迹——线程被短暂挂起 而我们的方案则像一场精心编排的芭蕾- 故意触发一个内存访问异常
- 在异常处理中设置硬件断点
- 整个过程行云流水 VirusTotal云沙箱测试完全无法察觉
1 | *NullPointer = 1; // 我们精心设计的"意外" |
第三步:完美的谢幕表演
当执行流被截获后,完成最后的关键手法:
1 | if (pExceptInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) { |
意外的魔术效果
最令人惊喜的是 即使我们的系统调用成功返回 得益于高层函数的错误处理 其仍然会继续其正常流程 这种自然的”双重表演”使调用栈看起来更加真实可信
灵活应对各种场景
考虑到为482个Nt*函数都找到完美替身不太现实 我们还开发了Legacy模式:
- 固定使用
GetFileAttributesW
作为替身 - 捕获执行流后动态替换系统调用号
- 保持核心优势的同时提供更大灵活性
结语
GalaxyGate代表了一种新的技术哲学——不是对抗系统 而是融入系统 就像最完美的魔术 观众看到的永远是他们预期看到的东西 而奇迹就发生在他们眼前却无人察觉
欢迎来到用户态对抗的新纪元 在这里 最强大的技术往往看起来最自然无害