Ghidra ve Python ile Ecco the Dolphin’ın tersine mühendislik analizi
(32bits.substack.com)- Dreamcast için Ecco the Dolphin: Defender of the Future içinde, kayıt dosyası baş harfleri girilerek etkinleştirilen gizli hileler vardı; mevcut
GYUGYU+XXXdışında da çeşitli özel girişler doğrulandı - Analizde flycast bellek anlık görüntüsü Ghidra’ya yüklenerek giriş arabelleği ve işleme fonksiyonu bulundu; dönüşüm sonucunun 6 özel değerle karşılaştırıldığı yapı izlendi
- Hile tespiti, giriş dizgesinin kendisiyle değil, bir parola cümlesiyle çözülen anahtar ve checksum hesaplamasından geçirilen değerle yapılıyor; bu yüzden yalnızca dizgeyi okuyarak bulunması zor
- Python kaba kuvvet denemesiyle 1–8 karakterlik girişler test edildi ve
SOCCER,EXBBERX,QQRIQ,XYZZYX,POPELYgibi girişlerin bonus bölüm, ölümsüzlük modu, FPS gösterimi ve zaman gösterimiyle bağlantılı olduğu doğrulandı - Aynı etkiyi oluşturan giriş tek bir değere sabit değil;
NNSET,SOCCER,ADEMVSSFüçü de bonus futbol oyununu açıyor,AFTJSXOTdaGYUGYUgibi tüm bölümleri kilitten çıkarıyor
Kayıt dosyası adıyla etkinleşen gizli hileler
- Ecco the Dolphin: Defender of the Future, resmî olarak yayımlanan son Ecco oyunu; devam oyunu ise iptal edildi
- Daha önce bilinen hile, VMU ekranında New Game seçilip baş harflere
GYUgirildikten sonra End’e basmadan tekrarGYUve rastgele üç harf girme yöntemiydiGYU GYU XXXbiçiminde girip menüden çıkınca Load game bölümünde tüm bölümler seçilebiliyordu
- Doğrulanan özel girişler ve etkileri şöyle
GYUGYU+XXX: Tüm seviyelerin kilidini açarSOCCER+XXX: Bonus bölümün kilidini açarEXBBERX+XXX: Ölümsüzlük moduQQRIQ+XXX: FPS gösterimiXYZZYX+XXX: Zaman gösterimiPOPELY+XXX: Etkisi bilinmiyor
Ghidra ile giriş işleme rutinini izleme
- flycast emülatörünün bellek anlık görüntüsünde, ekranda görünen baş harflerin bir kısmının
8cfffb34arabelleğine kaydedildiği doğrulandı - Girişe devam edilince daha önce girilen karakterler
8c3abf18arabelleğine itiliyor ve hile tespitinde bu bölge kullanılıyor - Anlık görüntü Ghidra’ya yüklendikten sonra,
8c0334d8konumundaki fonksiyonun söz konusu arabelleği okuduğu bulundu - Bu fonksiyon arabelleği dönüştürüyor ve sonucun 6 özel değer listesinden biri olup olmadığını kontrol ediyor
GYU GYU XXX,9388D627değerine dönüştürülüyor ve listedeki ilk özel değerle eşleşiyor
Dönüşüm yöntemi ve checksum yapısı
- Ghidra decompile çıktısıyla doğrulanan dönüşüm fonksiyonunun akışı şöyle
- Parola cümlesini okur
- Parola cümlesiyle 1024 baytlık anahtarı çözer
- Anahtarı kullanarak giriş arabelleğinin checksum değerini hesaplar
- Anahtarı yeniden şifreler
- Checksum tek yönlü bir fonksiyon olduğundan, özel değeri üreten girişi gözle doğrudan geriye doğru hesaplamak zordur
- Daha sonraki bir güncellemede metalliczx ve SideQuark, çözme işleminden sonraki yapının standart CRC32 checksum polinomu olduğunu doğruladı
- Bu nedenle hedef değerleri kaba kuvvetten daha verimli elde etmenin bir yöntemi mevcut
Python kaba kuvvet denemesiyle bulunan girişler
GYUGYU6 harflidir ve olası 6 harfli kombinasyon sayısı26^6 = 308,915,776’dır- 7 harfte bu sayı 8 milyar kombinasyona, 8 harfte 208 milyar kombinasyona kadar çıkar; bu da dizüstü bilgisayar için ağır bir ölçek olur
- Python uygulaması girişleri şu prosedürle test eder
- Başlatılmamış giriş arabelleğini, parola cümlesini ve anahtarı içeren bellek bloğunu kopyalar
- Parola cümlesiyle anahtarı çözer
- 1–8 harfli dizileri giriş arabelleğine yerleştirir
- Her girişin checksum değerini hesaplar
- Hesaplanan sonucu hedef değerle karşılaştırır
- Kodun tamamı gist’te yayımlandı
- Yalnızca tek iş parçacıklı sürüm gerekli sonuçları üretmeye yetti; paralel sürüm yazılırken sonuçlar zaten ortaya çıkmıştı
Bulunan eşleştirmeler ve gerçek etkiler
- Çıktı sonuçlarının son sütunu hangi özel değer ile eşleşildiğini gösterir
NNSET,SOCCER,ADEMVSSFhepsi aynı değerle eşleşir ve bonus futbol oyununun kilidini açarAFTJSXOT,GYUGYUgibi tüm bölümlerin kilidini açar
- Baş harf olarak
SOCCER+XXXgirildiğinde Bonus Game açılır ve su altı futbolu oynanabilir8c3ac00cbayrağında0x2biti ayarlanır
EXBBERX+XXX, Options ekranında Immortality Enabled gösterir- Etkinken boğulmaz veya ölmezsiniz
8c3abe48bayrağının0x400biti ve8c3abb00bayrağının0x4biti ayarlanır
QQRIQ+XXX, oyunun kare hızını ve bazı hata ayıklama değerlerini gösterirXYZZYX+XXX, mevcut saat değerini gösterir- Bu iki giriş,
8c35659cve8c3565a4adreslerindeki değerleri değiştirir
- Bu iki giriş,
POPELY+XXXgirişinin etkisi doğrulanmadı8c3b0e44bayrağını etkinleştirmeye yönelik olduğu tahmin ediliyor; ancak bu bayrak yalnızca Cheats Enabled mesajını gösteriyor, başka bir etki görünmüyor
1 yorum
Hacker News yorumları
Hash aslında yalnızca CRC32; daha doğrusu şu polinomu (0x77073096, kod hatalı) kullanıyor
https://web.mit.edu/freebsd/head/sys/libkern/crc32.c
Yazıda şifresi çözülmüş tamsayılar bu CRC32’nin sabitleri. Bunun CRC32 olduğunu ve polinomu biliyorsanız, polinom halkasındaki modüler matematiği kullanarak yanıtı üstel zamanda değil logaritmik zamanda geriye doğru hesaplayabilirsiniz
Binwalk’ın CRC polinom tablolarını tanıdığını duymuştum; bu tabloyu da bulup bulamayacağını merak ediyorum
Birilerinin Binwalk ile Ghidra’yı entegre etmesi lazım. İkisi birbirine çok yakışıyor
Değerin bir CRC32 sonucu olduğunu ya da kullanılan polinomu/başlangıç değerini anlamaya yönelik ipuçları var mı, merak ediyorum
Orijinal Ecco Megadrive (Genesis) için çıktığında, zor bela biriktirdiğim bütün paramı harcayıp satın almıştım. Oyun akıl almaz derecede zordu; öfkeden bütün öğleden sonrayı kalem kâğıtla geçirip bir şekilde parola sistemini çözmüştüm
Son seviyeye ışınlanıp ertesi gün oyunu bitirdim; ama iki günde bitirdiğim bir oyuna tüm servetimi harcadığım için suçluluk duydum
Parola sistemini kalem kâğıtla çözmüş olman ilginç; hatırladıkların varsa daha fazlasını duymak isterim
Felsefi açıdan bakınca, bence o oyunu bitirmiş sayılmazsın
Birçok seviyeyi atladın ve amaçlanan içeriğin, oynanışın ve hikâyenin yalnızca bir kısmını görmüş oldun. Ecco the Dolphin de dahil oyunlarda genellikle varış noktasından çok yolculuk önemlidir. Yalıtılmışlık, dış gruplarla dost olmak, koruma, zamanda yolculuk, dinozorlarla bağ kurma ve tabii ki uzay yolculuğu gibi tema ve deneyimleri kaçırmışsın
Yani o kadar suçluluk duymana gerek yokmuş
Yine de son seviye harikaydı. Oyunun büyük bir kısmını atlayıp gördüğünde şaşırıp şaşırmadığını merak ediyorum
Hile kullanmış olsan da olmasan da, bu oyunu bitiren dünyadaki tek kişi olabilirsin
QQRIQ, “kukuriku”nun fonetik kısaltması ve Macarcada ve birçok dilde horoz ötüşü anlamına geliyor. Lehçedeki “kukuryku”, İbranicede “קוקוריקו” gibi örnekler var
Parolaları seçme sürecinin nasıl olduğunu merak ettiriyor
Gyugyu da Macar filmi “The Fifth Seal”e bir gönderme olabilir
“Ölmek üzereyken iki kişiden biri olarak reenkarne olacağını hayal et. Biri köle, diğeri zengin bir efendi. Köle efendisinden acı çeker; dilini ve bir gözünü kaybeder, karısı ve çocuğu da öldürülür. Kendisinin iyi bir insan olduğuna inanarak yaşamaya devam eder; çünkü efendi gibi korkunç ve sadistçe şeyleri başkalarına hiç yapmamıştır. Zengin efendinin ise hiçbir ahlaki çekincesi yoktur. Yaptıklarının yanlış olduğunu düşünmez, kölenin cezalandırılması gerektiğine inanır. Fakir ama erdemli köle mi, yoksa zengin ama yozlaşmış efendi mi olacağını seçmek zorundasın.”
Gyugyu o kölenin adıdır
https://www.imdb.com/title/tt0075467
Bu oyunun programcıları Budapeşte’de olduğuna göre oldukça makul bir tahmin
Macarcadaki “ly” harflerini içeren Popely de bir ipucuydu
Fransızcada Cocorico, yani oldukça benziyor
Tavukların sürekli çıktığı Zelda’daki Kakariko köyünü de akla getiriyor
İlginç bir yan bilgi: Ecco geliştiricisi Ed Annunziata, ilham kaynakları sorulduğunda “LSD hiç kullanmadım ama John C. Lilly’yi çok okudum” diye yanıt vermişti. Lilly; hayvan zekâsı, ketamin psikoterapisi, duyusal yoksunluk tankları ve bilinç araştırmaları alanlarındaki öncü çalışmalarıyla bilinir
“Ecco” adı, Lilly’nin ECCO’suna (Earth Coincidence Control Office) yapılan bir göndermedir. John, Dünya’daki tüm “tesadüfleri” koordine etmek için Ay’ın karanlık tarafında doğaüstü/uzaylılara ait bir üs bulunduğunu varsaymıştı. Yunusların ne kadar zeki olduğunu erken fark edenlerden biriydi ve yunuslarla iletişim kurmanın yolunu bulmaya takıntılıydı; Karayipler’deki evinin yarısını suyla doldurup onlarla birlikte yaşamıştı. Bu yalnızca buzdağının görünen kısmı; ilginizi çekiyorsa otobiyografisi The Center of the Cyclone’ı şiddetle öneririm. Gerçekten büyüleyici bir figür
Dreamcast oyunlarında tersine mühendisliğe başlamak için kaynak var mı, merak ediyorum. Skies of Arcadia üzerinde denemek istediğim şeyler var; “bellek anlık görüntüleri arasında hangi değerin değiştiğine bakmak”tan daha sistematik teknikler olsa iyi olurdu
RAM’de bir değerin konumunu bulmak için bu yöntem aslında fiilen standart tekniğe yakın. Pratikte oldukça iyi çalışıyor
Dolphin gibi bazı emülatörlerde bu tür araçlar yerleşik geliyor. N64 için Gameshark gibi eski oyun hackleme araçları da aynı tekniği konsol arayüzüyle kullanıyordu. Dreamcast emülatörlerinde böyle bir araç var mı bilmiyorum
Dolphin’de bu tekniği kullandığım bir yazı yazmıştım; devam yazısı da Ghidra ile konsol oyunu hackleme üzerine: https://www.smokingonabike.com/2021/01/17/hacking-super-monk...
O oyuna biraz bakmışlığım var. Temel püf noktası, bellek anlık görüntüsünü dosyaya döküp Ghidra’ya içe aktarmak. Dump almanın birkaç yolu var; Cheat Engine’i seven de çok
Ghidra, SuperH işlemci makine kodunu yerel olarak analiz edebiliyor; bu yüzden yalnızca otomatik analizi çalıştırmak bile birçok fonksiyonu ortaya çıkarıyor
Son birkaç yılda eski oyunlara çok daha fazla çekilir oldum; doğru bir ifade mi bilmiyorum ama çok daha ruh sahibi hissettiriyorlar
Ayrıca araba meselesi üzücü. Uyarı için teşekkürler; bundan sonra arabayı giriş yolunda bırakıp rölantide çalıştırmayacağım
Tersine mühendisliği nereden öğrenmeye başlamak gerektiğini hep merak etmişimdir. Çoğu kişi önce assembly öğren diyor, ama sonrasında internette pek somut bilgi yok gibi görünüyor
x86, arm, arcade platformlarındaki yaygın kalıpları deneme yanılmayla yavaş yavaş öğrenmek mi gerekiyor, bilmiyorum. Ayrıntıları ele alan tartışmaları internette bulmak zor
Ghidra gibi araçlar kullanınca kaynak kodu parça parça eşleştirebilirsiniz, ama sonunda yine yabancı bir kod tabanını anlamaya çalışırken yaptığınız gibi çıkarım yürütmek gerekir. Bu kez fark, hiç yorum olmaması; ancak kaynak kodu açık projelerde de yorum bulunmaması oldukça sık görülen bir durum
Daha gerçekçi örnekler için http://microcorruption.com veya https://crackmes.one/ çözmek iyi olur
Kişisel olarak Cheat Engine ile kurcalayarak çok şey öğrendim. Çocukken çoğunlukla kullanıp sonra bir daha bakmadığım için bilmiyordum ama düşündüğümden çok daha güçlü bir araçmış
Disassembler’ı gayet iyi ve “assembly scripts” dedikleri şeyleri yazabildiğiniz için x86 assembly ile bellek yamalama temellerini öğrenmek için uygun. Oradan başlayıp oyunları istediğiniz gibi yamalayan kendi yardımcı aracınızı geliştirmeye başlayabilirsiniz
Sadece Cheat Engine ile bile oyunları yamalayıp çılgın seviyede hileler yapabilirsiniz
Okulda biraz öğrenmiştim ama çocukluktan hatırladığım video oyunlarını debugger ile adım adım çalıştırmak, bilgisayar bilimini derste öğrendiklerimden çok daha iyi öğretti
Sualtı futbolu hilesinin gerçekten çalıştığını gösteren bir video görmek isterim
Benzer oyunların sabit tamsayılarla checksum’ı tutturma biçimi ilginç. Pitfall: The Lost Expedition da düğme girişlerini giriş düğmelerinin ASCII dizgesine çevirip ardından CRC hesaplayan çok benzer bir yöntem kullanmıştı
Yaklaşım da Python ile neredeyse kaba kuvvet uygulayıp çıkarılan hile hash’leri ile karşılaştırmak şeklindeydi.
decrypted_intsiçinde gizli CRC32 tablosu da görünüyor. Önceden oluşturulmuş tablolar aramayla çok kolay bulunuyor. Kendi polinomuyla yeni tablo üretmek yerine, işi zorlaştırmak için obfuscate edilmiş halde sıkça bulunmalarının nedeni merak uyandırıyorSega Saturn’a odaklanan bir blog olması şaşırtıcı
Kısa süre önce ailemin evindeki gömme dolapta bir Saturn ve küçük bir oyun CD’si destesi buldum. Ona sahip olduğumu hatırlamıyorum; bu yüzden üniversiteye gittikten sonra kardeşimin edinmiş olabileceğini tahmin ediyorum. Her neyse, bağlayınca tüm oyunlar sorunsuz çalıştı. Ama bunun dışında bununla ne yapacağımı hiç bilmiyorum. Elbette çöpe atmak bir seçenek değil
Oyunların inanılmaz bir değeri var. 2005’te bendekini öylece vermiştim; şimdi eBay’de fiyatlara bakınca kalbim hızlanıyor
Keyfini çıkarıp oynamak yeterli
https://terraonion.com/en/producto/terraonion-mode/