GhidraとPythonを活用した Ecco the Dolphin のリバースエンジニアリング分析
(32bits.substack.com)- Dreamcast向け Ecco the Dolphin: Defender of the Future には、セーブファイルのイニシャル入力で有効になる隠しチートがあり、既知の
GYUGYU+XXXに加えて複数の特殊入力も確認された - 分析では flycast のメモリスナップショットを Ghidra に読み込み、入力バッファと処理関数を特定し、変換結果が6つの特殊値と比較される構造を追跡した
- チート判定は入力文字列そのものではなく、パスフレーズで復号したキーとチェックサム計算を経た値で行われるため、単純に文字列を読む方法では見つけにくい
- Python の総当たりで1〜8文字の入力を調べ、
SOCCER、EXBBERX、QQRIQ、XYZZYX、POPELYなどがボーナスステージ、不死モード、FPS表示、時間表示と結び付くことを確認した - 同じ効果を生む入力は1つに固定されておらず、
NNSET、SOCCER、ADEMVSSFはいずれもボーナスサッカーゲームを開き、AFTJSXOTもGYUGYUのように全ステージを解放する
セーブファイル名で有効になる隠しチート
- Ecco the Dolphin: Defender of the Future は公式に発売された最後の Ecco ゲームであり、続編は中止された
- 既知のチートは、VMU 画面で New Game を選び、イニシャルに
GYUを入力したあと End を押さずに再びGYUと任意の3文字を入力する方法であるGYU GYU XXX形式で入力してからメニューを抜けると、Load game ですべてのステージを選択できる
- 確認された特殊入力と効果は次のとおり
GYUGYU+XXX: 全レベル解放SOCCER+XXX: ボーナスステージ解放EXBBERX+XXX: 不死モードQQRIQ+XXX: FPS表示XYZZYX+XXX: 時間表示POPELY+XXX: 効果不明
Ghidra で入力処理ルーチンを追跡
- flycast エミュレータのメモリスナップショットで、画面に表示されているイニシャルの一部が
8cfffb34バッファに保存されることを確認した - 入力を続けると、先に入れた文字が
8c3abf18バッファへ押し出され、この領域がチート判定に使われる - スナップショットを Ghidra に読み込んだあと、
8c0334d8位置の関数がそのバッファを読んでいることを突き止めた - この関数はバッファを変換し、その結果が6つの特殊値の一覧のいずれかに一致するかを調べる
GYU GYU XXXは9388D627に変換され、一覧の最初の特殊値と一致する
変換方式とチェックサム構造
- Ghidra の逆コンパイルで確認した変換関数の流れは次のとおり
- パスフレーズを読む
- パスフレーズで1024バイトのキーを復号する
- キーを使って入力バッファのチェックサムを計算する
- キーを再び暗号化する
- チェックサムは一方向関数なので、特殊値を生む入力を目視でそのまま逆算するのは難しい
- その後の更新で metalliczx と SideQuark が、復号後の構造が標準的な CRC32 チェックサム多項式であることを確認した
- このため、総当たりより効率的に対象値を得る方法が存在する
Python の総当たりで見つけた入力値
GYUGYUは6文字で、取り得る6文字の組み合わせは26^6 = 308,915,776通りである- 7文字では80億通り、8文字では2,080億通りまで増え、ノートPCでは負担の大きい規模になる
- Python 実装では次の手順で入力を調べた
- 初期化されていない入力バッファ、パスフレーズ、キーを含むメモリブロックをコピーする
- パスフレーズでキーを復号する
- 1〜8文字のシーケンスを入力バッファに入れる
- 各入力のチェックサムを計算する
- 計算結果を対象値と比較する
- 全コードは gist で公開されている
- 必要な結果はシングルスレッド版だけで出力され、並列版を書いているあいだにすでに結果が得られた
発見された対応関係と実際の効果
- 出力結果の最後の列は、どの特殊値にマッチしたかを示している
NNSET、SOCCER、ADEMVSSFはいずれも同じ値にマッチし、ボーナスサッカーゲームを解放するAFTJSXOTはGYUGYUと同様に全ステージを解放する
- イニシャルに
SOCCER+XXXを入力すると Bonus Game が開き、水中サッカーをプレイできる8c3ac00cのフラグに0x2ビットを設定する
EXBBERX+XXXは Options 画面に Immortality Enabled を表示する- 適用中は溺死も死亡もしない
8c3abe48フラグの0x400ビットと8c3abb00フラグの0x4ビットを設定する
QQRIQ+XXXはゲームのフレームレートと一部のデバッグ値を表示するXYZZYX+XXXは現在の時計の値を表示する- この2つの入力は
8c35659cと8c3565a4アドレスの値を変更する
- この2つの入力は
POPELY+XXXの効果は確認されていない8c3b0e44のフラグを有効化しようとしていたと推測されるが、このフラグは Cheats Enabled メッセージを表示するだけで、ほかの効果は見られない
1件のコメント
Hacker News のコメント
ハッシュは単なる CRC32 で、正確にはこの多項式(0x77073096、コードは間違い)を使っている
https://web.mit.edu/freebsd/head/sys/libkern/crc32.c
記事で復号された整数は、この CRC32 の定数群。CRC32 であることと多項式が分かれば、多項式環のモジュラー演算を使って、指数時間ではなく 対数時間で答えを逆算できる
Binwalk は CRC 多項式テーブルを認識すると聞いたが、このテーブルも見つけられるのか気になる
誰か Binwalk と Ghidra を統合すべき。両者は相性が良すぎる
値が CRC32 の結果だという点や、使われた多項式/初期値を見つけるコツがあるのか気になる
初代 Ecco が Megadrive(Genesis)で出たとき、苦労して貯めたお金を全部使って買った。そのゲームはとんでもなく難しく、腹が立って午後いっぱいペンと紙を手に座り込み、どうにか パスワードシステムを解読した
最終レベルへワープして翌日にクリアしたが、2日で終わらせたゲームに全財産を使ったという罪悪感に苦しんだ
ペンと紙でパスワードシステムを解読したというのは、覚えていることがあればもっと聞きたい
哲学的に見ると、そのゲームをクリアしたとは言えないと思う
複数のレベルを飛ばし、意図されたコンテンツ・ゲームプレイ・物語の一部しか見ていないことになる。Ecco the Dolphin を含め、ゲームはたいてい目的地よりも旅路が大事だ。孤立、アウトグループと友達になること、保全、タイムトラベル、恐竜との交流、そしてもちろん宇宙旅行といったテーマや体験を逃したわけだ
だから、そんなに罪悪感を覚える必要はなかった
それでも 最終レベルはすごかった。ゲームの大部分を飛ばして見たときに驚いたのか気になる
チートを使ったかどうかにかかわらず、このゲームをクリアした世界で唯一の人かもしれない
QQRIQ は「kukuriku」の音声的な短縮形で、ハンガリー語や複数の言語で雄鶏の鳴き声を意味する。ポーランド語の「kukuryku」、ヘブライ語の「קוקוריקו」などの例がある
パスワードを選ぶ過程がどんなものだったのか気になる
Gyugyu もハンガリー映画「The Fifth Seal」への参照かもしれない
「死を目前にしていて、2人のうちどちらかに生まれ変わると想像してみてほしい。奴隷と裕福な主人だ。奴隷は主人に苦しめられ、舌と片目を失い、妻と子どもも殺される。彼は自分を善人だと信じて生き続ける。主人のように恐ろしくサディスティックなことを他人にしたことがないからだ。裕福な主人には道徳的なためらいがまったくない。自分のしたことが間違いだとは思わず、奴隷は罰を受けるべきだったと考えている。貧しいが正しい奴隷になるか、裕福だが堕落した主人になるかを選ばなければならない。」
Gyugyu はその奴隷の名前
https://www.imdb.com/title/tt0075467
このゲームのプログラマーたちは Budapest にいたので、かなりありそうな推測だ
ハンガリー語の「ly」が入った Popely も手がかりだった
フランス語では Cocorico なので、とても似ている
ニワトリがいつも出てくる Zelda の Kakariko 村も思い出す
興味深い余談として、Ecco の開発者 Ed Annunziata は、インスピレーションについて尋ねられた際に「LSD をやったことはないが、John C. Lilly はたくさん読んだ」と答えている。Lilly は動物知能、ケタミン心理療法、感覚遮断タンク、意識探求の分野での先駆的な仕事で知られている
「Ecco」という名前は、Lilly の ECCO(Earth Coincidence Control Office)に由来する参照だ。John は、地球上のあらゆる「偶然」を調整するため、月の裏側に超自然的/地球外の基地が存在すると仮定していた。彼はイルカがどれほど知的かを早い段階で見抜いた人物の1人で、イルカとコミュニケーションする方法を突き止めることに執着し、カリブ海にある自宅の半分を水没させて一緒に暮らすまでした。これは氷山の一角にすぎず、興味があるなら彼の自伝 The Center of the Cyclone を強くおすすめする。本当に魅力的な人物だ
Dreamcast ゲームの リバースエンジニアリング を始めるのに良い資料があるのか気になる。Skies of Arcadia で試してみたいことがあるのだが、「メモリスナップショット間でどの値が変わるかを見る」より体系的な手法があるといい
RAM 上で値の位置を探すには、その方式が実質的に標準手法に近い。実際かなりうまく機能する
Dolphin のような一部のエミュレータには、そうしたツールが内蔵されている。N64 用 Gameshark のような昔のゲームハックツールも、コンソール UI で同じ手法を使っていた。Dreamcast エミュレータにそういうツールがあるかは分からない
Dolphin でこの手法を使った記事を書いたし、続編も Ghidra を使ったコンソールゲームのハックについての内容だ: https://www.smokingonabike.com/2021/01/17/hacking-super-monk...
そのゲームを少し調べたことがある。重要なコツは メモリスナップショット をファイルにダンプしてから Ghidra に取り込むこと。ダンプ方法はいろいろあり、Cheat Engine を好む人も多い
Ghidra は SuperH プロセッサの機械語をネイティブに解析できるので、自動解析を走らせるだけでも多くの関数が見えてくる
ここ数年、古いゲームにずっと強く惹かれるようになった。こういう言い方が通じるか分からないが、ずっと 魂がある 感じがする
それと車の件は気の毒だ。警告に感謝する。今後は私道に停めたままアイドリングしないようにする
リバースエンジニアリングをどこから学べばいいのか、いつも気になっていた。たいていはまず アセンブリ を学べと言うが、その後についてはオンラインに具体的な情報があまりないように見える
x86、arm、アーケードプラットフォームでよくあるパターンを、試行錯誤でゆっくり身につけていくものなのだろうか。細部を扱う議論をオンラインで見つけるのは難しい
Ghidra のようなツールを使えば、ソースを少しずつ突き合わせていけますが、結局は見慣れないコードベースを理解するときと同じやり方で推論する必要があります。今回はコメントがまったくないという違いがありますが、ソースが公開されているプロジェクトでもコメントがないケースはかなりあります。
より現実に近い例としては、http://microcorruption.com や https://crackmes.one/ を解いてみるとよいでしょう。
個人的には Cheat Engine をいじりながら多くを学びました。子どものころによく使っていて、その後見返していなかったので気づきませんでしたが、思っていたよりずっと強力なツールでした。
ディスアセンブラは十分に優秀で、「assembly scripts」と呼ばれるものを書けるため、x86 アセンブリでメモリパッチを行う基礎を身につけるのに適しています。そこから、自分の望むようにゲームをパッチする独自ユーティリティを作り始めることもできます。
Cheat Engine だけでもゲームをパッチして、とんでもないレベルのチートを作れます。
学校でも少し学びましたが、子どものころに覚えていたビデオゲームを デバッガで1ステップずつ実行してみることのほうが、授業で学んだことよりもはるかにコンピュータサイエンスを教えてくれました。
水中サッカーのチート が実際に動作する動画を見てみたいです。
似たようなゲームが固定整数でチェックサムを合わせる方式を使っているのは興味深いです。Pitfall: The Lost Expedition も、ボタン入力を入力ボタンの ASCII 文字列に変換してから CRC を計算する、非常によく似た方式を使っていました。
アプローチも Python でほぼ総当たりして抽出した チートハッシュ と比較するというものでした。
decrypted_intsの中に隠れた CRC32 テーブルも見えます。事前生成されたテーブルはあまりに簡単に検索できます。独自の多項式で新しいテーブルを生成するのではなく、難しくするために難読化された状態でよく見つかる理由が気になります。Sega Saturn に集中しているブログとは驚きです。
少し前に実家のクローゼットで Saturn と小さなゲーム CD の束を見つけました。自分が持っていた記憶はないので、大学に行ったあとに弟が手に入れたのだろうと推測しています。ともかく接続してみると、どのゲームも問題なく動作しました。ただ、それ以外にこれで何をすればいいのかはまったく分かりません。もちろん捨てるという選択肢はありません。
ゲームには ものすごい価値 があります。2005年に自分のものをそのままあげてしまったのですが、今 eBay で価格を調べると心臓が高鳴ります。
楽しんで遊べばいいです。
https://terraonion.com/en/producto/terraonion-mode/