
استدعاءات النظام غير المباشرة لتجاوز برامج مكافحة الفيروسات وأنظمة كشف الاستجابة للنقاط الطرفية في لغة تجميع Go
أكيرون (Acheron) هي مكتبة مستوحاة من SysWhisper3/FreshyCalls/RecycledGate، مع تنفيذ معظم الوظائف في لغة تجميع Go.
يمكن استخدام حزمة acheron لإضافة قدرات استدعاءات النظام غير المباشرة (indirect syscall) إلى أدواتك في Golang، لتجاوز برامج مكافحة الفيروسات (AV) وأنظمة اكتشاف التهديدات (EDRs) التي تستخدم خطافات وضع المستخدم (usermode hooks) وعمليات الاسترجاع الخاصة بالأجهزة (instrumentation callbacks) instrumentation callbacks للكشف عن استدعاءات النظام الشاذة التي لا تعود إلى ntdll.dll عند انتقال الاستدعاء من النواة إلى مساحة المستخدم.
يتم تنفيذ الخطوات التالية عند إنشاء مثيل وكيل استدعاء نظام جديد:
Zw*syscall;ret النظيفة (غير المخطوفة) في ntdll.dll، لاستخدامها كمنصات انتقال (trampolines)دمج acheron في أدواتك الأمنية سهل للغاية. يمكنك تثبيت الحزمة باستخدام:
go get -u github.com/f1zm0/acheron
ثم عليك فقط استدعاء acheron.New() لإنشاء مثيل وكيل استدعاء نظام واستخدام acheron.Syscall() لإجراء استدعاء نظام غير مباشر لواجهات برمجة التطبيقات Nt*.
مثال بسيط:
package main
import (
"fmt"
"unsafe"
"github.com/f1zm0/acheron"
)
func main() {
var (
baseAddr uintptr
hSelf = uintptr(0xffffffffffffffff)
)
// إنشاء مثيل Acheron، حل أرقام خدمة النظام (SSNs)، جمع القفزات النظيفة في 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 | إثبات قدرة حقن عملية بسيط للغاية، مع دعم كل من استدعاءات النظام المباشرة وغير المباشرة |
| process_snapshot |
مشاريع أخرى تستخدم acheron:
المساهمات مرحب بها! فيما يلي بعض الأشياء التي سيكون من الجيد توفرها في المستقبل:
إذا كانت لديك أي اقتراحات أو أفكار، فلا تتردد في فتح مشكلة (issue) أو طلب سحب (PR).
الاسم هو إشارة إلى نهر أكيرون في الأساطير اليونانية، وهو النهر الذي تُنقل فيه أرواح الموتى إلى العالم السفلي.
ملاحظة
يستخدم هذا المشروع التحكم الدلالي في الإصدارات. يجب ألا تكسر الإصدارات الثانوية والتصحيحية التوافق مع الإصدارات السابقة. سيتم استخدام الإصدارات الرئيسية فقط للتغييرات الكبيرة التي تكسر التوافق مع الإصدارات السابقة.
تحذير
تم إنشاء هذا المشروع لأغراض تعليمية فقط. لا تستخدمه على أنظمة لا تملكها. مطور هذا المشروع غير مسؤول عن أي ضرر ناتج عن الاستخدام غير السليم للمكتبة.
هذا المشروع مرخص بموجب رخصة MIT - راجع ملف LICENSE للحصول على التفاصيل.
| استخدام استدعاءات النظام غير المباشرة لأخذ لقطات للعمليات باستخدام استدعاءات النظام |
| custom_hashfunc | مثال على دالة تشفير/تجزئة مخصصة يمكن استخدامها مع acheron |