Game Hacking 101: Mount and Blade Warband'da Memory Manipulation
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.

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 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ı:
- Artırılmış Adreslenebilir Memory: Her process, fiziksel memory’den daha büyük bir virtual address space’e sahip olabilir
- Memory İzolasyonu: Process’ler birbirinin memory’sine erişemez, bu da güvenliği artırır
- Verimli Memory Kullanımı: Kullanılmayan kısımlar diske saklanabilir, fiziksel memory’yi serbest bırakır
- 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.

3. İlk Değer Taraması Yap
Değiştirmek istediğin değişkeni belirle (örneğin, oyuncunun parası). Cheat Engine’de:
- “Value” alanına mevcut değeri gir
- Dropdown menüden değer tipini seç (örneğin, integer değerler için 4 bytes)
- Aramayı başlatmak için “First Scan” butonuna tıkla
Tarama, değerinle eşleşen tüm memory adreslerini bulacaktır.


4. Aramayı Daralt
İlk tarama genellikle birçok adres döndürür. Bunu daraltmak için:
- Oyunda değeri değiştir (örneğin, para harca veya kazan)
- Cheat Engine’de yeni değeri gir
- Aramayı daraltmak için “Next Scan” butonuna tıkla
- Yönetilebilir sayıda adres kalana kadar tekrarla


5. Memory Değerlerini Değiştir
Daraltılmış bir liste ile:
- Bir memory adresine çift tıklayarak adres listesine ekle
- Değer sütununa çift tıklayarak değiştir
- İstediğin değeri gir
- Oyun değişikliği hemen yansıtacaktır


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üklenireax,0xfc8ile çarpılır- Para değeri,
[ecx + eax + 0x5d0]adresinden yüklenir

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

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

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ştururProcess32Next: Process girişleri arasında yinelenirOpenProcess: Hedef process’e bir handle açarReadProcessMemory: Bir process’ten memory okurWriteProcessMemory: 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:
- Tüm çalışan process’lerin anlık görüntüsünü oluşturur
- Her process arasında yinelenir
- Process isimlerini hedefle karşılaştırır
- Bulunduğunda tam erişimle bir handle açar
- 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
ReadProcessMemorykullanır Ttipinde 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
WriteProcessMemorykullanı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:
- Oyun process’ini bulur
- Executable’ın base address’ini alır
- Offset’leri kullanarak pointer zincirini takip eder
- Mevcut para değerini okur
- 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)




İ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.