Auto Assembler Temelleri: Cheat Engine'de AOB Injection Scriptlerini Anlamak
Script girdisi nedir, [ENABLE] ve [DISABLE] nasıl çalışır ve Cheat Engine'in AOB injection şablonuna satır satır bakış: aobscanmodule, alloc, label'lar, semboller ve joker karakterler.
Paylaşılan hile tablolarındaki işe yarar girdilerin çoğu düz değer değil, script'tir: sınırsız can, reload yok, bedava crafting. Bunlar Cheat Engine'in Auto Assembler'ında yazılır; x86 assembly ile kod bulma ve yamalama komutlarını birleştiren küçük bir script formatıdır. Bu rehber böyle bir script'in ne yaptığını anlatıyor, Cheat Engine'in senin için oluşturduğu AOB injection şablonunu adım adım inceliyor ve bir script'i güvenilir yapan kuralları ele alıyor.
Bir değeri nasıl bulacağını ve pointer'ın ne olduğunu zaten biliyorsan rehberden daha çok verim alırsın; bu konuyu pointer tarama rehberi anlatıyor. Script'ler çalışan oyunun kodunu değiştirir, o yüzden onları sadece tek oyunculu ve çevrimdışı oyunlarda kullan, denemeden önce kaydet ve kayıt dosyalarının yedeğini al.
Script girdisi nedir?
Script girdisi, adres listesinde Value sütununda <script> yazan bir öğedir. Bir değeri göstermek yerine Auto Assembler kodu içerir. Girdinin Active kutusunu işaretlediğinde script'in [ENABLE] bölümü çalışır; işareti kaldırdığında [DISABLE] bölümü çalışır. Hile tablosu nasıl kullanılır rehberi bunu kullanıcı tarafından anlatıyor.
Tipik bir script bir değeri tek seferlik değiştirmez. Değeri yazan oyunun kendi komutunu değiştirir, bu yüzden script aktif olduğu sürece etki kalıcıdır. Örneğin hasar sonrası yeni canını kaydeden komut, bunun yerine maksimum değeri kaydeden koda yönlendirilebilir.
Script'lerin düz adreslere göre büyük bir avantajı var: hedeflerini oyunun kodunda bir bayt deseni arayarak buldukları için pointer olmadan yeniden başlatmalarda da çalışırlar. Bedeli ise o kodun aynı kalmasına bağlı olmaları, yani bir oyun sürümüne bağlı kalmalarıdır.
[ENABLE] ve [DISABLE]
Açılıp kapanabilen her script'te iki bölüm de bulunur. [ENABLE] kodu bulur, yeni kod için bellek ayırır ve oyunun komutundan yeni koda bir jump yazar. [DISABLE] hepsini geri alır: orijinal baytları geri yazar, kaydettiği isimleri kaldırır ve belleği serbest bırakır. İyi yazılmış bir [DISABLE] oyunu tam olarak eski haline getirir. Eksik ya da yanlışsa girdinin işaretini kaldırmak oyunu, yeniden başlatana kadar yamalı veya bozuk bir durumda bırakır.
Komutu bulmak ve şablonu oluşturmak
- Kontrol etmek istediğin değeri bul ve adres listesine ekle.
- Sağ tıkla ve Find out what writes to this address seçeneğini seç. Oyunda değerin değişmesini sağla. Listede bir ya da daha fazla komut görünür.
- Komutu seç ve disassembler'da (Memory Viewer) aç.
- Memory Viewer'da o komut seçiliyken Tools → Auto Assemble yolunu aç.
- Auto Assemble penceresinde Template → AOB Injection seçeneğini seç. Adresi onayla ve varsayılanı
INJECTolan sembol adını kabul et ya da değiştir. - Script'i düzenle, sonra pencerenin File menüsünden onu geçerli hile tablosuna ata. Adres listesinde yeni bir script girdisi olarak görünür.
AOB injection şablonu, satır satır
Aşağıda şablonun ürettiği yapının bir örneği var. İşlem adı, sembol ve baytlar örnek olsun diye uydurulmuştur; bu, gerçek bir oyunun kodu değildir.
{ EXAMPLE STRUCTURE ONLY - not code for a real game.
Process: game.exe Symbol: INJECT Bytes: made up }
[ENABLE]
aobscanmodule(INJECT,game.exe,89 83 F0 00 00 00 48 8B 5C 24 ??) // should be unique
alloc(newmem,$1000,INJECT)
label(code)
label(return)
newmem:
mov eax,#999 // your change: store 999 instead
code:
mov [rbx+000000F0],eax // the original instruction
jmp return
INJECT:
jmp newmem
nop
return:
registersymbol(INJECT)
[DISABLE]
INJECT:
db 89 83 F0 00 00 00 // original bytes: mov [rbx+000000F0],eax
unregistersymbol(INJECT)
dealloc(newmem)
aobscanmodule
aobscanmodule(INJECT,game.exe,...), game.exe modülünün belleğinde bayt desenini arar ve bulursa INJECT adını desenin başladığı adres olarak tanımlar. Aramayı tek modülle sınırlamak daha hızlıdır ve başka yerlerdeki yanlış eşleşmeleri önler. İlgili komutlar da var: aobscan tüm belleği tarar, aobscanregion ise iki adres arasını tarar. Desen bulunamazsa script bir hatayla etkinleşmez; oyun güncellemesinden sonra en sık görülen belirti budur.
alloc
alloc(newmem,$1000,INJECT), kodun için 0x1000 bayt bellek ayırır ve ona newmem adını verir. Üçüncü parametre Cheat Engine'den belleği INJECT'e yakın ayırmasını ister. 64 bit oyunlarda bu önemlidir: kısa, 5 baytlık bir jmp her yönde yalnızca yaklaşık 2 GB uzağa ulaşabilir ve yakına ayırmak, jump'ı orijinal komutun yerine sığacak kadar küçük tutar.
label
label(code) ve label(return), aşağıda tanımlanacak konumlar için isim bildirir. code orijinal komutun tekrar çalıştırıldığı yeri, return ise yamalanan komutun hemen sonrasını, yani yürütmenin devam ettiği yeri işaretler.
newmem ve code
newmem: altındaki her şey senin kodundur; ardından code: altında orijinal komut gelir. Örnekte mov eax,#999 register'ı 999 yapar (# ondalık sayıyı belirtir) ve orijinal mov [rbx+000000F0],eax onu kaydeder, böylece değer hep 999 olarak yazılır. Son olarak jmp return oyunun koduna geri döner.
INJECT: jmp newmem
Script, bulunan adreste orijinal komutun üzerine jmp newmem yazar. Jump 5 bayt tutar ama buradaki orijinal komut 6 bayttı, bu yüzden artan bayt bir nop ile doldurulur; yoksa işlemci yarım bir komutu çalıştırmaya çalışırdı. Şablon bunu senin için hesaplar. return: hemen sonrasına konur, böylece dokunulmamış bir sonraki komutu işaretler.
registersymbol ve unregistersymbol
registersymbol(INJECT), INJECT adını Cheat Engine'de genel olarak bilinir hale getirir. Daha sonra ve ayrı çalışan [DISABLE] bölümünün yeniden tarama yapmadan aynı adresi bulabilmesini sağlayan budur. Ayrıca diğer girdilerin ona başvurmasına da izin verir. [DISABLE] içindeki unregistersymbol(INJECT) adı kaldırır.
Orijinal baytları geri yazmak ve dealloc
[DISABLE] içinde INJECT: ve ardından gelen db 89 83 F0 00 00 00, orijinal baytları jump'ın üzerine geri yazar ve oyunun komutunu birebir geri getirir. Sonra dealloc(newmem), kodunu tutan belleği serbest bırakır. Sıra önemlidir: önce jump'ı geri yükle, böylece bellek serbest bırakılırken oyun artık newmem'i kullanmıyor olur.
Joker karakterler ve neden benzersiz imzalar önemli
aobscanmodule içindeki bayt desenine imza denir. İki koşulu karşılaması gerekir:
- Benzersiz olmalı. Desen birden fazla yerde geçiyorsa script ilk eşleşmeyi yamalar; bu tamamen farklı bir fonksiyon olabilir. Script'ler oyunları böyle çökertir ya da yanlış şeyi değiştirir. Şablon hatırlatma olarak "should be unique" yorumunu ekler.
- Küçük değişikliklere dayanmalı. Bazı baytlar oyun sürümleri arasında, hatta çalıştırmalar arasında kolayca değişir: komut içindeki offset'ler, call ve jump'ların göreli adresleri ve gömülü sabitler. Bu baytları
??joker karakterleriyle değiştirmek, sadece bu ayrıntılar değiştiğinde desenin eşleşmeye devam etmesini sağlar.
Bu iki hedef birbirine ters çeker. Çok az bayt olursa desen birçok yerde eşleşir; çok fazla joker olursa yine genel hale gelir. Pratik bir yaklaşım şu: opcode baytlarını tut, değişken offset ve adresleri joker yap ve bağlam için sonraki komutlardan birkaç bayt ekle. Sonra desenin benzersiz olduğunu kontrol et: ana pencerede Value Type'ı Array of byte yap, deseni yapıştır ve bellek seçeneklerinde çalıştırılabilir belleği dahil ederek tara. İstediğin sonuç tam olarak bir tanedir. AOB imza oluşturucu, kopyaladığın baytları joker karakterli bir desene çevirmene ve hangi baytların değişme ihtimalinin yüksek olduğunu görmene yardım eder.
Script'i test etmek
- Oyunu kaydet ve ilk testten önce kayıt dosyanın yedeğini al.
- Script'i etkinleştir, etkiyi kontrol et, sonra kapat ve oyunun tekrar normal davrandığını doğrula.
- Birkaç kez aç kapat. İkinci etkinleştirmede başarısız olan bir script'in genelde
[ENABLE]'i tam geri almayan bir[DISABLE]bölümü vardır. - Paylaşılan komutlara dikkat et. Canını yazan komut düşmanların canını da yazıyor olabilir; bu durumda değişikliğin herkesi etkiler ve bir şeyi değiştirmeden önce durumları birbirinden ayırman gerekir.
Script çalışınca girdiye net bir açıklama ver ve tabloyu kaydet. Oyun güncellenip script etkinleşmediğinde ilk kontrol edilecek şey imzadır.
Yorumlar
Henüz yorum yok
Düşüncelerini ilk paylaşan sen ol.