HWSyscalls是一种使用HWBP、HalosGate和kernel32上的合成跳板执行syscalls的方法
作者:Sec-Labs | 发布时间:
项目介绍
HWSyscalls是一种使用HWBP、HalosGate和带有HWBP的kernel32上的合成跳板执行间接syscalls的新方法。
项目地址
https://github.com/Dec0ne/HWSyscalls
描述
HWSyscalls 是一种使用 3 个主要组件执行间接系统调用的新方法:
- 硬件断点和 Vectored Exception Handler 来控制执行流程。
- HalosGate 用于查找系统调用编号和地址。
- 在带有硬件断点的 kernel32 上创建一个合成蹦床。
HWSyscalls 作为一个易于包含的库提供,可以添加到任何想要使用间接系统调用的项目,而无需基于当前的间接系统调用检测触发 EDR 或 AV 检测。
间接系统调用是一种流行的方法,在不同的变体中用于从 ntdll 调用系统调用,但是,从 ntdll 调用系统调用的主要问题是其核心:从程序直接访问 ntdll 的奇怪访问,而无需通过任何先前的 dll . HWSyscalls 建立在间接系统调用的核心思想之上,但通过结合硬件断点功能来解决这个问题,在 kernel32 和 HalosGate 中创建合成蹦床以获取 SSN。
为了简单起见,正常的间接系统调用流程如下所示:

虽然我们的看起来像这样:

如需更多信息,请查看我们的博文 (即将推出) 。
⚠️ 警告:该项目正在进行中。 当前版本导致堆栈无法展开。 有关堆栈展开的更多信息,请查看 MSDN 上的这篇博文 和 @KlezVirus在 这篇博文 中的解释 。
用法
要使用该项目,您需要包含 HWSyscalls.h 并调用 InitHWSyscalls 以查找所需的小工具并初始化异常处理程序。 在程序执行结束时,调用 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_DEBUG 可以通过更改中的定义 来打开或关闭调试详细信息 HWSyscalls.h
#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 Settings -> C/C++ -> Optimization -> Optimization (Disabled /Od) 禁用它。
例子

致谢
- 用于 Halosgate 和 HWBP 实现的 Sektor7 ,这在他们令人惊叹的 恶意软件开发高级第 1 卷 中有讲授。
- @Am0nsec 和@RtlMateusz 用于 最初的 Hellsgate 实现 。
- Rad9800,感谢我们从 TamperingSyscalls 获得的灵感 。
- Yxel用于我们从 Cronos 使用的二进制模式匹配代码 。