
Acheron은 SysWhisper3/FreshyCalls/RecycledGate에서 영감을 받은 라이브러리이며, 대부분의 기능이 Go 어셈블리로 구현되어 있습니다.
acheron 패키지는 사용자 모드 후크와 계측 콜백을 사용하여 커널 -> 사용자 공간으로 전환될 때 ntdll.dll로 돌아오지 않는 비정상적인 syscall을 탐지하는 AV/EDR을 우회하기 위해, Golang 트레이드크래프트에 간접 syscall 기능을 추가하는 데 사용할 수 있습니다.
새 syscall 프록시 인스턴스를 생성할 때 다음 단계가 수행됩니다:
Zw* 함수에 대한 시스템 서비스 번호(SSN) 계산syscall;ret 가젯을 열거하여 트램펄린으로 사용acheron을 오프시크 도구에 통합하는 것은 매우 쉽습니다. 패키지는 다음과 같이 설치할 수 있습니다:
go get -u github.com/f1zm0/acheron
그런 다음 acheron.New()를 호출하여 syscall 프록시 인스턴스를 생성하고 acheron.Syscall()을 사용하여 Nt* API에 대한 간접 syscall을 수행하면 됩니다.
최소 예제:
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에 대한 간접 syscall
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(
"%s (status: 0x%x)\n",
"NtAllocateVirtualMemory로 메모리 할당 완료",
retcode,
)
// ...
}
저장소에 포함된 예제는 다음과 같습니다:
| 예제 | 설명 |
|---|---|
| sc_inject | 매우 간단한 프로세스 인젝션 PoC, 직접 및 간접 syscall 모두 지원 |
| process_snapshot | 간접 syscall을 사용하여 프로세스 스냅샷 촬영 |
acheron을 사용하는 다른 프로젝트:
기여는 환영합니다! 향후 추가되면 좋을 기능들은 다음과 같습니다:
제안이나 아이디어가 있으시면 언제든지 이슈 또는 PR을 열어주세요.
이름은 그리스 신화에서 죽은 자의 영혼이 저승으로 운반되는 강인 Acheron에서 따왔습니다.
Note
이 프로젝트는 시맨틱 버전 관리를 사용합니다. 부 및 패치 릴리스는 이전 버전과의 호환성을 깨뜨리지 않아야 합니다. 주요 릴리스는 이전 버전과의 호환성을 깨는 주요 변경 사항에만 사용됩니다.
Warning
이 프로젝트는 교육 목적으로만 제작되었습니다. 소유하지 않은 시스템에서 사용하지 마십시오. 이 프로젝트의 개발자는 라이브러리의 부적절한 사용으로 인해 발생하는 모든 손해에 대해 책임을 지지 않습니다.
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
| acheron과 함께 사용할 수 있는 사용자 정의 인코딩/해싱 함수 예제 |