Game hacking, oyunların veriyi memory’de nasıl tuttuğunu anlamak için iyi bir giriş. Memory manipulation ile oyun içi değerleri okuyup yazabilir, mekanikleri deneyebilirsin. Bu yazıda Mount and Blade Warband üzerinden adım adım gidiyoruz: virtual memory, Cheat Engine ile tarama ve C++ ile programatik okuma/yazma.

Mount and Blade Warband nedir?

TaleWorlds’ün orta çağ temalı aksiyon RPG’si. Calradia’da karakter, ordu ve krallık kuruyorsun; sandbox ve mod desteği var. Game hacking pratiği için uygun bir hedef.

Mount and Blade Warband

Memory’yi anlamak

Oyun process’inin çalışan memory’sinde değişkenler, değerler ve oyun durumu tutuluyor. Bu memory’yi okuyup yazarak değişkenleri değiştirip oynanışı etkileyebilirsin.

Virtual memory

Her process’e kendi sanal adres alanı veriliyor; sayfalar fiziksel memory veya diske eşleniyor. Program fizikselden fazla memory’ye erişiyormuş gibi çalışabiliyor.

Virtual Memory vs Physical Memory

Virtual Memory Nasıl Çalışır:

Bir program çalıştığında, virtual address space’e yüklenir. Bu genellikle segmentlere (code, data, stack) bölünür. İşletim sisteminin Memory Management Unit (MMU) bileşeni, virtual adresleri fiziksel adreslere veya ikincil depolamaya eşler.

Virtual Memory’nin Faydaları:

  1. Artırılmış Adreslenebilir Memory: Her process, fiziksel memory’den daha büyük bir virtual address space’e sahip olabilir
  2. Memory İzolasyonu: Process’ler birbirinin memory’sine erişemez, bu da güvenliği artırır
  3. Verimli Memory Kullanımı: Kullanılmayan kısımlar diske saklanabilir, fiziksel memory’yi serbest bırakır
  4. Memory Paylaşımı: Birden fazla process aynı dosya eşlemelerini paylaşabilir

Memory adresini bulma ve değiştirme

Manipülasyon için önce hedef değişkenin adresini bulman lazım. Değer veya veri tipine göre tarama yapıyorsun; adresi bulunca okuyup yazıyorsun (kaynak, sağlık, para vb.).

Pointer’lar

Dinamik yapılarda adresler her açılışta değişebiliyor. Pointer’lar başka adreslere işaret ediyor; pointer zincirini takip ederek doğru hücreye ulaşıyorsun.

Araçlar

Memory editor / trainer: Değer tarayıp değiştiren arayüzler. Debugger: Cheat Engine, OllyDbg gibi; breakpoint, memory inceleme, disassembly.

Cheat Engine kullanımı

Cheat Engine, game hacking’te sık kullanılan memory tarama ve düzenleme aracı. Kısa adımlar:

1. Cheat Engine’i İndir ve Kur

Cheat Engine resmi web sitesini ziyaret et ve işletim sistemin için en son sürümü indir. Kurulum dosyasını çalıştır ve ekrandaki talimatları takip et.

2. Cheat Engine’i Başlat ve Oyun Process’ini Seç

Cheat Engine’i başlat ve sol üst köşedeki bilgisayar simgesine tıklayarak process listesini aç. Oyun process’ini seç (örneğin, mb_warband.exe). Process’i seçmeden önce oyunun çalıştığından emin ol.

Cheat Engine - Process Seçimi

3. İlk Değer Taraması Yap

Değiştirmek istediğin değişkeni belirle (örneğin, oyuncunun parası). Cheat Engine’de:

  1. “Value” alanına mevcut değeri gir
  2. Dropdown menüden değer tipini seç (örneğin, integer değerler için 4 bytes)
  3. Aramayı başlatmak için “First Scan” butonuna tıkla

Tarama, değerinle eşleşen tüm memory adreslerini bulacaktır.

Mount and Blade Warband - Envanter

Cheat Engine - İlk Tarama

4. Aramayı Daralt

İlk tarama genellikle birçok adres döndürür. Bunu daraltmak için:

  1. Oyunda değeri değiştir (örneğin, para harca veya kazan)
  2. Cheat Engine’de yeni değeri gir
  3. Aramayı daraltmak için “Next Scan” butonuna tıkla
  4. Yönetilebilir sayıda adres kalana kadar tekrarla

