يحتوي هذا المستودع على أجزاء من رمز مصدر الصمام المضاد للأنظمة التي يتم إعادة تشكيلها من رمز الجهاز.
Valve Anti-cheat (VAC) هو نظام مضاد للانهيار غير موسع من وضع المستخدم الذي تم تطويره بواسطة Valve. يتم تسليمه في شكل وحدات (DLLs) التي تم بثها من الخادم البعيد. steamservice.dll المحملة في SteamService.exe (أو Steam.exe إذا تم تشغيله كمسؤول) يستعد وتشغيل وحدات مضادة. تم تصميم البنية التحتية لـ VAC باستخدام C++ (يشار إليها بالعديد من وظائف اتفاقية thiscall الموجودة في التفكيك) ولكن هذا الريبو يحتوي على رمز C للبساطة. الثنائيات المضادة للحرائق هي حاليا 32-bit .
| بطاقة تعريف | غاية | . | مجلد المصدر |
|---|---|---|---|
| 1 | جمع معلومات حول تكوين النظام. يتم تحميل هذه الوحدة أولاً وأحيانًا حتى قبل إطلاق أي لعبة مضمونة VAC. | 0x5C00 | الوحدات النمطية/systemInfo |
| 2 | تعداد عمليات التشغيل والمقابض. يتم تحميل هذه الوحدة بعد فترة وجيزة من إطلاق اللعبة ولكن أيضًا في وقت لاحق. | 0x4A00 | الوحدات النمطية/processHandlelist |
| 3 | جمع بيانات VacProcessMonitor من fileMapping التي تم إنشاؤها بواسطة steamservice.dll . إنها الوحدة الأولى التي لوحظت استخدام virtual methods (polymorphism) . | 0x6600 | الوحدات النمطية/ProcessMonitor |
يستخدم VAC العديد من طرق التشفير / التجزئة:
NtQuerySystemInformation . السلاسل هي xor-ed مع ^ أو > أو & char.يتم تحميل هذه الوحدة أولاً وأحيانًا حتى قبل إطلاق أي لعبة مضمونة VAC.
في البداية ، تستدعي الوحدة النمطية وظيفة GetVersion لاسترداد إصدار النظام الرئيسي وبناءً على سبيل المثال 0x47BB0A00 - مما يعني:
18363 )10 ) تستدعي الوحدة وظيفة GetNativeSystemInfo وتقرأ الحقول من بنية SYSTEM_INFO الناتجة:
ثم يستدعي وظيفة واجهة برمجة تطبيقات NtQuerySystemInformation مع اتباع قيم SystemInformationClass (من أجل ظهورها في الكود):
SYSTEM_TIMEOFDAY_INFORMATION struct غير الموثقة ، يستخدم FAC حقلين:SYSTEM_CODEINTEGRITY_INFORMATION ، الوحدة النمطية توفر حقل CodeIntegrityOptionsSYSTEM_DEVICE_INFORMATION ، الوحدة النمطية تحفظ حقل NumberOfDisksSYSTEM_KERNEL_DEBUGGER_INFORMATION ، يستخدم VAC بنية كاملةSYSTEM_BOOT_ENVIRONMENT_INFORMATION ، BootIdentifier VACSYSTEM_RANGE_START_INFORMATION وهو مجرد void* . يحفظ مضادات الحشرات عنوان بدء مساحة kernel العائد وتوقيع جزء من هذا العنوان (للتحقق مما إذا كان القابل للتنفيذ من الداخل والذي يتم تشغيل VAC مرتبط بخيار LARGEADDRESSAWARE ) لمزيد من المعلومات حول SYSTEM_INFORMATION_CLASS ، انظر صفحة Geoff Chappell.
بعد ذلك ، فإن مكالمات مكالمات GetProcessImageFileNameA لاسترداد مسار القابلة للتنفيذ الحالية وقراءة آخر 36 حرفًا (على سبيل المثال Program Files (x86)SteamSteam.exe ).
في وقت لاحق ، يقوم VAC باسترداد مسار دليل النظام (على سبيل المثال C:WINDOWSsystem32 ) باستخدام GetSystemDirectoryW ، ويحوله من سلسلة عريضة إلى سلسلة متعددة ، ويخزنها (الحد الأقصى لسلسلة Multibyte - 200). مجلد الاستعلامات المضادة للغششة FileId (باستخدام GetFileInformationByHandleEx ) والرقم التسلسلي للحجم ( GetVolumeInformationByHandleW ). علاوة على ذلك ، فإنه يفعل الشيء نفسه مع دليل Windows الذي حصل عليه من GetWindowsDirectoryW API.
يقرأ الوحدة ملف NtDll.dll من دليل النظام ويقوم ببعض المعالجة عليه (لم يتم عكسه بعد).
تقوم VAC بحفظ المقابض (عناوين أساسية) لنظام DLLs المستوردة (MAX 16 ، يتم تحميل وحدة VAC هذه 12 DLLs) والمؤشرات لوظائف winapi (MAX 160 ، تستخدم الوحدة 172 وظيفة). يتم ذلك لاكتشاف جدول عنوان الاستيراد الذي يربطه على وحدة مضادة للحرائق ، إذا كان عنوان الوظيفة أقل من قاعدة الوحدة النمطية المقابلة ، فقد تم توصيل الوظيفة.
Anti-Cheat يحصل على قاعدة الوحدة الذاتية عن طريق أداء Bitwise وعنوان الإرجاع ( _ReturnAddress() & 0xFFFF0000 ). ثم يجمع:
بعد ذلك ، تعدد مجلدات باستخدام API FindFirstVolumeW / FindNextVolumeW . معلومات حجم الاستعلامات VAC عن طريق استدعاء وظائف GetVolumeInformationW و GetDriveTypeW و GetVolumePathNamesForVolumeNameW وتملأ بنية التالية مع البيانات التي تم جمعها:
struct VolumeData {
UINT volumeGuidHash;
DWORD getVolumeInformationError;
DWORD fileSystemFlags;
DWORD volumeSerialNumber;
UINT volumeNameHash;
UINT fileSystemNameHash;
WORD driveType;
WORD volumePathNameLength;
DWORD volumePathNameHash;
}; // sizeof(VolumeData) == 32VAC يجمع بيانات الحد الأقصى. 10 مجلدات.
إذا تم بث هذه الوحدة بعد أن بدأت اللعبة المضمونة VAC ، فإنها تحاول التعامل مع عملية اللعبة (باستخدام API OpenProcess ).
في النهاية ، تقوم الوحدة النمطية بتشفير البيانات (2048 بايت) ، DWORD بواسطة DWORD XORGER مع مفتاح تم استلامه من الخادم (على سبيل المثال 0x1D4855D3)
ليتم الكشف عنها ...
يبدو أن هذه الوحدة new نسبيًا أو تم تعطيلها لفترة طويلة. لأول مرة رأيت هذه الوحدة في January 2020 . لديها القدرة على أداء العديد من أنواع عمليات الفحص المختلفة (حاليًا 3 ). مزيد من عمليات المسح تعتمد على نتائج تلك السابقة.
كل نوع مسح ينفذ four methods لفئة قاعدة.
في البداية ، يقوم خادم VAC بتوجيه العميل إلى إجراء scan #1 .
أول عملية فحص ، تحاول فتح Steam_{E9FD3C51-9B58-4DA0-962C-734882B19273}_Pid:%000008X fileMapping. رسم الخرائط يتبع:
struct VacProcessMonitorMapping {
DWORD magic; // when initialized - 0x30004
PVOID vacProcessMonitor;
}; // sizeof(VacProcessMonitorMapping) == 8 VacProcessMonitorMapping::vacProcessMonitor هو مؤشر لكائن VacProcessMonitor (حجمه 292 bytes ).
ثم يقرأ VAC كائن VacProcessMonitor بالكامل (292 بايت) و VMT (جدول الطريقة الافتراضية) يحتوي على مؤشرات إلى 6 طرق (24 بايت). يتم جمع العنوان الأساسي لـ steamservice.dll .
من المحتمل أن تستخدم هذه البيانات على خوادم VAC للكشف عن تثبيت VacProcessMonitor الفاسقة. قد يكون الإجراء يتبع:
if (method_ptr & 0xFFFF0000 != steamservice_base)
hook_detected ();