[SERİ] Cheat Engine kullanımı, Pointer ve Offset Mantığı #4

Lady Darknes

swansizz
Reseller
Katılım
23 Mar 2021
Konular
88
Mesajlar
1,843
Çözümler
19
Tepkime puanı
1,173
Konum
Istanbul
Web sitesi
github.com
Selamlar RC ailesi! artık gerçek sahaya iniyoruz. Kendi yazdığımız basit programları h4cklemek işin sadece alfabesiydi. Gerçek bir oyunda (özellikle Katana Zero gibi GameMaker Studio tabanlı oyunlarda) bellek adresleri her saniye dans eder, veriler devasa "yapılar" (structs) içine gömülür.

Bu rehberde, bir oyunun hafızasını nasıl ameliyat masasına yatıracağımızı, o karmaşık Assembly kodları arasından kendi karakterimizi (Local Player) nasıl cımbızla çekeceğimizi en ince detayına kadar inceleyeceğiz.

(Not: Konunun teknik derinliği çok yüksek olduğu için anlatım dilini toparlamak adına yapay zekadan akademik bir destek aldım. Ancak mantık, tamamen bizim underground hile dünyamızın saf tecrübesidir!)

Adım 1: Koordinatları (X, Y) Bulmak​

Oyunu açtınız, elinizde Cheat Engine var ama ekranda "Canınız: 100, X Koordinatınız: 450" yazmıyor. Peki bu veriyi nasıl bulacağız? Buna "Azalan/Artan (Unknown Initial Value)" yöntemi diyoruz.
  1. Karakterinizi haritanın en solundaki duvara sıfır yanaştırın.​
  2. İlk Tarama: Cheat Engine'de Value Type kısmını kesinlikle Float seçiyoruz. (Neden mi? Çünkü modern oyun motorları koordinatları ondalıklı sayılarla, pürüzsüz hesaplar). Scan Type kısmını Unknown Initial Value (Bilinmeyen İlk Değer) yapıp ilk taramamızı başlatıyoruz. Milyonlarca sonuç çıkacak, panik yok.​
  3. Sağa Yürü (Artış): Oyuna dönün, karakteri çok az sağa yürütün ve durun. Koordinat düzleminde sağa gitmek X ekseninde "Artış" demektir. Cheat Engine'e gelip Increased Value diyerek taratın.​
  4. Sola Yürü (Azalış): Karakteri sola yürütün. CE üzerinden Decreased Value diyerek taratın.​
  5. Altın Vuruş (Değişmeyen Değer): Karakteri hiç hareket ettirmeden durun. Oyunda arkada yağmur yağıyor olabilir, düşmanlar devriye geziyor olabilir... Bunları filtrelemek için Unchanged Value (Değişmeyen Değer) diyerek aratın. Bu, oyunun sürekli çalışan zamanlayıcılarını ve animasyonlarını listeden atacaktır.​
Bu döngüyü (Sağ/Artan -> Sol/Azalan -> Dur/Değişmeyen) 10-15 kez tekrarladığınızda elinizde 3-5 tane adres kalacak. Bunlardan birinin değerini izlediğinde sizinle aynı anda değişiyorsa bukldunuz demektirç (Örn: 115E3D90).
Görsel anlatım:

Adım 2: "Local Player"ı Ayıklamak​

Adresi bulduk ama oyunu kapatıp açınca bu adres uçup gidecek. Bizim "Yeşil (Statik)" kök adreslere inmemiz lazım. Bulduğunuz X adresine sağ tıklayıp "Find out what accesses this address" diyoruz ve asıl film burada başlıyor.

Oyunun ASM (Assembly) kodları akmaya başlayacak. Ekranda iki farklı grup göreceksiniz:

Grup 1: Sürekli Aktif Olanlar (Saniyede binlerce kez çalışanlar)

  • 01E14BB0 - 0F10 44 29 F0 - movups xmm0,[ecx+ebp-10]
  • 01E14BB9 - 0F11 44 C5 08 - movups [ebp+eax*8+08],xmm0
  • 01E12D1E - 0F11 41 08 - movups [ecx+08],xmm0
Grup 2: Sadece Klavyeye Dokununca (Hareket Edince) Gelenler

  • 01DD46C2 - 3B 46 FC - cmp eax,[esi-04]
  • 01EA62A9 - 8B 4E 04 - mov ecx,[esi+04]
Buradaki Tuzağa Dikkat: Eğer sürekli akan movups komutlarına kanca (hook) atarsanız, oyunun genel fizik/çizim motorunu kancalamış olursunuz. Yani yazdığınız hile sadece sizi değil, haritadaki düşmanı, uçan mermiyi, hatta arkadaki bulutu bile etkileyebilir!

