GalaxyGate项目介绍


GalaxyGate:穿越EDR的星际之门

用户态对抗的技术演进

在端点检测与规避技术的博弈中 我们见证了一场精彩的猫鼠游戏 从早期Hell’s Gate的直接系统调用 到SysWhisper2的间接系统调用 攻击者不断寻找更隐蔽的方式掩盖恶意活动痕迹

如今,现代EDR在用户态主要依靠两大法宝:

  • 内存扫描:深入进程内存寻找恶意特征
  • 栈回溯:通过调用栈分析检测异常行为模式

而对抗栈回溯的终极武器——堆栈欺骗技术应运而生 SilentMoonWalk项目为我们展示了两种欺骗方案:

  • Synthetic: 将可疑堆栈”洗白”
  • Desync: 插入人造栈帧

但为什么不直接借用系统本身的自然调用栈呢?经过一个月的潜心研发与测试 我们推出了GalaxyGate——一种更自然 更优雅的解决方案

GalaxyGate技术揭秘

第一步:寻找完美的”替身演员”

想象你要潜入一场戒备森严的派对 最聪明的做法不是强行闯入 而是跟着一位受信任的嘉宾自然入场 这就是GalaxyGate的核心思想

当我们想调用敏感的NtCreateFile时 不是直接叫门 而是先邀请一位人畜无害的函数 这个函数应当:

  • 极不可能被标记为可疑
  • 会间接调用NtCreateFile

通过对ntdll.dll和kernelbase.dll的深入分析 我们精心挑选了这一完美的”替身”函数——GetTempFileName

第二步:巧妙的”魔术手”切换

现在到了最精妙的部分——在关键时刻完成”偷梁换柱”

  1. 精准定位:提取Syswhisper3的精华 我们能够精确定位系统调用地址 经修改的SW3 会将读取后的SYSCALL_LIST销毁以对抗内存扫描

  2. 无痕Hook:利用NtSetContextThread设置调试寄存器会留下明显痕迹——线程被短暂挂起 而我们的方案则像一场精心编排的芭蕾

    • 故意触发一个内存访问异常
    • 在异常处理中设置硬件断点
    • 整个过程行云流水 VirusTotal云沙箱测试完全无法察觉
1
2
3
4
5
6
7
8
9
*NullPointer = 1; // 我们精心设计的"意外"

// 在异常处理中完成操作
if (pExceptInfo->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) {
pExceptInfo->ContextRecord->Dr0 = (DWORD_PTR)SW3_GetSyscallAddress(Params.FuncHash);
pExceptInfo->ContextRecord->Dr7 = 0x00000303;
pExceptInfo->ContextRecord->Rip += 6; // 跳过"意外"
return EXCEPTION_CONTINUE_EXECUTION;
}

第三步:完美的谢幕表演

当执行流被截获后,完成最后的关键手法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if (pExceptInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) {
// 按照FastCall约定 替换所有参数
pExceptInfo->ContextRecord->Rcx = Params.param[1];
pExceptInfo->ContextRecord->Rdx = Params.param[2];
// ...其他寄存器处理
if (Params.ParamNum > 4) {
int extra_para = Params.ParamNum - 4;
DWORD64* stack = (DWORD64*)(pExceptInfo->ContextRecord->Rsp + 40); // 偏移40字节 保留影子空间
for (int i = 5; i <= Params.ParamNum; ++i) {
stack[i - 5] = (DWORD64)(Params.param[i]); // 通过堆栈传递剩余参数
}
}
// 清理所有痕迹 就像什么都没发生过
pExceptInfo->ContextRecord->Dr0 = 0;
pExceptInfo->ContextRecord->Dr7 = 0;
memset(&Params, 0, sizeof(Params));
return EXCEPTION_CONTINUE_EXECUTION;
}

意外的魔术效果

最令人惊喜的是 即使我们的系统调用成功返回 得益于高层函数的错误处理 其仍然会继续其正常流程 这种自然的”双重表演”使调用栈看起来更加真实可信

灵活应对各种场景

考虑到为482个Nt*函数都找到完美替身不太现实 我们还开发了Legacy模式:

  • 固定使用GetFileAttributesW作为替身
  • 捕获执行流后动态替换系统调用号
  • 保持核心优势的同时提供更大灵活性

结语

GalaxyGate代表了一种新的技术哲学——不是对抗系统 而是融入系统 就像最完美的魔术 观众看到的永远是他们预期看到的东西 而奇迹就发生在他们眼前却无人察觉

欢迎来到用户态对抗的新纪元 在这里 最强大的技术往往看起来最自然无害


文章作者: 菜叶片 & DeepSeekV3
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 菜叶片 & DeepSeekV3 !
  目录