0から始めた内部解析
趣味から始めたプログラミングが回りに回ってゲームの内部解析に手を出したお話です。修正を入れてカッチリしたものにするか雑多な日記にするか分かりませんが書き連ねます。
知識というよりは解析をするにあたってのプロセスに焦点をあてた記事内容です。
本音と建前
記事にする理由ですが、どこかの国では「飢えた人には魚を渡すのではなく魚を獲る術を渡しましょう」ということわざがあるそうです。素敵だと思います、この考え。
昨今は調べれば大抵の情報は得られる時代です。最終的に欲しい結果がすぐに返ってくるワケです。なので最近に必要なのはググり力、とも言われそうですが「何を調べれば良いか」「何を知りたいか」「何が分からないか」こういった過程、プロセスの部分はあまり教わることもないだろうし自分自身のセンスが大きいかもしれません。ワタシが「分からないもの」に対して「どのようなアプローチ」を仕掛けていくか、色んな角度から楽しんだり学びの肥やしにしていただければと思います。
単純に自分用の備忘録とも言います。
ゴールと準備
手段と目的を履き違えてはいけません。何か実現したい目的があって内部解析という手段に手を着けたワケです。
実現したいこと
チョコボの不思議なダンジョン2というPS1ソフトにおいてバグ技や任意コード実行、RTA風に言えばグリッチを開発できないか。それを使ってRTAをより簡単に速く走破できないか。コレです。
準備したこと
実機やDL版で配信を行っていたのでその辺りの機材は元々ある状態です。
・エミュレータ(psxfin)
・解析の知識
・先人の解析記事収集
エミュレータを起動させるまででもかなりの悶着がありました。別記事で奮闘記を書いております。
取り掛かり
記事にするにあたってこの辺りはカットされることが多いでしょう。なので敢えてこの部分を細かく書きます。
内部解析のやり方
中学生みたいな検索文字列ですがこういったところからスタートしました。まず内部解析をするにあたって必要なものは何か。おおよそ、PCとエミュレータがあり、対象ソフトを起動させられれば問題なさそうです。その他フリーソフトを落としてくると、よりスムーズな解析にこぎつけるようです。
筆者が調べている内に目を付けたのはps2disです。公式からのダウンロードは既に出来なくなっていたのでuploaderに上がっているものから拝借しました。
解析に必要な知識を仕入れる
解析するにあたって英数字の羅列との対峙は避けられません。調べたら必ず出てくるしこの英数字の意味を紐解かなければなりません。16進数と呼ばれるものです。ポケモン個体値でVという呼称を知っているのでその辺はスルーできます。ただ、メモリとかアドレスとかふわっと分かりそうなものからレジスタとかストアとか聞きなおしたくなるようなものにも出くわします。この辺りの用語の意味をしっかりおさえておく必要がありそうだなと気付きだします。
機器や言語
PCの心臓部はCPUです。計算の速さだとかで引き合いに出されることの多いアレですね。ゲームの心臓部もCPUです。PS1ではr3000というCPUが使われているそう。小さい頃からPS1には触れてきましたがr3000なんて単語初めて聞きました。そりゃそうだ。しかし調べていけば必ずと言っていいほどこうしたハードの知識ともぶつかるんですね。
そして、多くのwebプログラマーに馴染みのあるプログラミング言語(高級言語)とは異なるアセンブリ言語の存在。昔はそれで書いていた凄腕プログラマー達が居たらしい、と歴史として認知していましたが身近なものになってしまいました。機械が把握するための機械語であったりバイナリエディタであったり。それに変換する為のアセンブラ言語であったり、そもそものPS1やゲームを解剖して知っていく必要がありそうです。
r3000でのプログラムとは
畑は違えどプログラマであるワタシはどういった書き方なのか知りたくなりました。が、想像以上に難しい。そりゃそうです。なんといってもプログラミング「言語」ですから、日本語が喋れるからといってスペイン語が流暢に喋れるわけではありません。ちなみに、PHPとRubyは似てるじゃん、と思われている方に言うなればアレらは日本語の話言葉と日本語の手話のような関係です。片方を知っていればもう片方もさほど難なく習得できるそんな位置づけです。
実際にエミュレータで中身を覗いてみる
エミュレータを起動させるまでに紆余曲折あったので空いた時間で上記のような知識面を調べてきました。とはいえ思ったような成果は見られず。そんな折、エミュレータを起動できたのでさっそく中身たる「メモリ」を覗いてみました。
まぁ分からん。
先人の記事から得た情報を基に見てみてもどうにも情報が合致しない、噛み合わない。このままだと八方塞がりだ、切にそう感じました。航海途中で方角を見失った船乗りのようです。
情報を合致させるため
何も分からない、知識もロクにない。そんな状態なので教科書といえる存在やよりしろとなる情報が欲しかったんです。なので先人の記事と自分の見ているメモリ情報が噛み合わないことで焦りました。
ここで頼りにした情報は「HPは最大値だったら△△って値になるよ」という内容です。今までワタシが合致しないと嘆いていたのはメモリの「住所」が合致しないということです。
「HPは〇番地にあるよ」
『え?こっちの〇番地はさら地なんですが』
そんな情報の錯綜があたので
「HPが最大のときは△△さんって人が住んでるんだよ」
『じゃぁ役所にいって△△さんの住所訊いて片っ端から訪問します』
結果を言えばこれでうまくいきました。ようやくメモリの海において方角が分かり、自分が海図上のどこに居るかを把握できたのです。でもってこのような記事を書くに至っているワケです。
今後の方針
方角や現在地を得ることができました。しかしこれでは正しく健やかにエミュレータで楽しむだけです。直球の言い方をすれば、やりたいことは仕組みを理解して健全に「悪さ」をすることです。
メモリの海をもう少し調べたら今後はプログラムの流れを追います。
海水は温められると蒸発して雲、雨となり山、川に流れて海に戻ります。海には波があって満潮や干潮もあります。このような流れがメモリ、データにもあるワケです。それを利用して本来あり得るはずのない塩分濃度の雨を降らしたりずっと満潮状態にするとか、そういったことを狙う為にも全体の流れを知ることはとても大事なのです。
最後に
まだ筆者自身の知識が未熟なためお勉強の教材になるようなものはまだ提供できません。あくまで分からないものに対して、先が見えないものに対してどんなアプローチを試していったのかというのをお伝えできればといった次第です。
調べる→ダメ(分からない)→調べる→いけそう?→試す→成功→次の課題…
成功にこぎつけるまでに何度も調べる工程を繰り返すかもしれませんがこういった地道な作業はトライアンドエラーですね。
内容上省きましたが、筆者が成功に行きつけたのも道中ぐるぐる色んなサイトでr3000だったりバイナリデータのお作法のパターンを見てきて「ひょっとしてこうではないか」という仮説を立てられたから、というのも大きいです。総合的であったり広い範囲の知識を必要とする場合何がフックとなって解決に結びつくか分かりません。ケースバイケースではありますが調べた情報を分からない、不必要だと一蹴する前に理解だけはしておく、それによって救われる自分が居るかもしれません。
この記事が気に入ったらサポートをしてみませんか?