Repositori ini berisi bagian-bagian kode sumber katup anti-pemutaran untuk sistem windows yang diciptakan dari kode mesin.
Valve Anti-Cheat (VAC) adalah sistem sistem anti-cheat noninvasif yang dikembangkan oleh Valve. Ini dikirim dalam bentuk modul (DLL) yang dialirkan dari server jarak jauh. steamservice.dll dimuat ke SteamService.exe (atau Steam.exe jika dijalankan sebagai admin) mempersiapkan dan menjalankan modul anti-pemecah. Infrastruktur VAC Klien dibangun menggunakan C++ (ditunjukkan oleh banyak fungsi konvensicall thiscall yang ada dalam pembongkaran) tetapi repo ini berisi kode C untuk kesederhanaan. Binari anti-cheat saat ini 32-bit .
| PENGENAL | Tujuan | .text Ukuran mentah | Folder sumber |
|---|---|---|---|
| 1 | Kumpulkan informasi tentang konfigurasi sistem. Modul ini dimuat terlebih dahulu dan kadang-kadang bahkan sebelum game yang diamankan VAC diluncurkan. | 0x5c00 | Modul/SystemInfo |
| 2 | Hitung proses dan pegangan yang berjalan. Modul ini dimuat segera setelah game diluncurkan tetapi juga berulang kali kemudian. | 0x4a00 | Modul/ProcessHandLelist |
| 3 | Kumpulkan data VacProcessMonitor dari filemapping yang dibuat oleh steamservice.dll . Ini adalah modul pertama yang diamati menggunakan virtual methods (polymorphism) . | 0x6600 | Modul/ProcessMonitor |
VAC menggunakan beberapa metode enkripsi / hashing:
NtQuerySystemInformation . String Xor-ed dengan ^ atau > atau & char.Modul ini dimuat terlebih dahulu dan kadang-kadang bahkan sebelum game yang diamankan VAC diluncurkan.
Pada modul pertama memanggil fungsi GetVersion untuk mengambil versi utama dan membangun Sistem misalnya 0x47BB0A00 - yang berarti:
18363 )10 ) Modul memanggil fungsi GetNativeSystemInfo dan membaca bidang dari SYSTEM_INFO struct yang dihasilkan:
Kemudian ia memanggil fungsi API NtQuerySystemInformation dengan nilai -nilai SystemInformationClass berikut (agar mereka muncul dalam kode):
SYSTEM_TIMEOFDAY_INFORMATION struct, VAC menggunakan dua bidang:SYSTEM_CODEINTEGRITY_INFORMATION , Modul Menyimpan CodeIntegrityOptions FieldSYSTEM_DEVICE_INFORMATION , Modul Menyimpan Bidang NumberOfDisksSYSTEM_KERNEL_DEBUGGER_INFORMATION , VAC menggunakan seluruh structSYSTEM_BOOT_ENVIRONMENT_INFORMATION , vac copy BootIdentifier GuidSYSTEM_RANGE_START_INFORMATION yang hanya void* . Penghematan anti-cheat alamat start ruang kernel yang dikembalikan dan menandatangani bit alamat itu (untuk memeriksa apakah dapat dieksekusi di mana VAC sedang berjalan ditautkan dengan opsi LARGEADDRESSAWARE ) Untuk informasi lebih lanjut tentang SYSTEM_INFORMATION_CLASS enum lihat halaman Geoff Chappell.
Selanjutnya, fungsi Anti-Cheat Panggilan GetProcessImageFileNameA untuk mengambil jalur yang dapat dieksekusi saat ini dan membaca 36 karakter terakhir (misalnya Program Files (x86)SteamSteam.exe ).
Kemudian Vac Retrieves System Directory Path (misalnya C:WINDOWSsystem32 ) menggunakan GetSystemDirectoryW , mengubahnya dari string multibyte -char menjadi multibyte, dan menyimpannya (panjang maksimum string multibyte - 200). FileID folder Anti-Cheat Queries (menggunakan GetFileInformationByHandleEx ) dan nomor seri volume ( GetVolumeInformationByHandleW ). Lebih lanjut ia melakukan hal yang sama dengan Windows Directory yang didapat dari GetWindowsDirectoryW API.
Modul membaca file NtDll.dll dari direktori sistem dan melakukan beberapa pemrosesan di atasnya (belum terbalik).
Pegangan Simpan VAC (Alamat Dasar) dari DLL Sistem yang diimpor (Max 16, Modul VAC ini memuat 12 DLL) dan pointer untuk fungsi WinAPI (MAX 160, Modul menggunakan 172 fungsi). Hal ini dilakukan untuk mendeteksi pengait tabel alamat impor pada modul anti-pemecahkan, jika alamat fungsi lebih rendah dari basis modul yang sesuai, fungsi telah dikaitkan.
Anti-cheat mendapatkan basis modul mandiri dengan melakukan bitwise dan pada alamat pengembalian ( _ReturnAddress() & 0xFFFF0000 ). Kemudian ia mengumpulkan:
Selanjutnya menyebutkan volume menggunakan FindFirstVolumeW / FindNextVolumeW API. Informasi volume kueri VAC dengan menelepon GetVolumeInformationW , GetDriveTypeW dan GetVolumePathNamesForVolumeNameW fungsi dan mengisi struct berikut dengan data yang dikumpulkan:
struct VolumeData {
UINT volumeGuidHash;
DWORD getVolumeInformationError;
DWORD fileSystemFlags;
DWORD volumeSerialNumber;
UINT volumeNameHash;
UINT fileSystemNameHash;
WORD driveType;
WORD volumePathNameLength;
DWORD volumePathNameHash;
}; // sizeof(VolumeData) == 32Vac mengumpulkan data Max. 10 volume.
Jika modul ini dialirkan setelah permainan yang diamankan VAC telah dimulai, ia dicapai untuk menangani proses permainan (menggunakan OpenProcess API).
Akhirnya, Modul Mengenkripsi Data (2048 byte), DWORD BY DWORD XORING dengan kunci yang diterima dari server (misalnya 0x1d4855d3)
Untuk diungkapkan ...
Modul ini tampaknya relatif new atau dinonaktifkan untuk waktu yang lama. Pertama kali saya melihat modul ini pada January 2020 . Ini memiliki kemampuan untuk melakukan berbagai jenis pemindaian (saat ini 3 ). Pemindaian lebih lanjut tergantung pada hasil yang sebelumnya.
Setiap jenis pemindaian mengimplementasikan four methods kelas dasar.
Awalnya server VAC menginstruksikan klien untuk melakukan scan #1 .
Fungsi pemindaian pertama dicapai untuk membuka Steam_{E9FD3C51-9B58-4DA0-962C-734882B19273}_Pid:%000008X FileMapping. Pemetaan memiliki tata letak berikut:
struct VacProcessMonitorMapping {
DWORD magic; // when initialized - 0x30004
PVOID vacProcessMonitor;
}; // sizeof(VacProcessMonitorMapping) == 8 VacProcessMonitorMapping::vacProcessMonitor adalah pointer untuk objek VacProcessMonitor (ukurannya adalah 292 bytes ).
VAC kemudian membaca seluruh objek VacProcessMonitor (292 byte) dan VMT (tabel metode virtual) yang berisi pointer hingga 6 metode (24 byte). Alamat dasar steamservice.dll juga dikumpulkan.
Data -data ini mungkin digunakan pada server VAC untuk mendeteksi hooking VacProcessMonitor . Prosedurnya mungkin mengikuti:
if (method_ptr & 0xFFFF0000 != steamservice_base)
hook_detected ();