CS2 Reverse Engineering Rehberi
Fonksiyon Bulma & Pattern Analizi
Bölüm 1: Başlangıç
Gerekli Araçlar
- IDA Pro — Ana analiz aracı (Crâck veya orijinal, mutlaka 8.3 sürümü)
- Class Informer — IDA plugin, VTable görüntüleme
- SigMaker — Pattern oluşturma
Faydalı Kaynaklar
Class Informer Kurulumu
- IDA Pro klasörüne girin
- plugins klasörünü açın
- İndirdiğiniz .dll dosyalarını buraya kopyalayın
Kullanım: Edit → Plugins → Class Informer | Pattern oluşturmak için: satırları seçin →
CTRL + ALT + S
Bölüm 2: Temel Mantık
Xref (Cross Reference)
Xref, bir verinin veya fonksiyonun
nerelerde kullanıldığını gösterir. Herhangi bir string üzerinde
X tuşuna basarak tüm referansları görebilirsiniz. Fonksiyon bulmada en kritik araçtır.
VTable Mantığı
Class Informer'daki yapı
VTable'dır — class'a ait fonksiyonların indeksli tablosudur.
CreateMove gibi fonksiyonlar belirli bir index'te bulunur; üzerine çift tıklayarak geçiş yapılır.
Bölüm 2.1: Assembly Temelleri
Kod:
mov ecx, [rsp+...]
lea edx, [rcx-1]
cmp ecx, -1
jnz loc_xxx
| Komut | Açıklama |
|---|
| mov | Veri taşıma |
| cmp | Karşılaştırma |
| jmp | Koşulsuz atlama |
| call | Fonksiyon çağırma |
| ret | Fonksiyondan çıkış |
| test | Sıfır kontrolü |
| lea | Adres / matematik işlemi |
Bölüm 2.2: Pseudocode (F5)
F5 ile pseudocode görünümüne geçilir. Bu, assembly'nin yaklaşık C çevirisidir — hatalı olabilir, veri tipleri yanlış olabilir.
C++:
v10 = *(_DWORD *)(v9 + 22800); // 22800 = 0x5910 offset'inden oku
Veri Tipleri
| Tip | Boyut |
|---|
| char | 1 byte |
| int | 4 byte |
| __int64 | 8 byte |
| float | 4 byte |
| double | 8 byte |
| pointer (*) | Adres tutar |
VTable Call: (*(*v58 + 2712))(v58, v152); → 2712 / 8 = index 339
Bölüm 2.3: EntityList, ViewMatrix, WorldToScreen
CS2'de EntityList yapısı ikiye ayrılmıştır:
| Yapı | Açıklama |
|---|
| Controller | Genel bilgiler (isim, skor). Oyuncu ölü olsa bile kalır. |
| Pawn | Fiziksel varlık (pozisyon, can, silah). Sadece hayattayken bulunur. |
Python:
import pymem
pm = pymem.Pymem("cs2.exe")
client = pymem.process.module_from_name(pm.process_handle, "client.dll").lpBaseOfDll
entity_list = pm.read_longlong(client + dwEntityList)
for i in range(1, 64):
list_entry = pm.read_longlong(entity_list + ((8 * (i & 0x7FFF) >> 9) + 16))
if not list_entry: continue
controller = pm.read_longlong(list_entry + 112 * (i & 0x1FF))
if not controller: continue
pawn_handle = pm.read_longlong(controller + m_hPlayerPawn)
if not pawn_handle: continue
entry2 = pm.read_longlong(entity_list + (0x8 * ((pawn_handle & 0x7FFF) >> 9) + 16))
if not entry2: continue
pawn = pm.read_longlong(entry2 + 112 * (pawn_handle & 0x1FF))
if pawn:
health = pm.read_int(pawn + m_iHealth) & 0xFF
if health > 0:
print(f"Pawn: {hex(pawn)}, Health: {health}")
ViewMatrix, 3D koordinatları 2D ekran koordinatlarına çeviren 4x4 matristir. ESP çizmek için zorunludur.
C++:
Vector world_pos = GetPawnPosition(pawn);
Vector2D screen_ndc;
if (ScreenTransform(&world_pos, &screen_ndc)) return;
float screen_x = (screen_ndc.x + 1.0f) * 0.5f * screen_width;
float screen_y = (1.0f - (screen_ndc.y + 1.0f) * 0.5f) * screen_height;
DrawEsp(screen_x, screen_y, health, team);
Bölüm 3: client.dll'i IDA Pro ile Yükleme
- ida64.exe çalıştırın (64-bit zorunlu)
- File → New → client.dll seçin
Kod:
C:\Program Files (x86)\Steam\steamapps\common\Counter-Strike Global Offensive\game\bin\win64\client.dll
Adres Yaklaşımları
| Yöntem | Örnek | Kullanım |
|---|
| Tam adres | 0x1806CE798 | Kod analizi, Xref |
| RVA (offset) | 0x6CE798 | Gerçek offset kullanımı |
Rebase için:
Edit → Segments → Rebase program → 0x0
Geri almak için aynı yol, Value:
0x180000000
Yükleme sonrası: Shift+F12 (Strings) | Ctrl+F (Arama) | Class Informer ile VTable analizi
Bölüm 3.1: Class Field (Offset) Bulma
CS2'de field isimleri binary içinde string olarak bulunur.
- Shift + F12 ile Strings penceresini aç
- Ctrl + F ile field adını ara (örn.
m_pClippingWeapon)
- Sonuca çift tıkla, X ile Xref'e git
- .data section'daki kullanımı bul
- Offset değerini (
3DC0h = 0x3DC0) al
C++:
uintptr_t clippingWeapon = pawn + 0x3DC0;
Yaygın Field'lar
| Field | Açıklama | Tip |
|---|
| m_iHealth | Oyuncu canı | int |
| m_iTeamNum | Takım numarası | int |
| m_vecOrigin | Pozisyon | Vector |
| m_hPlayerPawn | Pawn handle | uint64 |
| m_lifeState | Yaşam durumu | char |
| m_angEyeAngles | View açıları | QAngle |
Bölüm 3.2: Global Offset Bulma (dwEntityList, dwLocalPlayerPawn vb.)
Global offsetler, fonksiyonlar içinde kullanılan global değişkenlerdir. O fonksiyonu bulup verinin nereden okunduğuna bakarak offset elde edilir.
Örnek 1: dwLocalPlayerPawn (String Yöntemi)
- Shift + F12 ile
"Get the local player pawn." stringini ara
- Sonuca çift tıkla, X ile kullanıldığı yere geç
- F5 ile pseudocode aç,
sub_1803AFC10 fonksiyonunu bul
- O fonksiyona gir, içinden
sub_1808E7880'e geç
C++:
v3 = *(_DWORD *)(v2 + 1732); // m_hPlayerPawn (0x6C4)
if ( qword_1821B1988 ) // dwEntityList (0x21B1988)
| Değişken | Offset | Açıklama |
|---|
qword_1821B1988 | 0x21B1988 | dwEntityList |
v2 + 1732 | 0x6C4 | m_hPlayerPawn |
Örnek 2: Hızlı Yöntem
- Shift + F12 →
"Deathcam.Review_Start" ara
- X ile xref'e geç, assembly'de
call sub_1808E7880 satırını bul
- O fonksiyona gir — Örnek 1 ile aynı fonksiyondur
Örnek 3: ViewMatrix Bulma
- Shift + F4 (Names penceresi)
CRenderGameSystem::`vftable' ara
- VTable'ı kaydır, yaklaşık 64. index'teki fonksiyona çift tıkla
- Açılan fonksiyonda
call sub_180B7D5F0 satırına geç — ViewMatrix bu fonksiyondan döner
Herhangi bir sorunuz varsa yorumlarda belirtebilirsiniz.