使用Go汇编进行AV/EDR规避的间接系统调用

作者:Sec-Labs | 发布时间:

项目地址

https://github.com/f1zm0/acheron

ad1a1b7183002011

 

Acheron是一个受到SysWhisper3/FreshyCalls/RecycledGate启发的库,其中大部分功能都是用Go汇编实现的。

acheron包可以用于为您的Golang工艺添加间接系统调用的功能,以绕过使用用户模式钩子和instrumentation callbacks检测不返回到ntdll.dll的异常系统调用的杀毒软件/EDR。当调用从内核转换回用户态时。

主要特性

  • 无依赖性
  • 纯Go和Go汇编实现
  • 支持自定义字符串加密/哈希函数以抵抗静态分析

工作原理

创建新的系统调用代理实例时,会执行以下步骤:

  1. 遍历PEB以获取内存中ntdll.dll的基址

  2. 解析导出目录以获取每个导出函数的地址

  3. 计算每个Zw*函数的系统服务号码

  4. 枚举ntdll.dll中未被钩取/清除的syscall;ret片段,用作跳板

  5. 创建代理实例,可用于进行间接(或直接)系统调用

快速入门

acheron集成到您的安全工具中非常简单。您可以使用以下命令安装该包:

shellCopy codego 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)
    )

    // creates Acheron instance, resolves SSNs, collects clean trampolines in ntdll.dlll, etc.
    ach, err := acheron.New()
    if err != nil {
        panic(err)
    }

    // indirect syscall for NtAllocateVirtualMemory
    s1 := ach.HashString("NtAllocateVirtualMemory")
    if retcode, err := ach.Syscall(
        s1,                                     // function name hash
        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(
        "allocated memory with NtAllocateVirtualMemory (status: 0x%x)\n",
        retcode,
    )

    // ...
}

 

示例

该存储库包含以下示例:

示例 描述
sc_inject 非常简单的进程注入概念验证,支持直接和间接系统调用
process_snapshot 使用间接系统调用对进程进行快照
custom_hashfunc 使用acheron的自定义编码/哈希函数示例

其他使用acheron的项目:

贡献

欢迎贡献!以下是一些未来可能有用的功能:

  • 32位支持
  • 其他解析器类型(例如HalosGate/TartarusGate)
  • 更多示例

如果您有任何建议或想法,请随时提出问题或PR。

 

 

参考资料

标签:工具分享, 免杀工具, 免杀技巧, 主机安全