Mount and Blade Warband - Envanter 710 Dinar Gösteriyor

Cheat Engine - Sonraki Tarama

5. Memory Değerlerini Değiştir

Daraltılmış bir liste ile:

  1. Bir memory adresine çift tıklayarak adres listesine ekle
  2. Değer sütununa çift tıklayarak değiştir
  3. İstediğin değeri gir
  4. Oyun değişikliği hemen yansıtacaktır

Cheat Engine - Değeri 1337'ye Değiştir

Mount and Blade Warband - Envanter 1337 Gösteriyor

6. Cheat Table’ını Kaydet

Disket simgesine tıklayarak cheat table’ını kaydet. Bu, oyunu tekrar başlattığında cheat’leri yeniden yüklemeni sağlar.

Not: Birçok oyun anti-cheat sistemleri kullanır. Cheat table’larını sorumlu bir şekilde kullan ve anti-cheat önlemleri hakkında güncel kal.

C++ ile memory okuma/yazma

Cheat Engine ile offset’leri bulduktan sonra aynı mantığı C++ ile otomatikleştirebilirsin. Windows API: ReadProcessMemory, WriteProcessMemory, OpenProcess vb.

Offset’leri bulma

Cheat Engine’de hedef değerin adresini bul, “Find out what accesses this address” ile erişen assembly’yi incele. Base + offset zincirini çıkar.

Assembly Analizi Örneği:

mov ecx, [ecx + 140f0]
imul eax, eax, fc8
mov esi, [ecx + eax + 5d0]

Bu assembly kodu şunları gösterir:

  • ecx, [ecx + 0x140f0] adresinden yüklenir
  • eax, 0xfc8 ile çarpılır
  • Para değeri, [ecx + eax + 0x5d0] adresinden yüklenir

Cheat Engine - Assembly Kodu

“cc0701” hexadecimal para değerini decimal’e çevirdiğimizde 13371137 değerini elde ederiz.

Decimal'den Hexadecimal'e Dönüştürücü

Daha fazla analiz, ecx‘in mb_warband.exe + 0x4eb300 adresinden ayarlandığını ortaya çıkarır, bu da bize base address ve offset’leri verir.

Cheat Engine - Tam Assembly Analizi

Memory Manipulation için Windows API

Windows API, process’ler ve memory’leriyle etkileşim kurmak için fonksiyonlar sağlar. Ana fonksiyonlar:

  • CreateToolhelp32Snapshot: Çalışan process’lerin anlık görüntüsünü oluşturur
  • Process32Next: Process girişleri arasında yinelenir
  • OpenProcess: Hedef process’e bir handle açar
  • ReadProcessMemory: Bir process’ten memory okur
  • WriteProcessMemory: Bir process’e memory yazar

Process Yönetimi

İşte bir process’i bulma ve açma:

Memory(const std::string_view processName) noexcept
{
    ::PROCESSENTRY32 entry = { };
    entry.dwSize = sizeof(::PROCESSENTRY32);

    const auto snapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    while (::Process32Next(snapShot, &entry))
    {
        if (!processName.compare(entry.szExeFile))
        {
            processId = entry.th32ProcessID;
            processHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
            break;
        }
    }

    if (snapShot)
        ::CloseHandle(snapShot);
}

Tam Memory sınıfı implementasyonu MemoryBlade repository‘sinde mevcuttur.

Bu kod:

  1. Tüm çalışan process’lerin anlık görüntüsünü oluşturur
  2. Her process arasında yinelenir
  3. Process isimlerini hedefle karşılaştırır
  4. Bulunduğunda tam erişimle bir handle açar
  5. Anlık görüntü handle’ını kapatır

Memory Okuma

İşte memory okumak için bir template fonksiyon:

template <typename T>
constexpr const T Read(const std::uintptr_t& address) const noexcept
{
    T value = { };
    ::ReadProcessMemory(processHandle, reinterpret_cast<const void*>(address), &value, sizeof(T), NULL);
    return value;
}

Bu fonksiyon:

  • Bir memory adresini girdi olarak alır
  • Değeri okumak için ReadProcessMemory kullanır
  • T tipinde değeri döndürür
  • Herhangi bir veri tipiyle çalışır (int, float, vb.)

Memory’ye Yazma

