พื้นที่เก็บข้อมูลนี้มีส่วนหนึ่งของซอร์สโค้ดของวาล์วป้องกันการโกงสำหรับระบบ Windows ที่สร้างขึ้นจากรหัสเครื่อง
Valve Anti-Cheat (VAC) เป็นระบบป้องกันการโกงแบบไม่รุกล้ำโหมดที่พัฒนาโดยวาล์ว มันถูกส่งในรูปแบบของโมดูล (DLLs) สตรีมจากเซิร์ฟเวอร์ระยะไกล steamservice.dll โหลดลงใน SteamService.exe (หรือ Steam.exe ถ้าทำงานเป็นผู้ดูแลระบบ) เตรียมและเรียกใช้โมดูลต่อต้านการโกง โครงสร้างพื้นฐานของไคลเอนต์ VAC ถูกสร้างขึ้นโดยใช้ C++ (ระบุโดยฟังก์ชั่นการประชุม thiscall จำนวนมากที่มีอยู่ในการถอดชิ้นส่วน) แต่ repo นี้มีรหัส C สำหรับความเรียบง่าย ไบนารีต่อต้านการโกงอยู่ในปัจจุบัน 32-bit
| รหัสประจำตัว | วัตถุประสงค์ | . ข้อความขนาดดิบ | โฟลเดอร์ต้นทาง |
|---|---|---|---|
| 1 | รวบรวมข้อมูลเกี่ยวกับการกำหนดค่าระบบ โมดูลนี้จะถูกโหลดก่อนและบางครั้งแม้กระทั่งก่อนที่เกมใด ๆ ที่มีความปลอดภัยจะเปิดตัว | 0x5c00 | โมดูล/SystemInfo |
| 2 | แจกแจงกระบวนการและที่จับ โมดูลนี้จะถูกโหลดไม่นานหลังจากเกมเปิดตัว แต่ก็ซ้ำ ๆ ในภายหลัง | 0x4a00 | โมดูล/processhandlelist |
| 3 | รวบรวมข้อมูล VacProcessMonitor จาก filemapping ที่สร้างโดย steamservice.dll มันเป็นโมดูลแรกที่สังเกตได้ว่าใช้ virtual methods (polymorphism) | 0x6600 | โมดูล/processmonitor |
VAC ใช้วิธีการเข้ารหัส / แฮชหลายวิธี:
NtQuerySystemInformation สตริงคือ xor-ed กับ ^ หรือ > หรือ & charโมดูลนี้จะถูกโหลดก่อนและบางครั้งแม้กระทั่งก่อนที่เกมใด ๆ ที่มีความปลอดภัยจะเปิดตัว
ในโมดูลแรกเรียกใช้ฟังก์ชัน GetVersion เพื่อดึงเวอร์ชัน Major และ Build System รุ่นเช่น 0x47BB0A00 - ซึ่งหมายความว่า:
18363 )10 ) ฟังก์ชั่นการเรียกโมดูล GetNativeSystemInfo และอ่านฟิลด์จากผลลัพธ์ SYSTEM_INFO struct:
จากนั้นจะเรียกฟังก์ชั่น NtQuerySystemInformation API ด้วยค่า SystemInformationClass ต่อไปนี้ (เพื่อให้ปรากฏในรหัส):
SYSTEM_TIMEOFDAY_INFORMATION struct, Vac ใช้สองฟิลด์:SYSTEM_CODEINTEGRITY_INFORMATION , โมดูลบันทึกฟิลด์ CodeIntegrityOptionsSYSTEM_DEVICE_INFORMATION , โมดูลบันทึกฟิลด์ NumberOfDisksSYSTEM_KERNEL_DEBUGGER_INFORMATION , Vac ใช้ struct ทั้งหมดSYSTEM_BOOT_ENVIRONMENT_INFORMATION , Vac สำเนา BootIdentifier GuidSYSTEM_RANGE_START_INFORMATION ซึ่งเป็นเพียง void* Anti-Cheat Saves ที่อยู่ เริ่มต้นเคอร์เนลที่อยู่ และ ลงนามบิต ของที่อยู่นั้น (เพื่อตรวจสอบว่าสามารถใช้งานได้ภายในซึ่ง VAC กำลังทำงานอยู่เชื่อมโยงกับตัวเลือก LARGEADDRESSAWARE ) สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ SYSTEM_INFORMATION_CLASS enum ดูหน้าของ Geoff Chappell
ถัดไปฟังก์ชัน Anti-Cheat Calls GetProcessImageFileNameA เพื่อดึงพา ธ ของการเรียกใช้งานปัจจุบันและ อ่าน 36 อักขระล่าสุด (เช่น Program Files (x86)SteamSteam.exe )
ในภายหลัง VAC ดึง เส้นทางไดเรกทอรีระบบ (เช่น C:WINDOWSsystem32 ) โดยใช้ GetSystemDirectoryW แปลงจาก Wide -Char -Char เป็น Multibyte String และเก็บไว้ (ความยาวสูงสุดของสตริง multibyte - 200) FileID แบบสอบถาม Anti-Cheat Queries (ใช้ GetFileInformationByHandleEx ) และ หมายเลขซีเรียลระดับเสียง ( GetVolumeInformationByHandleW ) นอกจากนี้ยังทำเช่นเดียวกันกับ ไดเรกทอรี Windows ได้รับจาก GetWindowsDirectoryW API
โมดูลอ่านไฟล์ NtDll.dll จาก ไดเรกทอรีระบบ และทำการประมวลผลบางอย่าง (ยังไม่กลับรายการ)
VAC บันทึก ที่จับ (ที่อยู่พื้นฐาน) ของระบบนำเข้า DLLS (สูงสุด 16 โมดูล VAC นี้โหลด 12 DLLs) และ พอยน์เตอร์ไปยังฟังก์ชั่น WinAPI (สูงสุด 160, โมดูลใช้ฟังก์ชั่น 172) สิ่งนี้ทำเพื่อตรวจจับ การเชื่อมต่อตารางที่อยู่นำเข้า บนโมดูลป้องกันการโกงหาก ที่อยู่ฟังก์ชัน ต่ำกว่า ฐานโมดูล ที่สอดคล้องกันฟังก์ชั่นได้รับการเชื่อมต่อ
Anti-Cheat ได้รับ ฐานโมดูล ด้วยตนเองโดยดำเนินการ bitwise และ ที่อยู่ผู้ส่งกลับ ( _ReturnAddress() & 0xFFFF0000 ) จากนั้นมันก็รวบรวม:
ถัดไปมันระบุ ปริมาณ โดยใช้ FindFirstVolumeW / FindNextVolumeW API ข้อมูลปริมาณการค้นหา 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 เริ่มต้นขึ้นมันจะได้รับการจัดการกับกระบวนการเกม (โดยใช้ OpenProcess API)
ในที่สุดโมดูลเข้ารหัสข้อมูล (2048 ไบต์), dword โดย dword xoring พร้อมคีย์ที่ได้รับจากเซิร์ฟเวอร์ (เช่น 0x1d4855d3)
ที่จะเปิดเผย ...
โมดูลนี้ดูเหมือนจะค่อนข้าง new หรือถูกปิดใช้งานเป็นเวลานาน ครั้งแรกที่ฉันเห็นโมดูลนี้ใน January 2020 มันมีความสามารถในการสแกนหลายประเภท (ปัจจุบัน 3 ) การสแกนเพิ่มเติมขึ้นอยู่กับผลลัพธ์ของการก่อนหน้านี้
การสแกนแต่ละประเภทใช้ four methods ของคลาสฐาน
เซิร์ฟเวอร์ VAC เริ่มแรกสั่งให้ไคลเอนต์ทำการ scan #1
ฟังก์ชั่นการสแกนครั้งแรก attemps เพื่อเปิด 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 ();