
أداة لتحليل ذاكرة ويندوز وصيد التهديدات تقوم بمسح ذاكرة العمليات الحية بحثًا عن أنماط ضارة وتقنيات حقن وتجميعات .NET المحملة بشكل عكسي باستخدام نموذج ثقة متعدد الطبقات لتقليل الإيجابيات الكاذبة.

الإصدار : 0.9 (إصدار مستقر)
Aether هي أداة لتحليل الذاكرة الجنائي وصيد التهديدات لنظام Windows، تقوم بمسح ذاكرة العمليات الحية بحثًا عن أنماط خبيثة، وتكتشف تقنيات الحقن، وتوقيعات البرامج الضارة، وتجميعات .NET المحملة انعكاسيًا. تعمل الأداة بنموذج ثقة متعدد الطبقات يقلل بشكل كبير من معدل النتائج الإيجابية الكاذبة ويصطاد السلوك الخبيث. تمتلك Aether قدرات جيدة في كشف تقنيات Hollowing و APC وخطف الخيوط. يمكن لمحللي الأمان استخدامها للمسح والاصطياد وأخذ لقطات من المناطق المشبوهة للتحليل دون اتصال.
الوثائق: https://0xsp.com/docs/aether-getting-started/
المقالات البحثية:
شرح سريع للميزات الأساسية لـ Aether، يمكنك قراءة المقالة الفنية الكاملة للحصول على مزيد من الرؤى:
"msxsl:script" => 6D 00 73 00 78 00 ...)rules/
دون إعادة ترجمةMEM_PRIVATE — يحدد تجميعات .NET المحملة انعكاسيًا
(بيانات MZ + PE + BSJB)تقوم Aether بطبقة خمسة عوامل تصفية فوق إشارة مجموعة العمل الخام بحيث يتطلب الاكتشاف عدة مؤشرات متوافقة قبل الإبلاغ عنه مع تصفية FP:
فحوصات هيكلية أخرى:
MEM_IMAGE غير موجودة في
قائمة وحدات PEB (تجميع DLL المجوف / استبدال الوحدة)K32QueryWorkingSetEx، على دفعات باستدعاء نظام واحد لكل منطقة بدلاً
من واحد لكل صفحة 4 كيلوبايت (≈ أسرع 50-100× من الحلقة الساذجة)MEM_PRIVATE + PAGE_EXECUTE_* (ينتج نتائج FP)
(شفرة شل، رش JIT، تخصيصات كود ديناميكي)E9 ?? ?? ?? ?? — JMP rel32FF 25 ?? ?? ?? ?? — JMP [rip+disp32]68 ?? ?? ?? ?? C3 — PUSH imm32 ; RET48 B8 ?? ?? ?? ?? ?? ?? ?? ?? FF E0 — MOV RAX, imm64 ; JMP RAXتتحقق Aether من الخيوط بتصنيف أكثر صرامة و
ارتباط متقاطع مع نتائج L1–L5. لكل خيط تم إنشاؤه في العملية المستهدفة، تقرأ Aether
Win32StartAddress الخاص به عبر NtQueryInformationThread
وعندما تسمح الصلاحية، تقرأ أيضًا Rip / Eip الفعلي عبر
GetThreadContext / Wow64GetThreadContext.
ثم يتم تصنيف كل عنوان حسب الجدول التالي، لمزيد من التفاصيل اقرأ المقالة:
ما يجعل هذا أقوى من الفحص الأساسي "هل عنوان البداية في أي وحدة":
VirtualQueryEx — يتم الاستعلام عن كل عنوان للحصول على Type /
Protect / AllocationBase في استدعاء O(1) واحد بدلاً من مسح خطي
عبر قائمة الوحداتTSAV_MODIFIED_HOSTWin32StartAddress عبر
NtSetInformationThread وهو الحقل القابل للتزييف؛ Rip الفعلي للخيط المعلق هو الذي لا يستطيع المحمل إعادة كتابته بسهولة. نقارن بينهما ونعلم على أي اختلاف يحل إلى منطقة مشبوهةWow64GetThreadContext ويقرأ
Eip للخيوط ذات 32 بت داخل عملية 64 بتQUERY_INFORMATION | GET_CONTEXT → → لكل
خيط، بحيث تظل السيناريوهات ذات الوصول الجزئي تنتج تصنيفات مفيدةتحليل API في وقت التشغيل هو تقنية تستخدمها البرامج الضارة بشكل متكرر. تحدد آلية الكشف في Aether هذا السلوك من خلال مسح الكومة بحثًا عن عناوين ومؤشرات وحدات صالحة، وربط النتائج بمعايير التصفية الموضحة أدناه:
كل مرشح يقتل فئة FP محددة تم ملاحظتها في القياسات الحقيقية:
تدعم Aether كشف نمط XOR على مستوى الرأس في الوقت الحالي وتتبنى خوارزمية إنتروبيا شانون للتحقق من عشوائية قيم البايت في منطقة الذاكرة، وتعلم على كل شيء فوق عتبة. لمعالجة الكمية الكبيرة من FP، تستخدم Aether مؤشرات متعددة.
GetExtendedTcpTable لمعرف PID الهدفMODIFIED_CODE_* تحمل
private_pages و region_pages حتى يكون للفرز الأرقام الفعليةAether.exe --scan --pid <PID> [خيارات]
Aether.exe --scan --lookup "اسم_العملية.exe"
Aether.exe --hunt <PID> SLEEP_MS PERIOD
Aether.exe --scan-all [خيارات]
git clone https://github.com/0xsp-SRD/aether
cd aether
# بناء التصحيح (تفعيل فحوصات الأمان)
zig build
# بناء الإصدار (ملف ثنائي أصغر وأسرع)
zig build -Doptimize=ReleaseSafe
# أو
zig build -Doptimize=ReleaseFast
الملف القابل للتنفيذ المبني يقع في zig-out/bin/Aether.exe.
انسخ zig-out/bin/Aether.exe والدليل rules/ إلى جهاز Windows الهدف
إذا كنت تريد إجراء مسح إضافي للتوقيعات. إذا كانت العملية المستهدفة تتطلب صلاحيات إدارية، فستحتاج إلى تشغيل Aether.exe بصلاحيات المسؤول.
Win32StartAddress
على خيط قيد التشغيل بالفعل يمكن اكتشافها فقط إذا كان الخيط
متوقفًا في انتظار عند الفحص (نفس القيد في Moneta)Aether Community مرخص بموجب رخصة GNU GPL v3.0. التراخيص التجارية متاحة فقط من المؤلف للاستخدام الخاص أو التجاري.
| الطبقة | الفلتر | الغرض |
|---|
| L1 | هيكلي | يتم النظر فقط في المناطق الفرعية القابلة للتنفيذ من IMAGE (يزيل ضوضاء COW من .data / .rdata) |
| L2 | كمي | التصنيف حسب عدد private_pages ونسبة private_ratio (منخفض / متوسط / مرتفع) |
| L3 | تأكيد | الترقية فقط إذا وافقت إشارة مستقلة على نفس قاعدة التخصيص — ضربة توقيع، missing_peb_entry، private_rwx، مقدمة خطاف، أو فرق القرص |
| L4 | مدرك لـ CLR | إخفاء لكل وحدة لأهداف ngen / R2R / tiered-JIT (*.ni.dll، mscor*، clr*، coreclr، system.private.corelib*) بدلاً من التخطي الشامل عند تحميل CLR |
| L5 | فرق القرص | تعيين ملف الوحدة باستخدام CreateFileMappingW(SEC_IMAGE_NO_EXECUTE)؛ مقارنة أول 16 بايت من كل صفحة قابلة للتنفيذ خاصة بنفس عنوان RVA على القرص. أي اختلاف هو مؤشر IOC للتعديل الحقيقي |
49 BB ?? ?? ?? ?? ?? ?? ?? ?? 41 FF E3 — على غرار Detours
MOV R11, imm64 ; JMP R11Cor_Private_IPCBlock_v4_<PID>
وأيضًا Cor_Private_IPCBlock_<PID> الخاص بـ v2 (إصدارات .NET 2/3 / mscorwks القديمة)،
بحيث لا يتم تصنيف تجمعات التطبيقات المزعجة التي تشغل وقت تشغيل قديم بشكل خاطئ| الحكم | الشدة | الشرط |
|---|
TSAV_SHELLCODE_PRIVATE | خطير | العنوان موجود في منطقة MEM_PRIVATE + PAGE_EXECUTE_* — شفرة شل كلاسيكية CreateRemoteThread |
TSAV_SUSPENDED_RIP | خطير | Rip للخيط المعلق لا يتطابق مع Win32StartAddress ويحل إلى منطقة مشبوهة — يكتشف التزييف Win32StartAddress (حيل EarlyBird / APC) وخطف SetThreadContext |
TSAV_HOLLOWED_HOST | عالي | العنوان داخل تخصيص MEM_IMAGE غير موجود في قائمة وحدات PEB (تجميع DLL المجوف / استبدال الوحدة) |
TSAV_MODIFIED_HOST | عالي | العنوان داخل تخصيص MEM_IMAGE تم بالفعل وضع علامة عليه بواسطة خط أنابيب L1–L5 كـ MODIFIED_CODE_* أو MISSING_PEB أو PRIVATE_RWX أو DISK_MEM_DIFF أو HOOK_PROLOGUE |
TSAV_STAGED_PRIVATE_RW | عالي | MEM_PRIVATE + PAGE_READWRITE — تجهيز شفرة شل قبل VirtualProtect |
TSAV_MAPPED_NONPE | متوسط | MEM_MAPPED (قسم مدعوم بملف الصفحات) بدون رأس PE — محمل انعكاسي sRDI / pagefile |
TSAV_SPOOF_TRAMPOLINE | متوسط | العنوان يطابق قفزة trampoline في القائمة المحظورة (LoadLibraryA/W/ExA/W، WinExec، CreateProcessA/W، VirtualAlloc[Ex]، RtlExitUserThread، RtlExitUserProcess، NtTerminateProcess، ShellExecuteA/W) |
QUERY_INFORMATIONQUERY_LIMITED_INFORMATION| المرشح | القاعدة | فئة FP التي يزيلها |
|---|
| F1 | count >= 5 | بيانات عشوائية الشكل كمؤشرات، NULL، HMODULES |
| F2 | رفض التشغيلات التي تشير فقط إلى ملف EXE المضيف | جداول vtables من فئة C++ للتطبيقات |
| F3 | distinct_modules >= 2 | جداول vtables من إطار عمل DLL واحد (Qt، MFC، wxWidgets) |
| F4 | capability_modules >= 2 | جداول vtables من المتصفح / CRT تلمس DLL نظام واحد (مثل iertutil + ucrtbase + shlwapi) |
| F5 (L10) | >= 80% من المؤشرات القابلة للفحص تهبط على RVAs مصدرة | جداول إرسال Winsock LSP، مصفوفات رد الاتصال الإضافية، vtables تشير إلى طرق داخلية (غير مصدرة) |
| العلم | الوصف |
|---|
--pid, -p <PID> | معرف العملية المستهدفة للمسح |
--lookup, -l <name> | البحث عن جميع معرفات PID المطابقة لاسم عملية |
--json, -j | إخراج النتائج بصيغة JSON (لتكامل SIEM) |
--verbose, -v | عرض تفاصيل المسح لكل منطقة |
--scan-all, -a | مسح جميع العمليات |
--hunt, -b <PID> [ms] [hits] | مراقبة الاتصالات — استطلاع كل ms (افتراضي 2000)، وضع علامة على النقاط الطرفية بعدد مرات ظهور ≥ hits |
--networking | وضع مراقبة الشبكة |
--rules, -r <dir> | دليل القواعد (افتراضي: rules/) |
--config, -c <file> | ملف قاعدة واحد (تنسيق قديم) |
--dump, `` | تفريغ منطقة ذاكرة محددة بحجم مخصص |
--read, `` | قراءة محتوى منطقة الذاكرة مباشرة على الطرفية |
--help, -h | عرض المساعدة |