İşte memory’ye yazmak için bir template fonksiyon:

template <typename T>
constexpr void Write(const std::uintptr_t& address, const T& value) const noexcept
{
    ::WriteProcessMemory(processHandle, reinterpret_cast<void*>(address), &value, sizeof(T), NULL);
}

Bu fonksiyon:

  • Bir memory adresi ve değer alır
  • Değeri yazmak için WriteProcessMemory kullanır
  • Herhangi bir veri tipiyle çalışır

Para Manipülasyonu

İşte oyuncunun parasını manipüle eden eksiksiz bir örnek:

#include <iostream>
#include "Memory.h"

int main()
{
    // mb_warband.exe için Memory instance'ı oluştur
    const auto mem = Memory("mb_warband.exe");
    std::cout << "Mount and Blade Warband found!" << std::endl;

    // Oyun modülünün base address'ini al
    const auto base_address = mem.GetModuleAddress("mb_warband.exe");

    // Offset'leri kullanarak değerleri oku
    int ecx = mem.Read<int>(base_address + 0x4eb300);
    int eax = mem.Read<int>(ecx + 0x6e0);
    ecx = mem.Read<int>(ecx + 0x140f0);
    int money = mem.Read<int>(ecx + 0x5d0);

    std::cout << "Current money: " << money << std::endl;

    // Yeni para değerini yaz
    mem.Write<int>(ecx + 0x5d0, 13371137);

    std::cout << "Money updated!" << std::endl;

    return 0;
}

Bu kod:

  1. Oyun process’ini bulur
  2. Executable’ın base address’ini alır
  3. Offset’leri kullanarak pointer zincirini takip eder
  4. Mevcut para değerini okur
  5. Yeni bir para değeri yazar

Karakter Yeteneklerini Manipüle Etme

Mount and Blade Warband’da karakter yetenekleri spesifik offset’lerde saklanır. İşte bunları değiştirme:

#include <iostream>
#include "Memory.h"

int main()
{
    const auto mem = Memory("mb_warband.exe");
    std::cout << "Mount and Blade Warband found!" << std::endl;

    const auto base_address = mem.GetModuleAddress("mb_warband.exe");
    
    // Base pointer'ı al
    int edx = mem.Read<int>(base_address + 0x4eb300);
    edx = mem.Read<int>(edx + 0x140f0);
    
    // Yetenekleri değiştir (hepsi 500'e ayarlandı)
    mem.Write<int>(edx + 0x270, 500); // Strength
    mem.Write<int>(edx + 0x274, 500); // Agility
    mem.Write<int>(edx + 0x278, 500); // Intelligence
    mem.Write<int>(edx + 0x27c, 500); // Charisma

    std::cout << "Skills updated!" << std::endl;

    return 0;
}

Yetenek Offset’leri:

  • 0x270: Strength (Güç)
  • 0x274: Agility (Çeviklik)
  • 0x278: Intelligence (Zeka)
  • 0x27c: Charisma (Karizma)

Güç İçin Offset Bulma - Register Analizi

Güç İçin Offset Bulma - Tam Assembly

Çeviklik İçin Offset Bulma - Tam Assembly

Mount and Blade Warband - Yetenekler 500'e Ayarlandı

İnteraktif Memory Adresi Görselleştirme

Memory adreslerinin ve offset’lerin nasıl çalıştığını anlamak zor olabilir. Süreci görselleştirelim:

Memory Adresi Görselleştirme

Etik ve anti-cheat

Tek oyunculu oyunlarda öğrenme ve deney genelde kabul edilir; çok oyunculuda başkalarının deneyimini bozmamak ve ToS’a uymak gerekir. Modern oyunlar memory taraması, kod bütünlüğü ve sunucu tarafı doğrulama kullanıyor; bu yüzden birçok hack sadece tek oyunculuda işe yarıyor.

Özet

Memory manipulation, yazılımın nasıl çalıştığını anlamak için temel bir beceri. Virtual memory, Cheat Engine ve C++ ile oyun değerlerini okuyup yazabiliyorsun. Çok oyunculu ortamlarda sorumlu ve etik kullanım önemli.

Öne çıkanlar: Virtual memory ve process izolasyonu; Cheat Engine ile adres bulma ve değiştirme; Windows API ile C++; offset ve pointer zincirleri; para ve yetenek manipülasyonu örnekleri.

İlgili içerik