はじめに
この記事はPokémon Past Generation Advent Calender 2019 14日目の記事です。
恐らくはじめましての方の方が多いと思うのでまずは自己紹介から入ろうと思います、ぼんじりと申す者です。
普段は3世代のROMハック界隈でASMハックやROM編集ツールの開発等を行っています。
要するに極悪違法改造厨なので苦手な方はブラウザバックをお願いします。
FRのハックロムである某ットモンスタープロキオン/デネブにASMハック(具体的には拡張PCボックスや新仕様のポケモン図鑑等)の提供をしていたりするので遊んだことのある方ならどういうことをしているオタクなのかある程度は想像つくかもしれません。
私自身は乱数勢でも何でもないのですが、ポケモン最新世代についての記事なら何でも良いと言われたのでこの度寄稿させて頂きました。
というわけでGBAポケモンの解析環境やハックの流れ等について大雑把に纏めてみようと思います。
どうでもいいですがこの文章を書いている時点で13日の22時だったので非常に焦りながら書いています。
解析・ハックに使用するツール類
解析するだけなら必要なツールはあんまり多くありません。
極論言ってしまえばエミュとバイナリエディタで全てを完結させることも可能なのですが、それでは効率があまり宜しくないのでハック界隈で良く使われる(多分)便利なツールを纏めます。
エミュレータ
VisualBoyAdvance-1.7.2
定番中の定番GBAエミュですね。
かなり古いものなので動作速度の再現性等に少々難があったりします。
ソフトウェアとしての安定性はピカイチです。
1.8以降のものもありますがブレークポイントが上手く機能しないので解析作業には向いてないと思います。
DL:https://ja.osdn.net/projects/sfnet_vba/downloads/VisualBoyAdvance/1.7.2/VisualBoyAdvance-1.7.2.zip/
VBALink
エグゼの熱帯等で使われるエミュです。
通信周りの処理やメモリの挙動を調べる時に使ったりします。
挙動がかなり不安定なのでデバッグがしたいだけならAndroidのMyBoy,又は実機で動作確認する方が楽です。
DL:https://web.archive.org/web/20150515221127/http://vbalink.wz.cz/#download
VBA-RR
TAS用エミュです。
音ズレの無い録画機能、LUAの実行といった強力な機能を備えているだけでなく、エミュとしての再現度も結構高いです。
ブレークポイントを踏むとバグるという欠点さえなければVBA1.7.2は完全に御役御免だったと思います。
DL:https://code.google.com/archive/p/vba-rerecording/
NO$GBA
エミュとしての再現性は終わってますがデバッガが非常に優秀です。
正直VBA1.7.2とこれだけあれば充分な気がします。
DL:http://problemkaputt.de/gba.htm
バイナリエディタ
Stirling
多分恐らく全人類が使っている超定番バイナリエディタです。
あなたのPCにもきっと入ってるはず。
事実機能性は他のバイナリエディタの追随を許しません。
バイナリエディタはこれ一つあればまあ充分だと思います。
DL:https://www.vector.co.jp/soft/win95/util/se079072.html
HxD
海外コミュニティで主流のバイナリエディタです。
というか海外勢でこれ以外のエディタ使ってる人見たことない。
GBA解析に関わる機能に絞って見ればStirlingに勝っている所が外部コピペ可能な所くらいしかないように思える…
海外でバイナリハックがクソとか言われてる原因の6割くらい占めてそうな機能性なのでメインで使うのはあまりおすすめしません。
DL:https://mh-nexus.de/en/hxd/
ValzHex
私が作ったバイナリエディタです。
StirlingのUIをベースに色々機能追加した感じになってるような気がしますがバグが多そうなのであまりおすすめしません。
DL:https://drive.google.com/drive/folders/1lL0zZ36J-qfxvkprHSRcb9GNSRXGmuro?usp=sharing
画像編集ツール
GBAGE
画像抽出に関して言えば最強です。
書き込みも可能で尚且圧縮効率がunlz並に良いので画像関係全部これで良いのでは?と思われるかもしれませんが実機BIOSで扱えないバイナリデータを書き込んでくれるので導入には絶対に使用しないでください。
DL:https://forums.serenesforest.net/index.php?/topic/26913-nintenlords-hacking-utilities/
GBAGC
私が作った画像導入ツールです。
unlzと同程度の圧縮効率とGBAGE並の書き込みオプション数を実現できていると思います。
画像周りはこれ一つで大体完結しそうな気がします。
DL:https://drive.google.com/drive/folders/1BYcA2h4yLCRUaBli6ari1AgcXwacPFsE?usp=sharing
スクリプト編集ツール
XSE
海外製スクリプト編集ツールです。
日本語に対応していません。
DL:https://github.com/Gamer2020/Unofficial_XSE/releases
PKSV
海外製スクリプト編集ツールです。
日本語に対応していません。
DL:https://sourceforge.net/projects/pk-script-view/
ScripTEditor
日本製スクリプト編集ツールです。
スクリプトのフォーマットを外部ファイルで管理しているので自作スクリプトの定義を追加したりできます。
AM連携に対応していません(割と致命的)。
DL:http://seelog.nobody.jp/Pokemon_Hack/SoftWare/ScripTEditor.html
音楽編集ツール
Sappy2006mod17.1
ROM内のBGMを試聴したり自作BGMを書き込んだりできるツールです。
音楽周り詳しくないのでそれ以上に説明することがありません。
DL:https://u3.getuploader.com/pkkai/download/136
VG Music Studio
試聴に関しては最強です。
BGMをwav出力できたりもします。
DL:https://www.pokecommunity.com/showthread.php?t=409327
voicetable_check
私が作った音源移植ツールです。
完全に自分用に作ったお遊びツールだったのですが公開して欲しいとの声があったので公開しました。
適当に作っているだけあって使いづらさMAXなのでれどめには必ず目を通してください。
DL:https://drive.google.com/drive/folders/1YsU7Jhs4oOVx7mC5zyGpUoKHq2tsi6sd?usp=sharing
Cry Editor
海外製の鳴き声編集ツールです。(鳴き声が音楽関係のアレソレであるかはともかく)
DL:https://drive.google.com/drive/folders/1cjZjAsuUVHz-tTX_5hPECp4cgMZZfUzw?usp=sharing
その他用途が限定的なツール
AdvanceMap 1.92
超定番マップ編集ツールです。通称AM
マップ構造からエンカウントテーブルといったマップに直接紐付けられたデータの他、XSE等と連携することでNPCのスクリプトも見られます。
DL:http://ampage.no-ip.info/index.php
pokemon_Synthesis
ポケシンセと呼ばれることが多いです。
ポケモンの種族値やタイプといった種族情報、ポケモン画像、トレーナーデータの編集等ができます。
DL:https://ux.getuploader.com/hackwiki/download/13
PTE
テキストのバイナリ変換/導入がメインのツールです。
PDCでは対応していなかった漢字の読込にも対応しているので漢字パッチ導入環境の場合はこちら一択になります。
DL:https://ux.getuploader.com/freehack/download/165
PokeDataGenerator
手持ちポケモンデータを作成するツールです。
ボール拡張やポケモン枠拡張のような各種拡張系ハックの殆どに対応済みです。
DL:https://drive.google.com/drive/folders/1MBXTjRU5Y59ld5n1mt1_vJ-zIiaobtwG?usp=sharing
結構適当に纏めたので抜けはあると思います。
改めて見ると使うツールが多すぎる…
実際に適当なハックを作ってみる
前日眼鏡ポッポ氏が投稿した記事に『どなたか日本版FR-20集めてください。』とのコメントがあったので試しに初期Seed集め補助用のプログラムを組んでみようと思います。
ちゃんとFR-20(BPRJ1.0)用です。
初期Seedを集めるにあたって実機を利用することが大前提になると思うので、がいと氏やトノ氏が使用しているBot環境が必要になると思います。
Bot環境を利用する場合、画面内に初期Seedにあたる文字列を表示させることができれば画像認識等で簡単に取得することができるはずなので、今回は『初期Seed決定後のつづきからはじめる画面に初期Seedを表示させる』ハックを制作します。
この挙動を実現するにあたって必要な作業をリストアップしてみます。
①初期Seedの数値を取得、文字列変換
②つづきからはじめる画面内の何れかのテキストの参照を変更し、①を読むようにする
たったの2つなのでかなり少ないですね。(残り時間1時間しかないのでまあまあ妥当ではある)(現在時刻23時)
というわけで①の内容を実現するための処理を組んでみます。
言語はCです。
#include "lib/gba_types.h" #include "lib/gba.h" #define seed ((u16*)0x02020000)[0x0] #define ram ((u8*)0x0203D000) ROM_DATA void main() { u8 seedbit; //16bitのデータを4bitずつに分けて文字列変換する for (u8 i = 0; i < 4; i++) { //4bit抽出 seedbit = (seed >> (i * 4)) & 0x0F; //変換 if (seedbit < 0x0A) { //数字 seedbit += 0xA1; } else { //A-Fの英字 seedbit += 0xB1; } //変換した文字の代入 ram[3 - i] = seedbit; } //終端文字の設定 ram[4] = 0xFF; }
めちゃ雑ですが取り敢えずこの処理を通せば0x02020000に記録された初期Seedが文字列に変換されて0x0203D000に展開されるようになります。
次は②の参照先の変更を行います。
今回は『つづきから はじめる』の文字を初期Seedの変換後テキストに差し替えます。
まずはPTEを起動し、左側のテキストボックスに『つづきから はじめるΩ』と入力します。(Ωは終端文字)
『オフセットの検索』ボタンを押すと0x3dd22aというアドレスが引っ掛かります。
これが『つづきから はじめる』テキストの読込先アドレスです。
表示されるテキストの参照を変える為にはこの読込先アドレスを特定し、そのアドレスを指定したポインタを改変する必要があります。
今回は0x083dd22aを指すポインタを変更したいのでバイナリエディタを使用して『2A D2 3D 08』でサーチします。
2箇所ヒットしたので両方共[2A D2 3D 08]→[00 D0 03 02]に置換します。
当然ですがこの置換だけでは0x0203D000に値が代入されず、テキストが表示されないのでどこかしらに①で組んだ処理を埋め込む必要があります。
今回改変した領域は2箇所共関数0xC1A0にあたる箇所なのでこの関数の先頭に変換処理を埋め込みます。
ROM内の処理に直接挟み込む為、ARM7TDMIコアのアセンブリ言語を使用します。
処理の内容としては関数0xC1A0の頭を0xB00000へのジャンプ文に変更し、0xB00000で本来の処理と0xB00100に埋め込んだ①の処理を実行させてから元のアドレスにジャンプする、といったものになっています。
.thumb .org 0xC1A0 ldr r1, =0x08B00000 mov pc, r1 .ltorg .org 0xB00000 push {r4-r7, lr} mov r7, r8 push {r7} sub sp, #0x10 mov r5, r0 ldr r4, =0x08B00100 bl linker mov r0, r5 ldr r1, =0x0800C1A8 mov pc, r1 linker: mov pc, r4 .ltorg
以上で導入作業は終了です。
実際に起動してみると初期Seedがバッチリ可視化されていますね。
画像認識やキーマクロと組み合わせれば初期Seed集めがかなり効率化されると思います。
実際に実機で動かす場合は海賊版カートリッジに焼くか、EzOmega等のマジコンを使用すれば実際の市販カートリッジと同様に動作させることができます。
今回作ったハックの差分パッチはこちらに投稿しておきます。
https://ux.getuploader.com/BZL/download/186
最後に
ハック勢、乱数勢問わず『解析関係に興味はあるが何から手を付ければ良いか分からない』という方は相当数いるかと思います。
今回私が投稿した記事がそのような方々の助けになれば幸いです。
色々と稚拙な文章でしたが、ここまで読んで頂きありがとうございました。
次回の担当は剣心氏です。