CS2 IDA REVERSE TUTORIAL

frezzyterror

Efsane Üye
Katılım
15 Haz 2020
Mesajlar
2,654
Beğeniler
927
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

  • — Source 2 engine hakkında kapsamlı bilgi
  • — Convarlar, inputlar ve çeşitli sistemler

Class Informer Kurulumu

  1. IDA Pro klasörüne girin
  2. plugins klasörünü açın
  3. İ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

KomutAçıklama
movVeri taşıma
cmpKarşılaştırma
jmpKoşulsuz atlama
callFonksiyon çağırma
retFonksiyondan çıkış
testSıfır kontrolü
leaAdres / 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

TipBoyut
char1 byte
int4 byte
__int648 byte
float4 byte
double8 byte
pointer (*)Adres tutar

VTable Call: (*(*v58 + 2712))(v58, v152); → 2712 / 8 = index 339

Altın Kural: Pseudocode bir referanstır, kesin doğruluk içermez. Y: değişken yeniden adlandır | H: hex'e çevir



Bölüm 2.3: EntityList, ViewMatrix, WorldToScreen

CS2'de EntityList yapısı ikiye ayrılmıştır:

YapıAçıklama
ControllerGenel bilgiler (isim, skor). Oyuncu ölü olsa bile kalır.
PawnFiziksel 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

  1. ida64.exe çalıştırın (64-bit zorunlu)
  2. File → New → client.dll seçin

Kod:
C:\Program Files (x86)\Steam\steamapps\common\Counter-Strike Global Offensive\game\bin\win64\client.dll

Not: Dosya boyutu 40–60 MB olmalıdır. Analiz 5–20 dakika sürer, normaldir.

Adres Yaklaşımları

YöntemÖrnekKullanım
Tam adres0x1806CE798Kod analizi, Xref
RVA (offset)0x6CE798Gerç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.

  1. Shift + F12 ile Strings penceresini aç
  2. Ctrl + F ile field adını ara (örn. m_pClippingWeapon)
  3. Sonuca çift tıkla, X ile Xref'e git
  4. .data section'daki kullanımı bul
  5. Offset değerini (3DC0h = 0x3DC0) al

C++:
uintptr_t clippingWeapon = pawn + 0x3DC0;

Yaygın Field'lar

FieldAçıklamaTip
m_iHealthOyuncu canıint
m_iTeamNumTakım numarasıint
m_vecOriginPozisyonVector
m_hPlayerPawnPawn handleuint64
m_lifeStateYaşam durumuchar
m_angEyeAnglesView açılarıQAngle

Not: Bu yöntem yalnızca class field'ları içindir. Global offset'ler farklı yöntemle bulunur.



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)

  1. Shift + F12 ile "Get the local player pawn." stringini ara
  2. Sonuca çift tıkla, X ile kullanıldığı yere geç
  3. F5 ile pseudocode aç, sub_1803AFC10 fonksiyonunu bul
  4. O fonksiyona gir, içinden sub_1808E7880'e geç

C++:
v3 = *(_DWORD *)(v2 + 1732); // m_hPlayerPawn (0x6C4)
if ( qword_1821B1988 )       // dwEntityList (0x21B1988)

DeğişkenOffsetAçıklama
qword_1821B19880x21B1988dwEntityList
v2 + 17320x6C4m_hPlayerPawn

Önemli: Rebase → 0x0 yaptıysanız offsetler doğrudandır. Yapmadıysanız 0x180000000 çıkarın.

Örnek 2: Hızlı Yöntem

  1. Shift + F12"Deathcam.Review_Start" ara
  2. X ile xref'e geç, assembly'de call sub_1808E7880 satırını bul
  3. O fonksiyona gir — Örnek 1 ile aynı fonksiyondur

Bonus: Bu yöntemle dwEntityList ve dwLocalPlayerController da bulunabilir.

Örnek 3: ViewMatrix Bulma

  1. Shift + F4 (Names penceresi)
  2. CRenderGameSystem::`vftable' ara
  3. VTable'ı kaydır, yaklaşık 64. index'teki fonksiyona çift tıkla
  4. Açılan fonksiyonda call sub_180B7D5F0 satırına geç — ViewMatrix bu fonksiyondan döner



Herhangi bir sorunuz varsa yorumlarda belirtebilirsiniz.

 
Son düzenleme:
Bu kullanıcıyla herhangi bir iş veya ticaret yapmak istiyorsanız, forumdan uzaklaştırıldığını sakın unutmayın.
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

  • — Source 2 engine hakkında kapsamlı bilgi
  • — Convarlar, inputlar ve çeşitli sistemler

Class Informer Kurulumu

  1. IDA Pro klasörüne girin
  2. plugins klasörünü açın
  3. İ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

KomutAçıklama
movVeri taşıma
cmpKarşılaştırma
jmpKoşulsuz atlama
callFonksiyon çağırma
retFonksiyondan çıkış
testSıfır kontrolü
leaAdres / 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

TipBoyut
char1 byte
int4 byte
__int648 byte
float4 byte
double8 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
ControllerGenel bilgiler (isim, skor). Oyuncu ölü olsa bile kalır.
PawnFiziksel 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

  1. ida64.exe çalıştırın (64-bit zorunlu)
  2. 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ÖrnekKullanım
Tam adres0x1806CE798Kod analizi, Xref
RVA (offset)0x6CE798Gerç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.

  1. Shift + F12 ile Strings penceresini aç
  2. Ctrl + F ile field adını ara (örn. m_pClippingWeapon)
  3. Sonuca çift tıkla, X ile Xref'e git
  4. .data section'daki kullanımı bul
  5. Offset değerini (3DC0h = 0x3DC0) al

C++:
uintptr_t clippingWeapon = pawn + 0x3DC0;

Yaygın Field'lar

FieldAçıklamaTip
m_iHealthOyuncu canıint
m_iTeamNumTakım numarasıint
m_vecOriginPozisyonVector
m_hPlayerPawnPawn handleuint64
m_lifeStateYaşam durumuchar
m_angEyeAnglesView 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)

  1. Shift + F12 ile "Get the local player pawn." stringini ara
  2. Sonuca çift tıkla, X ile kullanıldığı yere geç
  3. F5 ile pseudocode aç, sub_1803AFC10 fonksiyonunu bul
  4. O fonksiyona gir, içinden sub_1808E7880'e geç

C++:
v3 = *(_DWORD *)(v2 + 1732); // m_hPlayerPawn (0x6C4)
if ( qword_1821B1988 )       // dwEntityList (0x21B1988)

DeğişkenOffsetAçıklama
qword_1821B19880x21B1988dwEntityList
v2 + 17320x6C4m_hPlayerPawn



Örnek 2: Hızlı Yöntem

  1. Shift + F12"Deathcam.Review_Start" ara
  2. X ile xref'e geç, assembly'de call sub_1808E7880 satırını bul
  3. O fonksiyona gir — Örnek 1 ile aynı fonksiyondur



Örnek 3: ViewMatrix Bulma

  1. Shift + F4 (Names penceresi)
  2. CRenderGameSystem::`vftable' ara
  3. VTable'ı kaydır, yaklaşık 64. index'teki fonksiyona çift tıkla
  4. Açılan fonksiyonda call sub_180B7D5F0 satırına geç — ViewMatrix bu fonksiyondan döner



Herhangi bir sorunuz varsa yorumlarda belirtebilirsiniz.

A2x dumper varla buna ne gerek var
 
A2x dumper varla buna ne gerek var
hhavh0i.jpeg
 

Şuanda konuyu görüntüleyen kullanıcılar

Geri
Üst Alt