本工具是我们 Brucon2021 会议演讲的一部分实现,演示了利用 对 Lsass 的克隆句柄 来创建其混淆内存转储的方法。
它编译为一个完全位于其文本段的可执行文件。因此,提取出的 PE 文件 .text 段是完全的位置无关代码(PIC),意味着它可以像任何 shellcode 一样被处理。
HandleKatz 在内存中执行时占用非常小的足迹,因为它本身不分配任何额外的可执行内存,因此可以有效地与如 @_ForrestOrr 描述的 (Phantom)DLL-Hollowing 等概念结合使用。这与诸如 Donut、SRDI 或反射加载器等 PIC PE 加载器形成对比,这些加载器在 PE 加载过程中会分配更多可执行内存。 此外,它使用了修改版的 ReactOS MiniDumpWriteDump,并利用 RecycledGate 绕过用户态钩子。
详细信息请参阅本仓库中的 PDF 文件 PICYourMalware.pdf。
请注意 不同的编译器(版本)会产生不同的结果。这可能会生成带有重定位的 PE 文件。
所有测试均使用 x86_64-w64-mingw32-gcc mingw-gcc version 11.2.0 (GCC) 进行。生成的 PIC 已在以下系统上成功测试:Windows 10 Pro 10.0.17763。在其他 Windows 版本上,API 哈希可能不同。
要使用该 PIC,需在可执行内存中为 shellcode 投射一个指针,并按照以下定义调用:
DWORD handleKatz(BOOL b_only_recon, char* ptr_output_path, uint32_t pid, char* ptr_buf_output);
要解混淆转储文件,可使用脚本 Decoder.py。
Loader 实现了 HandleKatz 的示例加载器:
loader.exe --pid:7331 --outfile:C:\Temp\dump.obfuscated

由于使用了克隆句柄和修改的 ReactOS 代码,无法在 Lsass 上观察到 ProcessAccess 事件。但是,可以在持有 Lsass 句柄的程序上观察到 ProcessAccess 事件。
防御者可以监视设置了 PROCESS_DUP_HANDLE (0x0040) 的 ProcessAccess 掩码,以识别此工具的使用。