Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
TamperingSyscalls — مكتبة C++ تسترجع وتزور وسائط استدعاءات نظام Windows باستخدام نقاط توقف الأجهزة ومعالجات الاستثناءات لتقويض تتبع EDR. | Kitploit
أدوات/GitHubGitHub/rad9800/tamperingsyscalls
التهرب من IDS/IPSما بعد الاستغلالالفريق الأحمرتطوير الحمولات
GitHubrad9800/tamperingsyscalls

TamperingSyscalls

مكتبة C++ تسترجع وتزور وسائط استدعاءات نظام Windows باستخدام نقاط توقف الأجهزة ومعالجات الاستثناءات لتقويض تتبع EDR.

عرض المستودع
50876منذ 4 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

TamperingSyscalls

TamperingSyscalls هو مشروع جديد من جزأين يتكون من انتحال الوسائط (argument spoofing) واسترجاع استدعاءات النظام (syscall retrieval)، وكلاهما يسيء استخدام معالج الاستثناءات (EH) من أجل خداع حلول EDRs. يجمع هذا المشروع بين هذين المشروعين لتوفير حل بديل لاستدعاءات النظام المباشرة.

العبث باستدعاءات النظام (Tampering with syscalls).

  1. قم بإعداد معالج استثناءات عام (EH) سيُستخدم لاحقًا.
root@kitploit:~
SetUnhandledExceptionFilter( OneShotHardwareBreakpointHandler );
  1. قم بتعيين نقطة توقف للأجهزة (hardware breakpoint) على عنوان تعليمة استدعاء نظام تحتوي على البايتات 0f05 في سجل Dr0. يمكننا تحديد عنوان كعبرة استدعاء النظام (syscall stub) عبر هذا البحث السريع عن البايتات في الذاكرة.
root@kitploit:~
BYTE stub[] = { 0x0F, 0x05 };
for( unsigned int i = 0; i < (unsigned int)25; i++ )
{
	if( memcmp( (LPVOID)((DWORD_PTR)function + i), stub, 2 ) == 0 ) {
		return (LPVOID)((DWORD_PTR)function + i);
	}
}
  1. يمكننا بعد ذلك استدعاء هذه الدالة مع تمرير NULL للوسائط الأربع الأولى أو أقل (والتي عادةً ما تكون الوسائط الأكثر أهمية التي تحمل معلومات مثل مقابض العمليات وما إلى ذلك). كما نقوم أيضًا بتعيين EnumState إلى التعداد (Enum) المقابل لهذه الدالة (حتى نتمكن لاحقًا من إصلاح الوسائط).
  2. بينما يتمتع حل EDR باطلاع كامل على وسائطنا، فإنه لا يمكنه بثقة اتخاذ القرار بأننا نقوم بإجراء ضار لأننا مررنا NULL للوسائط الأربع الأولى أو أقل.
  3. سيقوم حل EDR بعد ذلك بإرجاع رقم استدعاء النظام (SSN) وتخزينه في RAX. إذا كنت مهتمًا فقط باسترجاع استدعاءات النظام، تفقد الفرع stripped من هذا المستودع.
  4. يتدفق البرنامج بعد ذلك إلى تعليمة استدعاء النظام { 0x0F, 0x05 } والتي تصطدم بنقطة التوقف التي قمنا بتعيينها سابقًا. سيؤدي هذا إلى إلقاء استثناء SINGLE_STEP والذي سيتم التعامل معه بواسطة معالج الاستثناءات الذي قمنا بإعداده في الخطوة 1.
root@kitploit:~
if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
  1. سيقوم معالج الاستثناءات هذا بتعطيل نقطة توقف الأجهزة لـ Dr0 فقط إذا تطابق Dr0 مع RIP عبر تعيين قيمة السجل الذي يشير إليه Dr0 إلى 0 (والذي يجب أن يكون قيمة RIP الحالية).
root@kitploit:~
if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
{
	if( ExceptionInfo->ContextRecord->Dr7 & 1 ) {
		if( ExceptionInfo->ContextRecord->Rip == ExceptionInfo->ContextRecord->Dr0 ) {
			ExceptionInfo->ContextRecord->Dr0 = 0;
  1. سنقوم بعد ذلك بإصلاح السجلات المتبقية التي قمنا بتعيينها مسبقًا إلى NULL. والسبب في كونها 4 هو أن اصطلاح استدعاء x64 يفرض علينا استخدام RCX و RDX و R8 و R9 للوسائط الأربع الأولى، ويتم إعداد الباقي على المكدس. من الممكن إعداد هذه الوسائط التي يزيد عددها عن 4 يدويًا على المكدس، لكن هذا خارج نطاق هذا المشروع لأنه يتطلب تجميعًا مضمّنًا (inline assembly). والسبب في استخدام R10 بدلاً من RCX هو أنه في بداية كل كعبرة استدعاء نظام يتم تنفيذ mov r10, rcx لأن سجل RCX يتم إتلافه في التعليمات التالية.
root@kitploit:~
case NTMAPVIEWOFSECTION_ENUM:
	ExceptionInfo->ContextRecord->R10 =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->SectionHandle;

	ExceptionInfo->ContextRecord->Rdx =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->ProcessHandle;

	ExceptionInfo->ContextRecord->R8 =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->BaseAddress;

	ExceptionInfo->ContextRecord->R9 =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->ZeroBits;

يمكننا أن نرى في هذا المثال أننا نقوم بإصلاح الوسائط للدالة NtMapViewOfSection.

كيفية الاستخدام

إذا كنت ترغب في البدء في تزييف بيانات القياس عن بُعد الخاصة بحل EDR، فمن الممكن تعديل تعريفات p[FunctionName] حيث تكون معينة حاليًا إلى NULL.

التوليد

لتوليد الدوال المطلوبة، استخدم gen.py. يدعم هذا الأمر أيًا مما يلي:

  • دوال مفصولة بفواصل
root@kitploit:~
python gen.py NtOpenSection,NtMapViewOfSection,NtUnmapViewOfSection

سينتج ذلك 3 ملفات: TamperingSyscalls.cpp و TamperingSyscalls.h و main.cpp. يمكنك تضمين #include "TamperingSyscalls.h" في مشروعك. يمكننا استدعاء الدوال بإلحاق اسم الدالة بـ p، على سبيل المثال pNtOpenSection(...);

القيود

لا يمكننا تعيين نقطة توقف على NtSetThreadContext أو المتغيرات الخاصة بها لأنها تُستخدم لتعيين سجلات التصحيح (debug registers). توجد فترة وجيزة يتم فيها تعيين سجلات التصحيح، لكنها صغيرة جدًا ولا أعتقد أنه سيتم اكتشافنا بسبب إبقاء Dr0 مفتوحًا.

لقد نشرت تدوينة صغيرة على مدونتي تتناول هذه التقنيات.

منشور مدونة نظرة عامة على TamperingSyscall

منشور مدونة TamperingSyscall حول الاستقصاء الزائف

تنزيل الأداة