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-零度非安全](https://wordpress-1251526205.file.myqcloud.com/uploads/2023/04/20230430203558241.png/5Zu+54mH5Y6L57yp)
我们的设计是这样
![图片[2]-执行间接系统调用新方法 — HWSyscalls-零度非安全](https://wordpress-1251526205.file.myqcloud.com/uploads/2023/04/20230430203823746.png/5Zu+54mH5Y6L57yp)
更新
用一些堆栈操作更新了 HWSyscallExceptionHandler 函数逻辑,以使用堆栈可展开。通过直接调用 NTAPI 函数 (它的地址现在在 PrepareSyscall 函数中返回),点击 NTAPI 函数中的 HWBP,创建一个新的堆栈帧并将新堆栈帧返回地址设置为 ADD RSP, 68; RET
(在 kernel32 或 kernelbase) 来完成此操作,同时复制堆栈参数。
堆栈现在完全可以展开,并且实际上是从 ntdll 返回的途中通过 kernel32 返回而不需要任何断点和执行流程操作:
![图片[3]-执行间接系统调用新方法 — HWSyscalls-零度非安全](https://wordpress-1251526205.file.myqcloud.com/uploads/2023/04/20230430205430964.png/5Zu+54mH5Y6L57yp)
若需更多信息,后面将单独写篇文章来讲。
使用
要使用该项目,需要包含 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-零度非安全](https://wordpress-1251526205.file.myqcloud.com/uploads/2023/04/20230430211745665.png/5Zu+54mH5Y6L57yp)
致谢
- Sektor7 for Halosgate and for the HWBP implementation which is taught in their amazing Malware Development Advanced Vol 1.
- @Am0nsec and @RtlMateusz for the original Hellsgate implementation.
- Rad9800 for the inspiration we got from TamperingSyscalls.
- Yxel for the binary pattern matching code we used from Cronos.
暂无评论内容