Analisis rekayasa balik Ecco the Dolphin dengan Ghidra dan Python
(32bits.substack.com)- Ecco the Dolphin: Defender of the Future untuk Dreamcast ternyata menyimpan cheat tersembunyi yang aktif lewat input inisial pada file save, dan selain
GYUGYU+XXXyang sudah dikenal, beberapa input khusus lain juga telah teridentifikasi - Analisis dilakukan dengan memuat snapshot memori flycast ke Ghidra untuk menemukan buffer input dan fungsi pemrosesnya, lalu menelusuri struktur yang membandingkan hasil transformasi dengan 6 nilai khusus
- Penentuan cheat tidak dilakukan berdasarkan string input itu sendiri, melainkan berdasarkan kunci yang didekripsi dengan passphrase dan nilai yang melewati perhitungan checksum, sehingga sulit ditemukan hanya dengan membaca string secara langsung
- Dengan brute force Python, input 1~8 karakter diperiksa dan dikonfirmasi bahwa
SOCCER,EXBBERX,QQRIQ,XYZZYX,POPELYdan lainnya terhubung dengan stage bonus, mode abadi, tampilan FPS, dan tampilan waktu - Input yang menghasilkan efek yang sama tidak terpaku pada satu bentuk;
NNSET,SOCCER,ADEMVSSFsemuanya membuka game sepak bola bonus, danAFTJSXOTjuga membuka semua stage sepertiGYUGYU
Cheat tersembunyi yang aktif lewat nama file save
- Ecco the Dolphin: Defender of the Future adalah game Ecco terakhir yang dirilis secara resmi, dan sekuelnya kemudian dibatalkan
- Cheat yang sebelumnya dikenal menggunakan cara memilih New Game di layar VMU, memasukkan
GYUsebagai inisial, lalu tanpa menekan End memasukkan lagiGYUdan tiga huruf acak- Setelah memasukkan dalam bentuk
GYU GYU XXXlalu keluar dari menu, semua stage bisa dipilih di Load game
- Setelah memasukkan dalam bentuk
- Input khusus yang terkonfirmasi beserta efeknya adalah sebagai berikut
GYUGYU+XXX: membuka semua levelSOCCER+XXX: membuka stage bonusEXBBERX+XXX: mode abadiQQRIQ+XXX: tampilan FPSXYZZYX+XXX: tampilan waktuPOPELY+XXX: efek tidak diketahui
Melacak rutinitas pemrosesan input dengan Ghidra
- Dari snapshot memori emulator flycast, dipastikan bahwa sebagian inisial yang terlihat di layar disimpan di buffer
8cfffb34 - Saat input diteruskan, karakter yang dimasukkan lebih dulu terdorong ke buffer
8c3abf18, dan area inilah yang dipakai untuk penentuan cheat - Setelah snapshot dimuat ke Ghidra, ditemukan bahwa fungsi di alamat
8c0334d8membaca buffer tersebut - Fungsi ini mentransformasikan buffer, lalu memeriksa apakah hasilnya cocok dengan salah satu dari 6 daftar nilai khusus
GYU GYU XXXditransformasikan menjadi9388D627dan cocok dengan nilai khusus pertama dalam daftar
Mekanisme transformasi dan struktur checksum
- Alur fungsi transformasi yang dikonfirmasi lewat dekompilasi Ghidra adalah sebagai berikut
- Membaca passphrase
- Mendekripsi kunci 1024 byte dengan passphrase
- Menghitung checksum buffer input menggunakan kunci tersebut
- Mengenkripsi kembali kunci itu
- Karena checksum adalah fungsi satu arah, input yang menghasilkan nilai khusus sulit dibalik secara langsung hanya dengan melihatnya
- Dalam pembaruan berikutnya, metalliczx dan SideQuark mengonfirmasi bahwa setelah dekripsi, strukturnya merupakan polinomial checksum CRC32 standar
- Karena itu, ada cara yang lebih efisien untuk mendapatkan nilai target dibanding brute force
Nilai input yang ditemukan lewat brute force Python
GYUGYUterdiri dari 6 huruf, dan kombinasi 6 huruf yang mungkin berjumlah26^6 = 308,915,776- Untuk 7 huruf jumlahnya naik menjadi 8 miliar kombinasi, dan 8 huruf mencapai 208 miliar kombinasi, skala yang cukup berat untuk laptop
- Implementasi Python memeriksa input dengan prosedur berikut
- Menyalin blok memori yang berisi buffer input yang belum diinisialisasi, passphrase, dan kunci
- Mendekripsi kunci dengan passphrase
- Memasukkan urutan 1~8 huruf ke buffer input
- Menghitung checksum dari tiap input
- Membandingkan hasil perhitungan dengan nilai target
- Seluruh kode dipublikasikan di gist
- Bahkan versi single-thread saja sudah menghasilkan output yang dibutuhkan, dan hasilnya muncul sebelum versi paralel selesai ditulis
Pemetaan yang ditemukan dan efek nyatanya
- Kolom terakhir pada hasil output menunjukkan kecocokan dengan nilai khusus tertentu
NNSET,SOCCER,ADEMVSSFsemuanya cocok dengan nilai yang sama dan membuka game sepak bola bonusAFTJSXOTmembuka semua stage sepertiGYUGYU
- Jika
SOCCER+XXXdimasukkan sebagai inisial, Bonus Game akan terbuka dan pemain bisa memainkan sepak bola bawah air- Ini mengatur bit
0x2pada flag di8c3ac00c
- Ini mengatur bit
EXBBERX+XXXmenampilkan Immortality Enabled pada layar Options- Saat aktif, pemain tidak akan tenggelam atau mati
- Ini mengatur bit
0x400pada flag8c3abe48dan bit0x4pada flag8c3abb00
QQRIQ+XXXmenampilkan framerate game dan beberapa nilai debuggingXYZZYX+XXXmenampilkan nilai jam saat ini- Kedua input tersebut mengubah nilai di alamat
8c35659cdan8c3565a4
- Kedua input tersebut mengubah nilai di alamat
- Efek
POPELY+XXXbelum berhasil dipastikan- Diduga dimaksudkan untuk mengaktifkan flag di
8c3b0e44, tetapi flag ini tampaknya hanya menampilkan pesan Cheats Enabled tanpa efek lain yang terlihat
- Diduga dimaksudkan untuk mengaktifkan flag di
1 komentar
Komentar Hacker News
Hash-nya hanyalah CRC32, tepatnya memakai polinomial ini (0x77073096, kodenya salah)
https://web.mit.edu/freebsd/head/sys/libkern/crc32.c
Integer yang didekripsi dalam tulisan itu adalah konstanta dari CRC32 ini. Jika tahu bahwa itu CRC32 dan mengetahui polinomialnya, jawabannya bisa dihitung mundur dalam waktu logaritmik, bukan waktu eksponensial, dengan memakai matematika modular pada ring polinomial
Katanya Binwalk mengenali tabel polinomial CRC; saya penasaran apakah tabel ini juga bisa ditemukan
Seseorang perlu mengintegrasikan Binwalk dan Ghidra. Keduanya sangat cocok
Saya penasaran apakah ada tips untuk mengetahui bahwa nilainya adalah hasil CRC32, atau polinomial/nilai awal yang digunakan
Saat Ecco orisinal keluar untuk Megadrive (Genesis), saya membelinya dengan seluruh uang yang susah payah saya kumpulkan. Gim itu luar biasa sulit, dan karena kesal saya duduk sepanjang sore dengan pena dan kertas, lalu entah bagaimana berhasil memecahkan sistem password-nya
Saya teleport ke level terakhir dan menyelesaikannya keesokan harinya, tetapi kemudian merasa bersalah karena menghabiskan seluruh harta saya untuk gim yang selesai dalam dua hari
Memecahkan sistem password dengan pena dan kertas itu menarik; kalau masih ingat sesuatu, saya ingin dengar lebih banyak
Secara filosofis, saya rasa itu tidak bisa disebut menamatkan gim tersebut
Anda melewati banyak level, dan hanya melihat sebagian dari konten, gameplay, serta cerita yang dimaksudkan. Gim, termasuk Ecco the Dolphin, pada umumnya lebih tentang perjalanan daripada tujuan. Anda melewatkan tema dan pengalaman seperti isolasi, berteman dengan kelompok luar, konservasi, perjalanan waktu, berinteraksi dengan dinosaurus, dan tentu saja perjalanan luar angkasa
Jadi sebenarnya tidak perlu merasa begitu bersalah
Meski begitu, level terakhir memang hebat. Saya penasaran apakah Anda terkejut saat melihatnya setelah melewati sebagian besar gim
Dengan cheat atau tidak, Anda mungkin satu-satunya orang di dunia yang pernah menamatkan gim ini
QQRIQ adalah bentuk singkatan fonetik dari “kukuriku”, dan dalam bahasa Hungaria serta beberapa bahasa lain berarti suara kokok ayam jantan. Contohnya ada “kukuryku” dalam bahasa Polandia dan “קוקוריקו” dalam bahasa Ibrani
Saya jadi penasaran seperti apa proses memilih password-nya
Gyugyu juga bisa jadi rujukan ke film Hungaria “The Fifth Seal”
“Bayangkan Anda akan mati dan bereinkarnasi sebagai salah satu dari dua orang. Seorang budak dan seorang tuan kaya. Budak itu disiksa oleh tuannya, kehilangan lidah dan satu matanya, serta istri dan anaknya juga dibunuh. Ia terus hidup sambil percaya bahwa dirinya orang baik, karena ia tidak pernah melakukan hal-hal mengerikan dan sadistis kepada orang lain seperti tuannya. Tuan kaya itu sama sekali tidak memiliki keraguan moral. Ia tidak menganggap perbuatannya salah, dan percaya bahwa budak itu memang pantas dihukum. Anda harus memilih apakah menjadi budak miskin tetapi benar, atau tuan kaya tetapi bejat.”
Gyugyu adalah nama budak itu
https://www.imdb.com/title/tt0075467
Karena programmer gim ini berada di Budapest, itu dugaan yang cukup masuk akal
Popely yang mengandung “ly” dalam bahasa Hungaria juga merupakan petunjuk
Dalam bahasa Prancis, bentuknya Cocorico, jadi sangat mirip
Saya juga teringat desa Kakariko di Zelda, yang selalu ada ayamnya
Sebagai tambahan menarik, pengembang Ecco, Ed Annunziata, saat ditanya tentang inspirasinya menjawab, “Saya tidak pernah memakai LSD, tetapi saya banyak membaca John C. Lilly.” Lilly dikenal atas karya perintisnya di bidang kecerdasan hewan, psikoterapi ketamin, tangki deprivasi sensorik, dan eksplorasi kesadaran
Nama “Ecco” adalah rujukan ke ECCO (Earth Coincidence Control Office) milik Lilly. John berhipotesis bahwa ada basis supranatural/alien di sisi jauh bulan untuk mengoordinasikan semua “kebetulan” di Bumi. Ia adalah salah satu orang pertama yang menyadari betapa cerdasnya lumba-lumba, dan begitu terobsesi mencari cara berkomunikasi dengan mereka sampai ia menenggelamkan separuh rumahnya di Karibia agar bisa tinggal bersama mereka. Itu baru puncak gunung es; kalau tertarik, saya sangat merekomendasikan autobiografinya, The Center of the Cyclone. Ia benar-benar sosok yang memesona
Saya penasaran apakah ada materi untuk mulai melakukan reverse engineering gim Dreamcast. Ada beberapa hal yang ingin saya coba dengan Skies of Arcadia, dan akan bagus kalau ada teknik yang lebih sistematis daripada “melihat nilai apa yang berubah di antara snapshot memori”
Untuk menemukan lokasi nilai di RAM, cara itu pada dasarnya cukup mendekati teknik standar. Dalam praktiknya cukup berhasil
Beberapa emulator seperti Dolphin memiliki alat semacam itu bawaan. Alat hacking gim lama seperti Gameshark untuk N64 juga memakai teknik yang sama lewat UI konsol. Saya tidak tahu apakah emulator Dreamcast punya alat seperti itu
Saya menulis artikel yang memakai teknik ini di Dolphin, dan artikel lanjutannya juga membahas hacking gim konsol dengan Ghidra: https://www.smokingonabike.com/2021/01/17/hacking-super-monk...
Saya pernah sedikit melihat gim itu. Trik utamanya adalah men-dump snapshot memori ke file lalu mengimpornya ke Ghidra. Ada banyak cara untuk melakukan dump, dan banyak orang menyukai Cheat Engine
Ghidra bisa menganalisis machine code prosesor SuperH secara native, jadi menjalankan analisis otomatis saja sudah akan memunculkan banyak fungsi
Dalam beberapa tahun terakhir saya jadi jauh lebih tertarik pada gim lama, dan entah ungkapan ini masuk akal atau tidak, rasanya jauh lebih berjiwa
Dan soal mobil itu menyedihkan. Terima kasih atas peringatannya; mulai sekarang saya tidak akan membiarkannya idle di driveway
Saya selalu penasaran harus mulai belajar reverse engineering dari mana. Kebanyakan orang menyarankan belajar assembly dulu, tetapi setelah itu tampaknya tidak banyak informasi konkret di internet
Entah apakah caranya hanya perlahan belajar pola-pola umum di x86, arm, dan platform arcade lewat coba-coba. Sulit menemukan diskusi online yang membahas detailnya
Dengan alat seperti Ghidra, kita bisa mencocokkan sumber sedikit demi sedikit, tetapi pada akhirnya tetap harus menalar dengan cara yang sama seperti saat memahami codebase yang asing. Bedanya kali ini tidak ada komentar sama sekali, meski cukup banyak juga proyek open source yang tidak memiliki komentar
Untuk contoh yang lebih mendekati dunia nyata, ada baiknya mencoba menyelesaikan http://microcorruption.com atau https://crackmes.one/
Secara pribadi, saya banyak belajar dengan mengutak-atik Cheat Engine. Dulu saya terutama memakainya saat kecil lalu tidak pernah melihatnya lagi, jadi saya tidak tahu bahwa ternyata alat ini jauh lebih kuat daripada yang saya kira
Disassembler-nya cukup bagus, dan karena kita bisa menulis apa yang disebut “assembly scripts”, ini bagus untuk mempelajari dasar-dasar patch memori dengan assembly x86. Dari situ, kita bisa mulai membuat utilitas sendiri untuk mem-patch game sesuai keinginan
Dengan Cheat Engine saja pun kita bisa mem-patch game dan membuat cheat yang benar-benar gila
Saya pernah belajar sedikit di sekolah, tetapi menjalankan video game yang saya ingat dari masa kecil selangkah demi selangkah dengan debugger mengajarkan ilmu komputer jauh lebih baik daripada apa yang saya pelajari di kelas
Ingin melihat video yang menunjukkan cheat sepak bola bawah air benar-benar berfungsi
Menarik bahwa game-game serupa mencocokkan checksum dengan konstanta integer. Pitfall: The Lost Expedition juga menggunakan cara yang sangat mirip: mengubah input tombol menjadi string ASCII dari tombol input, lalu menghitung CRC
Pendekatannya juga hampir berupa brute force dengan Python lalu membandingkannya dengan hash cheat yang diekstrak. Tabel CRC32 tersembunyi di dalam
decrypted_intsjuga terlihat. Tabel yang sudah dibuat sebelumnya terlalu mudah dicari. Alih-alih membuat tabel baru dengan polinomial sendiri, saya jadi bertanya-tanya mengapa tabel-tabel itu sering ditemukan dalam keadaan terobfuskasi untuk membuatnya lebih sulitMengejutkan ada blog yang berfokus pada Sega Saturn
Beberapa waktu lalu saya menemukan sebuah Saturn dan beberapa CD game kecil di lemari rumah orang tua. Saya tidak ingat pernah memilikinya, jadi saya menduga adik saya mendapatkannya setelah saya masuk kuliah. Bagaimanapun, saat saya coba sambungkan, semua game berjalan dengan baik. Namun selain itu, saya benar-benar tidak tahu harus melakukan apa dengannya. Tentu saja membuangnya bukan pilihan
Game-game itu sangat bernilai. Pada 2005 saya memberikan milik saya begitu saja, dan kalau sekarang melihat harganya di eBay, jantung rasanya berdebar
Nikmati saja dengan senang hati
https://terraonion.com/en/producto/terraonion-mode/