执行间接系统调用新方法 — HWSyscalls

执行间接系统调用新方法 — HWSyscalls

HWSyscalls 是一种使用了 3 种技术来执行间接系统调用 (indirect syscalls) 的新方法:

  • 通过硬件断点和 VEH 来控制执行流程;
  • HalosGate 用于查找系统调用 (syscalls) 编号和地址;
  • 在带有硬件断点的 kernel32 上创建一个跳转;

HWSyscalls 可作为一个为其它程序用作 indirect syscalls 的库,来规避 EDR 或 AV 的检测。

indirect syscalls 是不同变体从 ntdll 调用 syscalls 的一种较流行方法,但从 ntdll 调用 syscalls 的主要问题是其核心:从程序直接访问 ntdll,而不经过任何之前的 dll。HWSyscalls 建立在 indirect syscalls 的核心思想上,通过结合硬件断点功能来解决这个问题,在 kernel32 和 HalosGate 中创建一个跳转以获取 SSNs。

图片[1]-执行间接系统调用新方法 — HWSyscalls-零度非安全
正常的间接系统调用 (indirect syscalls) 流程

我们的设计是这样

图片[2]-执行间接系统调用新方法 — HWSyscalls-零度非安全
while ours looks like this

更新

用一些堆栈操作更新了 HWSyscallExceptionHandler 函数逻辑,以使用堆栈可展开。通过直接调用 NTAPI 函数 (它的地址现在在 PrepareSyscall 函数中返回),点击 NTAPI 函数中的 HWBP,创建一个新的堆栈帧并将新堆栈帧返回地址设置为 ADD RSP, 68; RET (在 kernel32 或 kernelbase) 来完成此操作,同时复制堆栈参数。

堆栈现在完全可以展开,并且实际上是从 ntdll 返回的途中通过 kernel32 返回而不需要任何断点和执行流程操作:

图片[3]-执行间接系统调用新方法 — HWSyscalls-零度非安全
执行流程

若需更多信息,后面将单独写篇文章来讲。

使用

要使用该项目,需要包含 HWSyscalls.h 并调用 InitHWSyscalls 来查找所需的 gadgets 并初始化异常处理程序。在程序执行结束时,调用 DeinitHWSyscalls 以删除异常处理程序。

#include "HWSyscalls.h"

typedef NTSTATUS(WINAPI* NtOpenProcess_t)(
	OUT          PHANDLE            ProcessHandle,
	IN           ACCESS_MASK        DesiredAccess,
	IN           POBJECT_ATTRIBUTES ObjectAttributes,
	IN OPTIONAL  PCLIENT_ID         ClientId);

void main() {

    // Initialize the exception handler and find the required gadgets.
    if (!InitHWSyscalls())
        return;
    
    // ...

    // Execute your function!
    NtOpenProcess_t pNtOpenProcess = (NtOpenProcess_t)PrepareSyscall((char*)("NtOpenProcess"));
    NTSTATUS status = pNtOpenProcess(&targetHandle, PROCESS_ALL_ACCESS, &object, &clientID);

    // ...

    // Removing the exception handler.
    DeinitHWSyscalls();

}

可以通过更改 HWSyscalls.h 中的 HWSYSCALLS_DEBUG 定义来打开或关闭调试详细信息

#pragma once
#include <windows.h>
#include <inttypes.h>
#include <stdio.h>

#pragma region Defines

#define HWSYSCALLS_DEBUG 0 // 0 disable, 1 enable
#define UP -32
//...

安装

要编译此项目,需要 Visual Studio 2019 及更高版本,需要注意的是,该项目仅适用于 x64 环境,需要在不进行优化的情况下进行编译,可以从 Project Setting -> C/C++ -> Optimization -> Optimization (Disabled /Od) 来禁用。

例子

图片[4]-执行间接系统调用新方法 — HWSyscalls-零度非安全
应用此项目的例子

致谢

© 版权声明
THE END
喜欢就支持一下吧
点赞2 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容