Game hacking, oyunların verileri memory’de nasıl sakladığını ve yönettiğini anlamak için bir pencere açar. Memory manipulation’ı öğrenerek, oyun içi değerleri değiştirebilir, oyun mekaniklerini deneyebilir ve yazılımın düşük seviyede nasıl çalıştığına dair derinlemesine bilgi edinebilirsin. Bu rehberde, Mount and Blade Warband’ı hedef alarak memory manipulation tekniklerini keşfedeceğiz. Temel kavramlardan başlayıp, oyun memory’sini okuyan ve yazan C++ kodu yazmaya kadar her şeyi ele alacağız.

Mount and Blade Warband Nedir?

Mount and Blade Warband, TaleWorlds Entertainment tarafından geliştirilen orta çağ temalı bir aksiyon rol yapma oyunu. Calradia adlı kurgusal bir kıtada geçen oyun, stratejik oynanış, savaş ve açık dünya keşfini birleştiriyor. Oyuncular karakter oluşturabilir, ordu kurabilir, savaşlara katılabilir ve krallık kurabilir. Sandbox tarzı oynanışı ve mod desteği, game hacking tekniklerini öğrenmek için mükemmel bir seçim.

Mount and Blade Warband

Memory’yi Anlamak

Memory, bir bilgisayarın veri ve talimatları sakladığı yerdir. Game hacking’de, oyun process’inin volatile memory’sine odaklanırız. Burada değişkenler, değerler ve oyun durumları bulunur. Bu memory’yi manipüle ederek, oyun değişkenlerini değiştirebilir ve oynanışın çeşitli yönlerini kontrol edebiliriz.

Virtual Memory Nedir?

Virtual memory, her process’e fiziksel memory’den bağımsız kendi virtual address space’ini sağlayan bir memory yönetim tekniğidir. Programlar, fiziksel olarak yüklenenden daha fazla memory’ye erişimi varmış gibi çalışabilir. Bu virtual address space, sayfalara (pages) bölünür ve bunlar fiziksel memory’ye veya ikincil depolama cihazlarına eşlenebilir.

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 Adreslerini Bulma

Memory’yi manipüle etmek için, oyun değişkenlerinin saklandığı spesifik adresleri bulmamız gerekir. Memory adresleri, her veri parçası için benzersiz tanımlayıcılar görevi görür. Değişkenin mevcut değeri veya veri tipi gibi kriterlere dayanarak adresleri aramak için memory tarama tekniklerini kullanırız.

Memory’yi Değiştirme

Memory adreslerini belirledikten sonra, bu adreslerde saklanan değerleri değiştirebiliriz. Bu, kaynakları artırmayı, sağlık veya dayanıklılığı ayarlamayı veya özellikleri açmayı içerebilir. Memory değiştirme genellikle şunları içerir:

  1. Bir memory adresinden mevcut değeri okuma
  2. Hesaplamalar veya değişiklikler yapma
  3. Değiştirilmiş değeri aynı adrese yazma

Pointer’lar ve Dinamik Memory Analizi

Karmaşık game hacking senaryoları, dinamik memory yapıları ve pointer’ları içerir. Pointer’lar, başka konumlara işaret eden memory adresleridir. Dinamik olarak ayrılmış memory’ye erişmek veya karmaşık veri yapılarında gezinmek için kullanılırlar. Pointer’ları anlamak, oyunun memory alanında daha etkili bir şekilde gezinmemize ve manipülasyon için istenen değişkenleri veya yapıları bulmamıza olanak tanır.

Memory Manipulation Araçları

Memory manipülasyonuna yardımcı olan çeşitli araçlar var:

  • Memory Editor’lar/Trainer’lar: Gerçek zamanlı olarak memory değerlerini taramak ve değiştirmek için kullanıcı dostu arayüzler
  • Debugger’lar: Cheat Engine veya OllyDbg gibi araçlar, breakpoint’ler, memory inceleme ve disassembly gibi gelişmiş özellikler sağlar

Bu araçlar, memory adreslerini bulmayı ve manipüle etmeyi basitleştirir, hassas ve verimli değişiklikler yapmamıza olanak tanır.

Cheat Engine: Memory Düzenleme Kolaylaştı

Cheat Engine, game hacking topluluğunda yaygın olarak kullanılan popüler bir memory düzenleme aracıdır. Gerçek zamanlı olarak memory değerlerini taramanıza, değiştirmenize ve manipüle etmenize olanak tanır. Cheat Engine’i adım adım kullanmayı görelim.

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.

Memory Manipulation için C++ Kullanmak

Cheat Engine öğrenmek için harika olsa da, kendi C++ kodunu yazmak daha fazla kontrol ve anlayış sağlar. Memory’yi programatik olarak manipüle etmeyi keşfedelim.

Offset’leri Bulma

Offset’ler, güvenilir memory manipülasyonunun anahtarıdır. Cheat Engine kullanarak bunları bulma:

  1. Hedef değerinin memory adresini bul
  2. Adrese sağ tıkla ve “Find out what accesses this address” seçeneğini seç
  3. Cheat Engine, bu adrese erişen assembly talimatlarını gösterecektir
  4. Assembly’yi analiz ederek memory yapısını ve offset’leri anla

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 Düşünceler

Game hacking güçlü bir beceridir, ancak sorumluluklarla birlikte gelir:

  • Tek oyunculu oyunlar: Öğrenme ve deney için genellikle kabul edilebilir
  • Çok oyunculu oyunlar: Başkalarının deneyimini bozabilir ve hizmet şartlarını ihlal edebilir
  • Geliştiricilere saygı: Anti-cheat sistemlerinin iyi nedenlerle var olduğunu anla
  • Sorumlu kullan: Rekabetçi ortamlarda haksız avantaj sağlamak için hack kullanma

Anti-Cheat Sistemleri

Modern oyunlar çeşitli anti-cheat önlemleri uygular:

  1. Memory Tarama: Yetkisiz değişiklikler için periyodik kontroller
  2. Kod Bütünlüğü Kontrolleri: Oyun kodunun değiştirilmediğinin doğrulanması
  3. Davranış Analizi: İmkansız veya şüpheli eylemlerin tespiti
  4. Sunucu Tarafı Doğrulama: Kritik değerler oyun sunucularında doğrulanır

Bu sistemleri anlamak, bazı hack’lerin neden tek oyunculu oyunlarda çalıştığını ancak çok oyunculu oyunlarda çalışmadığını takdir etmene yardımcı olur.

Sonuç

Memory manipulation, yazılımın nasıl çalıştığına dair derinlemesine bilgiler sağlayan temel bir game hacking tekniğidir. Virtual memory’i anlayarak, Cheat Engine gibi araçları kullanarak ve C++ kodu yazarak, oyun değerlerini değiştirebilir ve oyun mekaniklerini deneyebilirsin. Özellikle çok oyunculu ortamlarda bu becerileri sorumlu ve etik bir şekilde kullanmayı unutma.

Ele aldığımız ana kavramlar:

  • Virtual memory ve process’lerin memory’yi nasıl izole ettiği
  • Memory adreslerini bulmak ve değiştirmek için Cheat Engine kullanımı
  • Windows API fonksiyonlarını kullanarak C++ kodu yazma
  • Offset’leri ve pointer zincirlerini anlama
  • Para ve yetenekleri manipüle etmek için pratik örnekler

İster oyun geliştirme, ister reverse engineering, ister cybersecurity ile ilgilen, memory manipulation’ı anlamak birçok kapıyı açan değerli bir beceridir.

İlgili İçerik