一款面向 Windows 的可定制投递工具。
缺点:如果线程恢复,事件日志挂起期间发生的所有事件会再次被记录!
所以,决定直接杀死它们!
“这比挂起更具侵入性,但决定权始终在操作者手中。此外,杀死线程会在内核层面被记录。” - @SEKTOR7net
直接通过 VS 编译器:


./compile.bat
PS C:> .\x64\Release\indirect.exe
[!] 错误!
[->] 语法:.\x64\Release\indirect.exe <要欺骗的PPID>
https://github.com/reveng007/DarkWidow/assets/61424547/62a90c5b-84af-4389-8ddc-9f7926debdcf

TIB:
GS 和 FS 寄存器:
PEB LDR 结构:
来自上述链接的进程内存图片:

来自 labs.cognisys.group,作者 @D1rkMtr
的博客:

TIB -> TEB -> PEB -> 解析 Nt API 和 API 哈希
#include <stdint.h>
#include <stdio.h>
#include <Windows.h>
DWORD64 djb2(const char* str)
{
DWORD64 dwHash = 0x7734773477347734;
int c;
while (c = *str++)
dwHash = ((dwHash << 0x5) + dwHash) + c;
return dwHash;
}
int main(int argc, char** argv)
{
if (argc < 2)
{
printf("[!] Wrong!\n");
printf("[->] Syntax: .\\%s <NTFuncName>\n\n", argv[0]);
return 1;
}
const char* string = argv[1];
DWORD64 hashvalue = djb2(string);
printf("Hash Value: 0x%llX\n", hashvalue);
return 0;
}
ACG(任意代码保护)/BlockDll 缓解策略:
PPID 欺骗检测:
Moneta 检测和 PESieve 检测:\
Moneta:

PESieve:

Capa 扫描:

植入进程的线程栈外观:
| 植入进程 | 合法 Cmd 进程 |
|---|---|
![]() | ![]() |
由此可知,通过在间接系统调用 POC 的 ntdll.dll 内存中执行返回指令,可以成功欺骗返回地址,使 ntdll.dll 位于调用栈顶部,EDR 会认为其合法性更高。 - @VirtualAllocEx 来自 DirectSyscall Vs Indirect Syscall
同时感谢 @peterwintrsmith!


设置 SeDebugPrivilege:
从 这里:
到 这里:

杀死事件日志线程:



除了一个低严重性日志外,未产生任何严重告警!

一个低严重性日志 => APC 注入(和之前一样)

另一个中等严重性日志,因设置
SeDebugPrivilege而产生。

合成帧线程栈欺骗 的概念。应用合成帧线程栈欺骗后的栈外观:

这是 NT API 线程栈

这是 shellcode(顺便说一句,这不是自制的,这是 Havoc Shellcode :)) 线程栈。
对于 shellcode 开发,我使用了 havoc 和以下配置:

在此项目中,并不真正需要新建线程起始地址欺骗,因为在 APC 注入技术中,APC 劫持了已有且合法运行的线程的执行流。感谢 @C5pider!

现在事件日志的状态如何?

没有生成任何日志。 我还从 DarkWidow V2 中移除了事件日志杀死部分,这同样减少了事件的生成!
我希望没有遗漏任何人!
来自上述链接的代码片段图片,我用于动态解析 API 而无需硬编码偏移:

我应用的 API 哈希代码: