2 puan yazan GN⁺ 2024-11-08 | 1 yorum | WhatsApp'ta paylaş
  • 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+XXX dışı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, POPELY gibi 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, AFTJSXOT da GYUGYU gibi 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 GYU girildikten sonra End’e basmadan tekrar GYU ve rastgele üç harf girme yöntemiydi
    • GYU GYU XXX biç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çar
    • SOCCER+XXX: Bonus bölümün kilidini açar
    • EXBBERX+XXX: Ölümsüzlük modu
    • QQRIQ+XXX: FPS gösterimi
    • XYZZYX+XXX: Zaman gösterimi
    • POPELY+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 8cfffb34 arabelleğine kaydedildiği doğrulandı
  • Girişe devam edilince daha önce girilen karakterler 8c3abf18 arabelleğine itiliyor ve hile tespitinde bu bölge kullanılıyor
  • Anlık görüntü Ghidra’ya yüklendikten sonra, 8c0334d8 konumundaki 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, 9388D627 değ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

  • GYUGYU 6 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, ADEMVSSF hepsi aynı değerle eşleşir ve bonus futbol oyununun kilidini açar
    • AFTJSXOT, GYUGYU gibi tüm bölümlerin kilidini açar
  • Baş harf olarak SOCCER+XXX girildiğinde Bonus Game açılır ve su altı futbolu oynanabilir
    • 8c3ac00c bayrağında 0x2 biti ayarlanır
  • EXBBERX+XXX, Options ekranında Immortality Enabled gösterir
    • Etkinken boğulmaz veya ölmezsiniz
    • 8c3abe48 bayrağının 0x400 biti ve 8c3abb00 bayrağının 0x4 biti ayarlanır
  • QQRIQ+XXX, oyunun kare hızını ve bazı hata ayıklama değerlerini gösterir
  • XYZZYX+XXX, mevcut saat değerini gösterir
    • Bu iki giriş, 8c35659c ve 8c3565a4 adreslerindeki değerleri değiştirir
  • POPELY+XXX girişinin etkisi doğrulanmadı
    • 8c3b0e44 bayrağı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

 
GN⁺ 2024-11-08
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

    • Zorunlu ağ bağlantısı ve mikro ödemeler gibi modern özellikleri özlemediğinden emin misin?
    • Arabaya ne olduğunu anlamadım. Yazıda ya da yorumlarda göremedim
  • 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

    • Hata ayıklamaya benzer. Muhtemelen daha önce bilmediğin bir codebase’i devralıp anlamak zorunda kalmışsındır; sadece kaynak kod yerine elinde binary var

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

Zaten yolun neredeyse yarısına gelmiş sayılırsınız; assembly koduna aşinaysanız elbette bunun faydası olur
  • 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_ints iç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ıyor

  • Sega 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