なるほどえたきちのブログじゃねーの

チラ裏雑記帳

ポケモン過去作の解析とか乱数調整とかそこら辺。不定期更新。

【FRLG/Em】GBA版ポケモンの解析・ハック

はじめに



この記事はPokémon Past Generation Advent Calender 2019 14日目の記事です。

恐らくはじめましての方の方が多いと思うのでまずは自己紹介から入ろうと思います、ぼんじりと申す者です。
普段は3世代のROMハック界隈でASMハックやROM編集ツールの開発等を行っています。
要するに極悪違法改造厨なので苦手な方はブラウザバックをお願いします。

FRのハックロムである某ットモンスタープロキオン/デネブにASMハック(具体的には拡張PCボックスや新仕様のポケモン図鑑等)の提供をしていたりするので遊んだことのある方ならどういうことをしているオタクなのかある程度は想像つくかもしれません。
私自身は乱数勢でも何でもないのですが、ポケモン最新世代についての記事なら何でも良いと言われたのでこの度寄稿させて頂きました。

というわけでGBAポケモンの解析環境やハックの流れ等について大雑把に纏めてみようと思います。
どうでもいいですがこの文章を書いている時点で13日の22時だったので非常に焦りながら書いています。

解析・ハックに使用するツール類



解析するだけなら必要なツールはあんまり多くありません。
極論言ってしまえばエミュとバイナリエディタで全てを完結させることも可能なのですが、それでは効率があまり宜しくないのでハック界隈で良く使われる(多分)便利なツールを纏めます。

コンパイラ


devkitPro

プログラム周りのハックを行う上では非常に重要です。
asm,cで記述したソースコードコンパイルしてGBAで実行可能なバイナリデータに変換する為の開発環境です。

エミュレータ


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というアドレスが引っ掛かります。
これが『つづきから はじめる』テキストの読込先アドレスです。
f:id:BZL:20191213233612p:plain

表示されるテキストの参照を変える為にはこの読込先アドレスを特定し、そのアドレスを指定したポインタを改変する必要があります。
今回は0x083dd22aを指すポインタを変更したいのでバイナリエディタを使用して『2A D2 3D 08』でサーチします。
f:id:BZL:20191213234307p:plain
f:id:BZL:20191213234656p:plain
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

以上で導入作業は終了です。
f:id:BZL:20191214000201p:plain
実際に起動してみると初期Seedがバッチリ可視化されていますね。
画像認識やキーマクロと組み合わせれば初期Seed集めがかなり効率化されると思います。
実際に実機で動かす場合は海賊版カートリッジに焼くか、EzOmega等のマジコンを使用すれば実際の市販カートリッジと同様に動作させることができます。

今回作ったハックの差分パッチはこちらに投稿しておきます。
https://ux.getuploader.com/BZL/download/186

最後に



ハック勢、乱数勢問わず『解析関係に興味はあるが何から手を付ければ良いか分からない』という方は相当数いるかと思います。
今回私が投稿した記事がそのような方々の助けになれば幸いです。
色々と稚拙な文章でしたが、ここまで読んで頂きありがとうございました。


次回の担当は剣心氏です。