Bize sadece bizim kontrol ettiğimiz yapı lazım. İşte bu yüzden klavyeye bastığımızda tetiklenen mov ecx,[esi+04] komutunu seçiyoruz. Bu komut, sadece Local Player'ın yani bizim karakterimizin verisini işler.

Adım 3: Structure (Yapı) Analizi ile Haritayı Çıkarmak​

O altın değerindeki mov ecx,[esi+04] komutuna tıkladığınızda, aşağıda register (kayıtçı) bilgilerini göreceksiniz. ESI = 115E3D8C gibi bir değer yazar.

İşte bu ESI adresi, oyunun hafızasındaki Karakter Sınıfımızın (Class/Struct) başlangıç noktasıdır. Cheat Engine'de ana ekrana dönün: Memory Viewer -> Tools -> Dissect Data / Structure yolunu izleyin ve o ESI adresini yapıştırın. Karşınıza oyunun mimarisi çıkacak:

  • +000 : Oyun motorunun Entity ID'si veya Pointer'ı.
  • +004 : X Koordinatımız (Float) (İşte o esi+04 burası!)
  • +008 : Y Koordinatımız (Float) (X'in hemen bir alt katı)
  • +00C : Z Koordinatı veya Hız çarpanı...
Bu tabloyu bir kez çıkardığınızda, canınızı veya merminizi tek tek aramanıza gerek kalmaz. Her şey bu yapının içindedir.

Adım 4: Kalıcılık (Pointer Scanning)​

Elimizdeki bu yapının başlangıç noktasını (ESI adresi) alıyoruz ve CE ana ekranından "Pointer Scan" yapıyoruz. Amacımız, oyunun .exe dosyasından başlayıp 7-8 seviye derine inerek bu yapıya ulaşan yolu bulmak.

Tarama sonucunda Katana ZERO.exe+04C92900 gibi yeşil renkli, oyun kapansa da değişmeyen statik bir kök adres ve onu bizim ESI yapımıza bağlayan 0x10, 0x18, 0x18, 0x18 gibi bir offset zinciri elde ediyoruz. Hedefimize X için +04 ekleyerek ulaşacağız.
  • Koordinatı buldun (Diyelim ki adres: 115E3D90).
  • Adrese sağ tıkla -> "Pointer scan for this address".
  • Max level (offset derinliği) kısmını 5 veya 7 yap (çok derin olmasına gerek yok). "OK" de ve dosyayı kaydet.
  • Şimdi oyunda bölüm değiştir veya oyunu kapat-aç.
  • Yeni koordinat adresini tekrar bul (Diyelim ki yeni adres: 126F4E80).
  • Pointer Scan penceresine dön -> Pointer scanner (üst menü) -> Rescan memory - remove addresses not pointing to target.
  • Buraya yeni bulduğun adresi yaz ve "OK" de.
  • Bu işlemi 2-3 kez tekrarla. Elinde sonunda en sol sütunda Katana ZERO.exe + 0xXXXXXX şeklinde YEŞİL satırlar kalacak.

Her şey bundan ibaret :)

sizi biraz teknik bilgiyle boğduğumun farkındayım eğer anlamadığınız bir yer olursa bkz:
  • Local Player: Oyuncunun bizzat kontrol ettiği ana karakterin bellekteki karşılığıdır. Hile yazarken asıl hedefimiz "Local Player" yapısını bulmaktır, aksi takdirde yazdığımız hile tüm haritayı veya düşmanları da etkileyebilir.
  • Entity: Oyundaki hareketli veya etkileşimli her bir obje (oyuncu, düşman, npc, mermi). Local Player da aslında bir Entity'dir.
  • Struct (Veri Yapısı): Bir Entity'ye (örneğin Local Player) ait tüm özelliklerin (X koordinatı, Y koordinatı, can, hız) bellekte alt alta, düzenli bir blok halinde saklanma biçimidir.
  • Pointer: Bellekte başka bir verinin veya yapının başlangıç adresini tutan (işaret eden) değişkendir. Dinamik belleklerde yolumuzu bulmamızı sağlar.
  • Offset: Bir yapının (Struct) başlangıç adresinden, hedeflenen spesifik veriye (örn: sadece Can değeri) ulaşmak için o adrese eklenen bayt cinsinden sabit mesafedir (Örn: BaseAddress + 0x04).
 

BozoHanoglu

Active Member
Katılım
24 Şub 2026
Mesajlar
9
Tepkime puanı
0
kanka chatengine mi kaldı ben prototype zamanında kullanıyordum
 

snoxy2

Ultra Member
Katılım
5 May 2023
Konular
2
Mesajlar
300
Tepkime puanı
9
eyw deneyecem elbet bir gün.
 

Üst