Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
TamperingSyscalls — 一个使用硬件断点和异常处理程序来检索并伪造 Windows 系统调用参数,从而规避 EDR 遥测的 C++ 库。 | Kitploit
工具/GitHubGitHub/rad9800/tamperingsyscalls
IDS/IPS规避后渗透利用红队Payload 开发
GitHubrad9800/tamperingsyscalls

TamperingSyscalls

一个使用硬件断点和异常处理程序来检索并伪造 Windows 系统调用参数,从而规避 EDR 遥测的 C++ 库。

查看仓库
508764年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

TamperingSyscalls

TamperingSyscalls 是一个包含两部分的新颖项目,由参数欺骗(argument spoofing)和系统调用检索(syscall retrieval)组成,两者都滥用 EH 以规避 EDR。该项目融合了这两个技术,为直接系统调用提供了一种替代方案。

篡改系统调用。

  1. 设置一个全局 EH,稍后将使用它。
root@kitploit:~
SetUnhandledExceptionFilter( OneShotHardwareBreakpointHandler );
  1. 在 Dr0 寄存器上,于包含字节 0f05 的系统调用指令地址处设置一个硬件断点。 我们可以通过这个快速的内存字节搜索来定位系统调用桩的地址。
root@kitploit:~
BYTE stub[] = { 0x0F, 0x05 };
for( unsigned int i = 0; i < (unsigned int)25; i++ )
{
	if( memcmp( (LPVOID)((DWORD_PTR)function + i), stub, 2 ) == 0 ) {
		return (LPVOID)((DWORD_PTR)function + i);
	}
}
  1. 然后我们可以调用这个函数,为前 <=4 个参数传入 NULL(这些往往是更重要的参数,包含进程句柄等信息)。我们还将 EnumState 设置为该函数对应的枚举(以便稍后修复这些参数)。
  2. 虽然 EDR 可以完全检查我们的参数,但由于我们将前 <=4 个参数传为 NULL,它无法确信我们正在执行恶意操作。
  3. 然后 EDR 将返回系统调用编号(SSN)并将其存储在 RAX 中。如果你只对检索系统调用感兴趣,请查看本仓库的 stripped 分支。
  4. 程序随后进入系统调用指令 { 0x0F, 0x05 },该指令命中我们先前设置的断点。这将抛出一个 SINGLE_STEP 异常,由我们在第 1 步中设置的异常处理程序处理。
root@kitploit:~
if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
  1. 只有当 Dr0 和 RIP 匹配时,此异常处理程序才会通过将 Dr0 寄存器指向的值设置为 0(该值应是当前的 RIP)来禁用 Dr0 的硬件断点。
root@kitploit:~
if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
{
	if( ExceptionInfo->ContextRecord->Dr7 & 1 ) {
		if( ExceptionInfo->ContextRecord->Rip == ExceptionInfo->ContextRecord->Dr0 ) {
			ExceptionInfo->ContextRecord->Dr0 = 0;
  1. 然后我们将修复之前设置为 NULL 的其余寄存器。之所以是 4,是因为 x64 调用约定规定我们使用 RCX、RDX、R8、R9 作为前 4 个参数,其余参数在栈上设置。也可以手动在栈上设置 >4 的参数,但这超出了本项目的范围,因为这需要内联汇编。之所以是 R10 而不是 RCX,是因为在每个系统调用桩的开头有 mov r10, rcx,因为 RCX 寄存器会在后续指令中被破坏。
root@kitploit:~
case NTMAPVIEWOFSECTION_ENUM:
	ExceptionInfo->ContextRecord->R10 =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->SectionHandle;

	ExceptionInfo->ContextRecord->Rdx =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->ProcessHandle;

	ExceptionInfo->ContextRecord->R8 =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->BaseAddress;

	ExceptionInfo->ContextRecord->R9 =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->ZeroBits;

在这个示例中,我们可以看到我们正在为 NtMapViewOfSection 修复参数。

如何使用

如果你想开始伪造 EDR 遥测,可以修改 p[FunctionName] 定义,目前它们被设置为 NULL。

生成

要生成所需函数,请使用 gen.py。它支持以下方式:

  • 逗号分隔的函数
root@kitploit:~
python gen.py NtOpenSection,NtMapViewOfSection,NtUnmapViewOfSection

它将生成 3 个文件:TamperingSyscalls.cpp、TamperingSyscalls.h 和 main.cpp。你可以在项目中 #include "TamperingSyscalls.h"。我们可以通过在 p 后面附加函数名来调用这些函数,例如 pNtOpenSection(...);

局限性

我们不能在 NtSetThreadContext 或其变体上设置断点,因为它用于设置调试寄存器。 在设置调试寄存器时有一个短暂的窗口,但这段窗口非常小,我认为我们不会因保持 Dr0 打开而被检测到。

我已发布了一篇简短的博客文章,涉及这些技术。

TamperingSyscall 的概述博客文章

TamperingSyscall 的虚假内省博客文章

下载工具