关于ThreadStackSpoofer被扫描器或分析工具检测到。ThreadStackSpoofer是线程堆栈欺骗技术的示例实现,旨在通过在受检查的线程调用堆栈中查找对shellcode框架的引用来逃避恶意软件分析、防病毒产品和EDR。这个想法是在线程的调用堆栈上隐藏对shellcode的引用,从而伪装包含恶意代码的内存分配。借助该工具,可以帮助提高现有商业C2产品的安全性,协助红队研究人员开发更好的安全产品/工具。ThreadStackSpoofer的大致运行机制和算法如下:从文件中读取Shellcode的内容;从dll中获取所有必要的函数指针,然后调用SymInitialize;设置kernel32!Sleepdog,并指向我们的回调;通过VirtualAlloc+memcpy+CreateThread注入并启动Shellcode。线程应该由我们的runShellcode函数来启动,避免线程的StartAddress节点进入一些意想不到的或者不正常的地方(比如ntdll!RtlUserThreadStart+0x21);当Beacon尝试休眠时,我们的MySleep回调将被调用;然后接下来,我们将栈内存中最新的返回地址改写为0;最后会调用::SleepEx让Beacon继续等待后续的连接;sleep结束后,我们会恢复之前存储的原始函数返回地址,并继续执行挂起的任务;函数的返回地址将分散在线程的堆栈内存区域周围,由RBP/EBP寄存器指向。为了在栈上找到它们,我们需要先收集帧指针,然后解引用覆盖:*(PULONG_PTR)(frameAddr+sizeof(void*))=Fake_Return_Address;工具下载研究者可以使用以下命令来项目源码克隆到本地:gitclonehttps://github.com/mgeeky/ThreadStackSpoofer.git工具使用示例C:\>ThreadStackSpoofer.exe其中::Shellcode文件路径;:“1”或“true”表示启用线程堆栈内存欺骗,其他参数表示禁用该技术;线程调用堆栈欺骗Beacon的示例:PSD:\dev2\ThreadStackSpoofer>.\x64\Release\ThreadStackSpoofer.exe.\tests\beacon64.bin1[.]Readingshellcodebytes...[.]Hookingkernel32!Sleep...[.]Injectingshellcode...[+]Shellcodeisnowrunning.[>]Originalreturnaddress:0x1926747bd51.Finishingcallstack...===>MySleep(5000)[<]Restoringoriginalreturnaddress...[>]Originalreturnaddress:0x1926747bd51.Finishingcallstack...===>MySleep(5000)[<]Restoringoriginalreturnaddress...[>]Originalreturnaddress:0x1926747bd51.Finishingcallstack...工具使用demo示例中演示了未实现欺骗技术时的堆栈调用情况:threadstackspoofingenabled如下图所示:在上面的例子中,我们可以看到调用栈中的最新帧是MySleepCallback我们可以通过搜索规则找到调用栈还没有扩展到系统库的线程的入口点:kernel32!BaseThreadInitThunk+0x14ntdll!RtlUserThreadStart+0x21上图是未修改的TotalCommanderx64线程。正如我们所看到的,它的调用堆栈在初始调用堆栈框架方面与我们自己的非常相似。项目地址ThreadStackSpoofer:[GitHub传送门]