Acheron 是一个受 SysWhisper3/FreshyCalls/RecycledGate 启发的库,大部分功能使用 Go 汇编实现。
acheron 包可用于向您的 Golang 工具链添加间接系统调用能力,以绕过那些利用用户态钩子和 instrumentation callbacks 来检测从内核态返回用户态时未回到 ntdll.dll 的异常系统调用的 AV/EDR。
创建新的系统调用代理实例时,会执行以下步骤:
Zw* 函数的系统服务号syscall;ret 碎片,用作跳板将 acheron 集成到您的 OffSec 工具中非常简单。您可以使用以下命令安装该包:
go get -u github.com/f1zm0/acheron
然后只需调用 acheron.New() 创建系统调用代理实例,并使用 acheron.Syscall() 对 Nt* API 进行间接系统调用。
最小示例:
package main
import (
"fmt"
"unsafe"
"github.com/f1zm0/acheron"
)
func main() {
var (
baseAddr uintptr
hSelf = uintptr(0xffffffffffffffff)
)
// 创建 Acheron 实例,解析 SSN,收集 ntdll.dll 中的干净跳板碎片等
ach, err := acheron.New()
if err != nil {
panic(err)
}
// 对 NtAllocateVirtualMemory 进行间接系统调用
s1 := ach.HashString("NtAllocateVirtualMemory")
if retcode, err := ach.Syscall(
s1, // 函数名哈希
hSelf, // arg1: _In_ HANDLE ProcessHandle,
uintptr(unsafe.Pointer(&baseAddr)), // arg2: _Inout_ PVOID *BaseAddress,
uintptr(unsafe.Pointer(nil)), // arg3: _In_ ULONG_PTR ZeroBits,
0x1000, // arg4: _Inout_ PSIZE_T RegionSize,
windows.MEM_COMMIT|windows.MEM_RESERVE, // arg5: _In_ ULONG AllocationType,
windows.PAGE_EXECUTE_READWRITE, // arg6: _In_ ULONG Protect
); err != nil {
panic(err)
}
fmt.Printf(
"使用 NtAllocateVirtualMemory 分配内存(状态: 0x%x)\n",
retcode,
)
// ...
}
仓库中包含以下示例:
| 示例 | 描述 |
|---|---|
| sc_inject | 极简的进程注入 PoC,支持直接和间接系统调用 |
| process_snapshot | 使用间接系统调用通过系统调用来获取进程快照 |
| custom_hashfunc |
其他使用 acheron 的项目:
欢迎贡献!以下是未来希望具备的一些功能:
如果您有任何建议或想法,欢迎提交 issue 或 PR。
名称来源于希腊神话中的 Acheron 河,这是亡灵被运送到冥界的河流。
注意
本项目使用语义化版本控制。小版本和补丁版本不应破坏与之前版本的兼容性。主版本只会在重大变更(破坏兼容性)时使用。
警告
本项目仅供教育目的创建。不要将其用于您不拥有的系统。本项目的开发者不对因不当使用该库造成的任何损害负责。
本项目采用 MIT 许可证 - 详情请参见 LICENSE 文件。
| 可用于 acheron 的自定义编码/哈希函数示例 |