見出し画像

久しぶりの解析日記

ご無沙汰をしておりました。
リアルにRTAに通常プレイ配信に色々しつつも解析自体はやっておりました。
が、目立った成果等がなかったのでnote更新はサボっておりました。

3行であらすじ

・筆者はPS1ソフトチョコダン2RTA走者
・なんか新技はねぇのか
・じゃぁ内部解析するしかねぇ

成果はないけど進捗あり

さて、今回筆を取ったのにも理由があるわけで。結論から述べると「ブレイクポイント」が使えるようになりました。
0から始めているもので、こうした基本的なことが出来るだけでも嬉しいのです。解析経験者からすればただの準備段階でしかありませんが、初心者なのだからこうしたところに喜びを感じてモチベーションを保っていきましょうぞ。そもそも趣味の側面もあるので成果に関係なく課題をクリアできたというところが嬉しいのです。

前回までは

BIOS吸出し、エミュレータ起動、メモリをいじる、メモリアドレスとゲーム内データの関連を調べる(メモリマップ)。ここまではなんとか分かる領域だった。
次いで、ごく一部の命令文を抜き出して、意味がほんのりと分かる
ここが前回のnote記事を書いた理由。とはいえ、書いてある命令文が局所的に分かったというだけであって、全体を通してだとか、結局のところゲームに対して変化を与えるクリティカルな部分はどこか、どこをいじれば命令の意味や値を変えられるかなどはまだまだ理解できていませんでした。
ここから更に前進するために「ブレイクポイント」が必要だと感じたので当面の目標に据えた次第です。

ブレイクポイントを求めて

そもそもブレイクポイントというのは
上から順に命令を実行しますよ、どこかの命令にブレイクポイントを仕掛けますよ、命令がそのブレイクポイントの場所に到達したらゲームを一時停止しますよ、という中断ポイントのことを指します。これの使用を実現するにあたり実に様々な手を施しました。

別のエミュレータを使ってみる

元々使っていたエミュレータはpsxfinというもの。debug > Monitor > r3000 からメモリの中を直接見たり書き換えたりする機能は有していますがブレイクポイント機能は無さそうだ。「この命令を実行しているとき、このレジスタ(変数)にはどんな値が入っているんだろう?」解析を進めていくとそんな疑問にぶち当たったので、今使っているエミュレータから離れて別のものを使ってみればそんな機能があるのでは?色んな記事を読み漁っていく内にそんな考えへとシフトしていきました。

使ったエミュレータ

NO$PSX , BizHawk , mednafen
BIOSは既に抽出済みだったのでセットアップは基本的に詰まることなく、起動までは早かったです。経験の賜物だ。
NO$PSX
正直そこまで使いこなせませんでした。けど、記事を書いている今、改めて触ってみると「なんかいけるのでは?」という匂いがしてきたので再度触るのも十分ありだと感じました。
BizHawk
どうやらPS1ではブレイクポイントが使えない模様。ただ、レジスタやメモリの値は目まぐるしく変化しているようなのでリアルタイムで値を監視するのに適した印象。さらにRAMsearch機能では差分のみを抽出したりもできるのでメモリマップも何も分からない時点での調査や新たな踏み出しには重宝しそうな機能がそろっている。
mednafen
一番可能性を感じたが結局はうまくいかなかった。要因として過度なCUI(キャラクタユーザインターフェース)であるということ。基本的にコマンド操作しか受け付けないし、PSコントローラーを差しての操作もできないのでエミュレータとしてゲームを動かすにしても難あり。しかしブレイクポイントの挙動は確認できた。メモリアドレスを直接指定してブレイクポイントを仕掛けるわけだ。やっている最中はうまくいっている実感こそなかったがちゃんと機能していた。後になってわかったことで、レジスタ名である「SP」と「GP」を見間違えていたから機能の正常挙動を実感できなかった。

最終的に

行き着いた先はIDA Proです。これはマルウェア(いわゆるコンピュータウイルス)を解析するときなんかに使われるもの(ディスアセンブラ)ですね。
後述するGhidraについて調べていた際に見かけた記事がありまして

むしろ私個人としては、GhidraとIDA Pro、この二者は似て非なるもの、別物と考えています。

https://netagent.co.jp/study/blog/hard/20190530.html

この、Ghidraと肩を並べるIDA Proとは何者だ?と調べたら、昔は有料版のみだったが今では無料版でもデバッガが使えるよということだったので試してみたところうまくいったという次第。
しかしこのIDA Proは日本人向けの解説が非常に少なく中学英語すらまともに出来ない筆者にとっては厳しい状況でしたがChatGPTが解決してくれました。
エラー内容やぶち当たっている問題をChatGPTに投げたところ解決のヒントをくれたというわけです。
その他にも、解析のヒントにならないかと買ってみた書籍にも気になるキーワード(attach)があったのでそれもChatGPTに投げてみたといった具合なんですね。AI様々です。

Ghidraについて

解析をされているローグライクゲーマーの方がいらっしゃって、その方とのお話でGhidraというものが上がって存在だけは認知していました。これもIDA Proと似ていてマルウェア解析に用いられるディスアセンブラです。ただ、Ghidraは現在デバッガ機能は有しておらず完全に静的解析に特化しているものといえます。実際にGhidraを使ってチョコボの不思議なダンジョン2のメモリをディスアセンブルしたことはありますが確かにfunctionごとにまとめてくれていたり逆コンパイラもしてくれてC言語のようなプログラムも表示されていました。ただ、筆者はC言語の経験が少なくあまり読み解くことができませんでした。なので有益なものには違いないのですが今の筆者には宝の持ち腐れといえるでしょう。

チートコードについて

筆者はチートというものをほとんど使ったことがありません。GBA時代のポケモンリーフグリーンでじしんのわざマシンを複製したくらいです。そのときはPAR(プロアクションリプレイ)の秘技コードを訳も分からず打ち込んでいただけでした。
チートを使って人やメーカーに迷惑を掛けるのは絶対にダメです。ただ、チートと解析はかなり密接に関わっているのでこれを紐解くのは非常に有益です。
チートで迷惑を掛けるのはダメ、というのは話せば長くなるので割愛しますが私的利用の範ちゅうにしておきましょうということです。

内容によってはクリティカルに命令の場所を指している

チートコードの内容は実に様々で、ステータス上昇系もあれば敵からのダメージをカットするものなどもある。ステータスを書き換えるようなものは書き換えたらそれっきりなので似たことはエミュレータを使ってメモリを直接改ざんすることで実現できる。そうも単純にいかないのが特定の命令時に割り入ったりするようなものだ。

デバッグルーム
D01032D0 0100
80106038 00FF
略…

https://blog.goo.ne.jp/touffu/e/20e114287491df5ccd09fa408db9d29e

上記はチートコードの例だが、Dから始まるメモリアドレスの値が0100hであれば8から始まるアドレスの値を00FFhに書き換えるといった命令となっている。
8から始まるアドレスは状況によりゲーム側が値を書き換えてしまうので一度書き換えたら「はい終わり」というわけにはいかない。とはいえ常に書き換え続けていると通常プレイもできなくなってしまうのでそれはそれで問題が発生する。だから「この状況に限り書き換える」という条件が設けられている。
ここまでは単にチートコードの解説だが、前述した通りメモリアドレスを直接書き換えれば同じこともできる。つまり、チートが取り扱うアドレスは最小限の書き換えポイントなのでそこにアタリをつけて解析を進めることもできる。もちろん先人が色々試行錯誤した結果そのチートコードが生まれているので先人の後追いにかなってはいないが。とはいえ末端的なチートコードから一歩踏み込んで解析の領域が見えてくるのは良いことだ。多くの命令がひしめく中、どこにあたりをつければ良いか?迷ったのであればチートコードを頼りにすれば良い。これは「チートは悪」という固定観念のせいで遠回りこそしてしまったがワタシなりにたどり着いたひとつの解だ。


この記事が気に入ったらサポートをしてみませんか?