ソースコードを見る方法

作成日時:2022/02/08(火) 19:17:45
更新日時:2022/02/08(火) 19:17:45

厳密に言うとソースコードではありませんが、サンシャインはC++で開発されたため、サンシャインの実行可能ファイル(main.dol)を用いてC言語のコードに変換すれば、ソースコードに近いコードを見ることができます。

準備

ソースコードを見るためには、サンシャインのISOを吸い出してmain.dolを抽出しておく必要があります。準備の手順はこちらの記事を参照してください。

Ghidraの導入

ソースコードを見る(Disassembleする)ためには、Ghidraというソフトウェアを使います。また、サンシャインといったGC/Wiiのゲームをより簡単に扱うためには、Ghidra-GameCube-Loaderという拡張機能が必要です。

2022/02/08時点では、Ghidraはバージョン10.1.1を使います。今後新しいバージョンのGhidraがリリースされる時、Ghidra-GameCube-Loaderが同じバージョンに対応しているか必ず確認してください。例えば、Ghidraの最新版は10.1.2で、Ghidra-GameCube-Loaderは10.1.1にしか対応していない場合、10.1.2を使うことはできません。

Ghidra

Releaseのzipファイルをダウンロードして解凍します。

また、Ghidraを実行するためには、JDK 11 64-bitが必要です。Windowsユーザでよく分からない方はこのファイルをダウンロードしてインストールしてください。

Ghidra-GameCube-Loader

これはGC/Wiiのバイナリ(main.dolなど)を読み込むための拡張機能です。

Releaseのzipファイルをダウンロードし、解凍せずに<Ghidra>/Extensions/Ghidra/の直下に移動します。

次に、<Ghidra>/ghidraRun.batをダブルクリックしてGhidraを実行します。
Ghidra
メニューのFile > Install Extensions...をクリックし、GameCubeLoaderにチェックを入れます。
Install Extensions
OKボタンをクリックしてGhidraを再起動します。

main.dol の読み込み

File > New Project...をクリックし、プロジェクトを作成します。Project TypeNon-Shared Projectで大丈夫です。

プロジェクトを作成したら、File > Import File...をクリックし、<SMS>/sys/main.dol(<SMS>/は抽出したサンシャインのフォルダ)を選択してインポートします。GeckoLoaderを使ってdolファイルを改変した場合は元のdolファイル(<SMS>/sys/main0.dolなど)を選択してください。

FormatやLanguageなどは自動的に検出されるので、そのままOKをクリックします。
Format

次に、Would you like to load a symbol map for this DOL executable? というメッセージが出るはずです。Yesをクリックし、<SMS>/files/mario.MAPを選択します。

Import Results Summary が出たら準備完了です。main.dolをダブルクリックしてプロジェクトを開きます。

New Plugins Found! というメッセージが出た場合、Yesを押してチェックを入れてインストールします。

次に、main.dol has not been analyzed. Would you like to analyze it now? というメッセージが出るはずです。Yesをクリックし、(GameCube/Wii) Program Analyzerにチェックを入れ、Analyzeボタンを押して分析を始めます。
Analyze

分析が完了したらこのようにC言語に変換されたコードが見れます。Ghidra

変換されたコードを読んで各変数の意味やclassの構造などを解読し、サンシャインへの理解を深めましょう。

付録

リソース

既に解読されたclassなどの情報はSMS RAM Mapでまとめられています。参考にしながら解読を進めることをお薦めします。

また、必須ではありませんが、PowerPCアセンブリやGeckoコードを学びたい場合は、Go From Noob to Veteran ASM Coderを参照してください。

参考文献

この記事はSMS ShoutWikiを参考にして作成しました。