一款面向 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 哈希
https://stackoverflow.com/questions/41277888/iterating-over-peb-dllname-shows-only-exe-name
https://doxygen.reactos.org/d7/d55/ldrapi_8c_source.html#l01124
labs.cognisys.group,作者 @D1rkMtr 的博客
来自上述链接的代码片段图片,我用于动态解析 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!


到 这里:
