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

チラ裏雑記帳

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

【SwSh】ポケモン剣盾 レイド乱数調整用ツール SW Seed Calculatorの使い方

ツール作るだけ作っておいて使い方の解説を全くしていなかったので一応纏めておきます。

2020/02/27 追記
v3.00以降からツールの仕様が色々と変わったので加筆修正


1)ダウンロード



必要動作環境(普通にPCを使っていれば勝手に環境整っていると思うので上手く動作しなかった場合に確認するくらいでよいと思います。)

任意オプション

  • グラフィックボード
    • Seed検索でGPGPUを利用できます。GeforceRadeonで動作確認しています。
  • 8denSearch
    • 夜綱氏制作のリスト表示&消費数管理ツールです。本ツールの保存ファイルとの互換性があります。
バージョン 更新日 DL 更新内容
SW Seed Calculator v5.04 2022/03/22 Download CUDA Tool Kitの更新
世代の古いCPUで動かない可能性があったのを修正
SW Seed Calculator v5.03 2021/04/21 Download 起動処理の微修正
巣穴データベースの更新
SW Seed Calculator v5.02 2020/11/28 Download 起動処理の微修正
SW Seed Calculator v5.01 2020/11/26 Download プロファイル周りの不具合を修正
計算した個体値が出力されないことがあったのを修正
SW Seed Calculator v5.00 2020/11/23 Download カンムリ雪原の巣穴データ追加
プロファイル仕様変更
一部バグ修正
SW Seed Calculator v4.02b 2020/07/13 Download 連続で異なるseedを計算すると結果が出ない可能性があったので修正
再計算回数の上限を30に変更
SW Seed Calculator v4.02 2020/07/13 Download 日付の指定ができるように変更
Seed検索アルゴリズムの最適化
3連続個体値検索をオプションで使用可能に変更
一部バグ修正
SW Seed Calculator v4.01 2020/06/22 Download 個体値の入力補助機能の調整
一部バグ修正
3連続個体値検索を封印(機能自体は残っています)
SW Seed Calculator v4.00 2020/06/22 Download ヨロイじまの巣穴データ追加
Seed誤検出の対策機能追加
個体値入力フォームのバグ修正
英語版のバグ修正
SW Seed Calculator v3.10 2020/06/18 Download ポケモンの種族データ追加
SW Seed Calculator v3.09 2020/06/08 Download 説明書のミス修正
SW Seed Calculator v3.08 2020/06/06 Download 起動時に特性が正しく読み込まれていなかったのを修正
ミントのバグを修正
取扱説明書追加
SW Seed Calculator v3.06 2020/04/10 Download 特定の状況においてSeed計算が正しく行えていなかったので暫定対応
個体値計算機にミント使用のチェックを追加
SW Seed Calculator v3.05 2020/03/21 Download 夢固定スロット対応
ツールの更新チェック追加
その他色々変更
SW Seed Calculator v3.04f 2020/03/16 Download 一部環境で起動しない問題に暫定対応
3連続個体値検索に対応(NVIDIAGPUのみ、非常に時間が掛かる為非推奨)
中断処理の挙動を少し改善
その他色々変更
SW Seed Calculator v3.03 2020/02/28 配布停止 夜綱氏制作の8denSearchとの連携機能追加
巣穴選択GUIを追加
ポケモンの種族から巣穴を検索できるように
検索速度向上
CPUから4連続個体値での検索ができるように
その他色々変更
SW Seed Calculator v2.04 2020/01/16 Download Seed検索処理の高速化
4日目1体のみでも検索できるように
夢固定対応
SW Seed Calculator v2.03 2020/01/14 配布停止 Seed検索処理の最適化・バグ修正
個体値パズル処理のバグ修正
特性リスト取得時のバグ修正
SW Seed Calculator v2.02 2020/01/14 配布停止 イベントレイド対応
Seed検索処理のバグ修正
個体値パズル処理のバグ修正
英語OSで起動できない問題修正
SW Seed Calculator v2.01 2020/01/13 配布停止 個体値計算機がいつの間にか色々バグってたので修正
SW Seed Calculator v2.00 2020/01/13 配布停止 GPUを使用した計算処理に対応
巣穴リスト表示に対応
個体値パズル機能の最適化
計算処理の最適化

2)ツールの初期設定


  • ①. ツール起動後、『編集』ボタンをクリックしてプロファイル作成フォームを開く。

  • ②. TN、ROMのバージョン、バッジの数を入力してからセーブデータを登録する。
    • Seedとバッジの数は後から変更できる。
    • 保存されたプロファイルは夜綱氏制作のツール『8denSearch』のものと互換性があるので、『セーブデータ管理->プロファイルの参照ディレクトリを変更』から保存先を揃えておくと連携しやすい。
    • 保存されたプロファイルはツール終了時に更新しているが、『プロファイルの保存』からでも更新できる。


3)Seedの特定作業


目的のポケモンが出現する巣穴を調べる
  • ①. 『巣穴マップを開く』ボタンをクリックすると巣穴選択フォームが起動するので、狙いたいポケモンの種類を入力して『巣穴を検索』ボタンをクリックする。
  • ②. 巣穴のリストが表示されたら、適当な巣穴の項目をダブルクリックするとその巣穴が選択される。
    • リストが表示されない場合はゲームの進行状況が出現条件を満たしていないか、そもそもレイドに出現しないポケモンを選択している可能性がある。
  • ③. 『巣穴を決定』ボタンをクリックして巣穴を確定する。


4日目(1体目)の個体情報を調べる
  • ①. 最後にセーブした所から日付バグを3回行い、4日目のポケモンを捕獲する。(この際、捕獲するポケモンは1~3vの個体にすること)
    • この際、出現したポケモンが4v以上の場合はもう1度この手順を行う。
  • ②. 個体値を調べ、ツール左端の『4日目』の個体値入力欄に個体値を入力する。
    • 種族と性格を入力した後、『個体値計算』をクリックすると個体値計算機が起動する。
    • ツール内蔵の個体値計算機で個体値を確定させた後、『結果を出力して終了』を押せば個体値が自動的に入力される。
    • この際に特性等の他のパラメータも入力する。
    • ここで特定した個体値のV数が事前に調べていたV固定数と異なる場合、自然発生Vが混じっているので計算不能となる。
      この場合日付変更バグを1回行い、セーブしてから再度①に戻る。
    • 『利用できない個体値です』と表示された場合日付変更バグを1回行い、セーブしてから再度①に戻る。


4日目(2体目)の個体情報を調べる
  • ①. リセットし、最後にセーブした所から日付バグを3回行い、4日目にツールで指定された固定V数のポケモンが出るまで繰り返す。
    • 例として、『4V->6連 3V->5連』と表示された場合は4V又は3Vのポケモンが必要となる。このケースの場合は4Vの方が得られる連続個体値数が多くなるのでこちらを使用するのが望ましい。
    • 『1日目のみで検索可能です』と表示されている場合2体目を入力しなくても検索可能だが、得られる連続個体値数が少なくなるのでPCスペックによっては2体目を用意した方が良い。
  • ②. 個体値を調べ、ツール左端の『4日目(2体目)』の個体値入力欄に個体値を入力する。入力内容に誤りがなければツール左下の『連続個体値』欄に自動で値が入力される。
    • この際に特性等の他のパラメータも入力する。
    • 使用する個体値計算機は日付に合わせたものを使用する。
    • もしここで値が入力されない場合、V固定数が間違っているかツール側の不具合なので、後者の場合は自分で値を入力する。
      (個体値パズルについては夜綱氏のnoteを参考にすると分かりやすい)
5日目以降の個体情報を調べる
  • ①. リセットし、最後にセーブした所から日付バグを4回行い、5日目のポケモンを捕獲する。(この際に捕獲するポケモンのV固定数は問わないが少ないV固定数の方が候補を絞り込めるので効率がよい)
  • ②. 個体値を調べ、『5日目』のパラメータ入力欄に個体値、性格、特性、個性を入力する。
    • 『6日目の個体情報を使用する』を有効にしている場合は6日目の個体情報も同じように入力する。
      (この際に捕獲するポケモンのV固定数は問わない)
  • ③. 左下『最下位bit計算』をクリックすると個性に合わせてEC(暗号化定数)最下位bitが計算される。
    • 個性、個体値によっては計算できないこともあるが、そのまま操作を続行して差し支えない。
  • ④. 検索補助オプションを自分の環境に合わせて設定する。
    • 『Seedを一つ見つけたら計算終了』
      • 条件に合致したSeedが見つかった時点で計算処理を中断する。
    • 『Seedを見つけるまで計算を続ける』
      • 下記『再計算をn回まで考慮する』のリミット解除オプション。
    • 個体値再計算の考慮数』
      • V固定位置の再計算回数の指定
        この回数を増やせば増やす程Seed特定漏れのリスクが下がるが計算時間もそれに乗じて長くなる。
    • 『検索に使用するデバイス
      • CPU(100%):CPUをフルに使用する。
      • CPU(50%)CPUの最大スレッド数の半分を使用する。
      • OpenCL:GPUを使用する。
      • CUDA:NvidiaGPUでのみ使用できる。OpenCLと同様GPUを使用するがこちらの方が速い。


  • ⑤. 右下『検索』ボタンを押して計算処理を開始する。
    • 結果は『1日目のSeed』に出力される。
    • 必ず正確なSeed値が割り出されるとは限らないので、5日目以降の他のV固定数の個体や6日目以降の個体等との情報とも照らし合わせてSeedの確定を行うとよい。
    • 4日目、5日目に他のV固定数の個体が入手できる場合、それを捕獲して再度パラメータ入力、『Seedの絞り込み』で照らし合わせることができる。

特定したSeedの情報は『Seed情報出力』ボタンをクリックすると外部ファイル保存できる。
ここで保存したファイルは夜綱氏制作のツール『8denSearch』で使用可能。

【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

最後に



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


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

【Em】ふしぎなカードの偽造その2

この記事を読んでいることを前提とします。
bzl.hatenablog.com


今回はオリジナルのふしぎなカード(ポケモン受け取り)作成についてすごく雑に纏めます。
どんな具合の挙動になるかは以下の動画をご覧頂ければ理解できると思います。

データ作成ツールは以下のリンクからDLできます。
https://bzl-web.com/file/Wonder Card Printer/Wonder Card Printer.zip


このツールではカードのデザインやテキストデータ、受け取れるポケモンの情報等が設定できます。


設定後、データを保存したら出力された.wc3ファイルを適当なバイナリエディタで開いてください。


ここで開いたデータの頭から0xF8byteのデータがカードのデータになります。
偽造その1と同じ手順でカードのアドレスを特定し、そのまま0xF8byte分書き込んでください。

0xF8以降の0x3ECbyteのデータはスクリプトのデータです。
このデータは配達員スクリプトの格納メモリに書き込んでください。

書き込みが終了したらふしぎなおくりものメニューからミスがないか確認してください。

作成したカードが正常に読み込まれたら成功です。


また、このツールで作成できるカードは1度のみ受け取り可・カード再配布不可の設定にしています。
フラグは共用なので別のカードを作成しても受け取ることはできませんのでご了承ください。
任意スクリプト実行等でフラグ0x01E7をOFFにすれば一応は何度でも受け取れます

ポケモン受け取り以外のカードが作りたい方はこちらを参考にデータを作成してください。
イベントスクリプト - 改造ポケモン制作資料 Wiki*

【Em】ふしぎなカードの偽造その1

ふしぎなカードのデータ書き込みについて紹介します。
例によって16進数やバイナリエディタに対するそれなりの理解があることを前提としています。

書き込むデータの例として公式のふるびたかいずを使用します。
データの位置特定や書き込みにはゲーム内バイナリエディタを使用するため、バイナリエディタ未導入の方は以下の記事を参考に導入してください。
http://bzl.hatenablog.com/entry/2019/09/29/182642bzl.hatenablog.com
データサイズが大きい都合上、打ち込むデータの指定にはPC用バイナリエディタのスクショを使用しています。

1)カードのデータ書き込み



0x03005AECからの4byteに格納されたポインタに0x3310byteを加算したアドレスがふしぎなカード格納メモリです。
このアドレスを始点に以下のデータを書き込んでください。
f:id:BZL:20191006103229p:plain

また、上記のデータの代わりに以下のデータを書き込むことで、一次配布可能なカードを生成することができます。
生成ROMから他のROMに配布されたカードは正規のカードと全く同じバイナリデータになります。
f:id:BZL:20191006110333p:plain

2)スクリプトのデータ書き込み



0x03005AECからの4byteに格納されたポインタに0x3728byteを加算したアドレスが配達員スクリプトの格納メモリです。
このアドレスを始点に以下のデータを書き込んでください。
f:id:BZL:20191006104449p:plain

書き込みが終了したら一旦レポートを書いて保存します。
ふしぎなおくりものからカードの情報を見ることができれば書き込みは成功です。
もし弾かれた場合は再度アドレスを特定してからミスのある箇所を修正してください。
打ち込みミスのある状態で配達員に話しかけると打ち込んだデータがクリアされてしまうので、確認は必ずふしぎなおくりものメニューから行うようにしてください。


以上の手順で外部ツールを使用せずに正規と全く同じデータのふるびたかいずを生成することができます。
Twitterで紹介したオリジナルのふしぎなカード作成については別記事で纏めます。
↓続き
bzl.hatenablog.com

【Em】バイナリエディタの導入

数ヶ月前に書いたこの記事の情報が色々と古くなってきたので新しく纏め直しました。
bzl.hatenablog.com

この記事では0x085F入手後~バイナリエディタ起動までの流れについて解説します。

この記事で紹介しているコードは0x2B5Cによる呼び出しを推奨していません。
使用しているRAM改竄方式にもよりますが、技アニメスクリプト用のコードを挟ませていないので状況次第でクラッシュに繋がります。
0x085Fをまだ持っていない場合はこの記事の手順を踏んで生成させてください。
bzl.hatenablog.com

以下実行手順の説明です。
この記事で使用されている『へ』『べ』『ぺ』は全て平仮名になります。

1)RAMコピー用のダメタマゴ生成


ボックスRAMへ効率良くデータをコピーする為に、メモリコピー処理を埋め込んだダメタマゴをボックス1/15に生成します。
以下の通りにボックス名を編集した後、0x085Fのステータスを開いて処理を実行してください。

ボックス ボックス名
ボックス1 『ォめンばつい『は』
ボックス2 『アこぅほょ l』
ボックス3 『せもっめコづグね』
ボックス4 『アCTなGけl』
ボックス5 『ロば むいぽゆリ』
ボックス6 『アアアzをけd』
ボックス7 『CTぃGCTるG』
ボックス8 『アへTなGねl』
ボックス9 『9をうW l99』
ボックス10 『アアアキっうぅ』
ボックス11 『アアオエあぅ』
ボックス12 『アっるあV』
ボックス13 『あゃポば l99』
ボックス14 『アアアミBィC』

正しく処理が実行できていれば、以下のようにダメタマゴが配置されます。
このダメタマゴは動かさないでください。
f:id:BZL:20190929152204p:plain


2)バイナリエディタ実体コピー


バイナリエディタのプログラムデータをボックス1/2~1/13にコピーします。

まず先程生成したダメタマゴを参照するための処理を入力します。
以下の通りにボックス名を編集してください。

ボックス ボックス名
ボックス1 『ォらぜいっむきぼ』
ボックス2 『アぼづワば l』
ボックス3 『oひせみぶづボね』
ボックス4 『アひねねゃポば』

この処理で先程のダメタマゴを呼び出すことでボックスRAM上に0x50byteのデータをコピーできます。
データのコピー先はボックス5の最初の4文字で決定され、『    』(0x00000000)の場合はボックス1/2、『ふ   』(0x0000001C)の場合はボックス1/30といったようにポケモンの位置に対応したコピー先を指定できます。
ボックスのポケモン1匹分のデータサイズは0x50byteで、バイナリエディタは0x3C0byte(ポケモン12匹分)のデータで構成されているので合計12回のコード実行でコピーが完了します。
以上の通り、ボックス5-ボックス13のボックス名は任意コードの呼び出し毎に変更してください。

1回目

ボックス ボックス名
ボックス5 『    ィ♂ミ」』
ボックス6 『fぶYぴァばおが』
ボックス7 『Dばルl9おふV』
ボックス8 『ぴァばおがDばム』
ボックス9 『l みUぴ9ァば』
ボックス10 『おがDばノl9く』
ボックス11 『むUぶPぴァば9』
ボックス12 『けがDばセlOべ』
ボックス13 『9すメSぶ』


2回目

ボックス ボックス名
ボックス5 『あ   くタ リ』
ボックス6 『くム みべムミB』
ボックス7 『ィCPぶ9たむけ』
ボックス8 『いぞね めMべあ』
ボックス9 『ィあぅあも9あも』
ボックス10 『あもあもあも9あ』
ボックス11 『もあもあもいぃ9』
ボックス12 『あィあぇせれxW』
ボックス13 『9あぅあィ』


3回目

ボックス ボックス名
ボックス5 『い   あぅAぶ』
ボックス6 『ぞもためついィね』
ボックス7 『あィGイ9いぅふ』
ボックス8 『ぃあィGイあぅ♀』
ボックス9 『ぶためつい9ィね』
ボックス10 『あィあぅ め9あ』
ボックス11 『もあもあもあも9』
ボックス12 『あもあもあもあも』
ボックス13 『9あもあも』


4回目

ボックス ボックス名
ボックス5 『う   いぃあィ』
ボックス6 『あぇせれxWあぅ』
ボックス7 『あィミび96ばF』
ボックス8 『ばィ♂ミ」ャ…ビ』
ボックス9 『ぷりレちむ9ッぴ』
ボックス10 『ァばけがDば9ヲ』
ボックス11 『l やんふりリ9』
ボックス12 『あけけるいeたぅ』
ボックス13 『90ぅぅヤ』


5回目

ボックス ボックス名
ボックス5 『え   そむあぞ』
ボックス6 『ける eたぅ0ぅ』
ボックス7 『ムヤあゅ9いょあ』
ボックス8 『ゃおわおVえわp』
ボックス9 『Wあょns9ィぷ』
ボックス10 『んふぇふたゲ9W』
ボックス11 『ゲVェちェっゲ9』
ボックス12 『ダゲゾェアェ み』
ボックス13 『9ぃツミツ』


6回目

ボックス ボックス名
ボックス5 『お   …ツミル』
ボックス6 『えりきVぞ たぃ』
ボックス7 『ぅコたぃ9ぅイき』
ボックス8 『lミンるむミエ…』
ボックス9 『ンれむミエ9ァみ』
ボックス10 『ィぃぃラ…ュ9た』
ボックス11 『ょいバ みあゾ9』
ボックス12 『ノぶ ゾりレ む』
ボックス13 『9 め も』


7回目

ボックス ボックス名
ボックス5 『か   ミぴィゃ』
ボックス6 『ァばおがDばはl』
ボックス7 『たょいバ9 みあ』
ボックス8 『ゾタぶ ゾりレ 』
ボックス9 『む め も9ニぴ』
ボックス10 『ィゃァばけが9D』
ボックス11 『ばえlえ…ミB9』
ボックス12 『ィC6ばィ♂ミ」』
ボックス13 『9きふリば』


8回目

ボックス ボックス名
ボックス5 『き   おぃョば』
ボックス6 『てsぷぷサぺょギ』
ボックス7 『たみぃぞ9おVネ』
ボックス8 『ルえりヤVあぃネ』
ボックス9 『ムヒlみみ9ぃぞ』
ボックス10 『けVネル り9ヌ』
ボックス11 『Vあぎネムセl9』
ボックス12 『ぞみぃぞつVネル』
ボックス13 『9えりいV』


9回目

ボックス ボックス名
ボックス5 『く   Fづうむ』
ボックス6 『くぞるシあぅるエ』
ボックス7 『えりぴV9りネ 』
ボックス8 『リりムばlィみぃ』
ボックス9 『ぞそVネル9えり』
ボックス10 『えVFづうむ9く』
ボックス11 『ぞるシあぐ ぐ9』
ボックス12 『osネルえりとW』
ボックス13 『9たみ あ』


10回目

ボックス ボックス名
ボックス5 『け   ぃぞうV』
ボックス6 『るルたぅるムよl』
ボックス7 『みみ あ9ぃぞえ』
ボックス8 『Vえみるルたぐる』
ボックス9 『ムひlあみ9ぃぞ』
ボックス10 『おVりネるル9あ』
ボックス11 『ミたlいみぃぞ9』
ボックス12 『ちVぎふよぴァば』
ボックス13 『9けがDば』


11回目

ボックス ボックス名
ボックス5 『こ   ァsやぶ』
ボックス6 『 むあミおlァば』
ボックス7 『けがDば9trミ』
ボックス8 『BィCFば けけ』
ボックス9 『せいそゼ 9 い』
ボックス10 『う  えお 9っ』
ボックス11 『ぇ くシょ く9』
ボックス12 『ぶめ くリギこく』
ボックス13 『9 bうい』


12回目

ボックス ボックス名
ボックス5 『さ   シYうい』
ボックス6 『どXういネYうい』
ボックス7 『フYうい9   』
ボックス8 『いたv かとn 』
ボックス9 『 っv か9Vv』
ボックス10 『 かねご く9ワ』
ボックス11 『ボのくゾも う9』
ボックス12 『トグこくわそ う』
ボックス13 『9アアアア』

以上のコード実行を終えるとボックス1が以下のような状態になります。
コピー先のミスはタマゴの位置で判別可能ですが、細かいデータ内容のミスまでは判別できません。
(チェック用のコードを書くことも可能ですが、できればミスのないよう慎重に打ち込んでもらうのが望ましいです)
f:id:BZL:20190929155156p:plain



3)バイナリエディタの起動


バイナリエディタを起動する為のコードです。

以下の通りにボックス名を編集した後、0x085Fのステータスを開いて処理を実行してください。

ボックス ボックス名
ボックス1 『ォめリばついィは』
ボックス2 『アこぃおべ l』
ボックス3 『しふみぅリめヂ 』
ボックス4 『アさkいべおl』
ボックス5 『 Vういりぃ も』
ボックス6 『アみふいふ l』
ボックス7 『むぇえぱせFいぶ』
ボックス8 『ア むあタおl』
ボックス9 『ぎせ うらい  』
ボックス10 『アGタあむ l』
ボックス11 『あメあぅだメえチ』
ボックス12 『アミBィC』

バイナリエディタの打ち込み、起動コードの打ち込みにミスが無ければバイナリエディタが実行されます。
操作に関しての簡潔な纏めは以下の通り

  • 十字キーでフォーカスの移動、0x01単位での値操作
  • Aボタンで値の書き込み
  • LRボタンで0x10単位での値操作
  • Bボタンでバイナリエディタ処理終了、主人公のロック解除

f:id:BZL:20190929150026p:plain

バイナリエディタ導入後、セーブハックを行うと更に自由度が高まります。
bzl.hatenablog.com
操作ミスでセーブデータが破損する可能性があるので実践する方はセーブデータのコピーを推奨します。
(一見するとセーブデータコピーの方が危険そうですが割と安全です)
bzl.hatenablog.com


おまけ


スクリプト実行

0x03000E40 <- 0x01
0x03000E41 <- 0x02
0x03000E44 <- 0x00000000(word)
0x03000E48 <- イベントスクリプトのアドレス(word)
0x03000E38 <- 0x00 ※このアドレスの上書きは必ず最後に行う

任意ポケモンエンカウントスクリプト

個体値等はランダムです
乱数調整したいならMethod1で計算するといいかもしれないです

B6 PP PP LV IT IT B7 02

PP PP = ポケモンコード
LV = レベル(100 = 0x64)
IT IT = アイテムコード
任意マップワープスクリプト
39 MP MP 00 00 00 00 00 02

MP MP = マップID
1A 38 = さいはてのことう
1A 09 = みなみのことう
1A 3A = たんじょうのしま
1A 42 = へそのいわ
18 67 = うみのどうくつ
18 69 = りくのどうくつ
フラグ書き換えスクリプト
フラグをONにする
29 FL FL 02

フラグをOFFにする
2A FL FL 02

FL FL = フラグID

91 00 = ルギア捕獲済み
92 00 = ホウオウ捕獲済み
AD 01 = デオキシス捕獲済み
BB 01 = レジロック捕獲済み
BC 01 = レジアイス捕獲済み
BD 01 = レジスチル捕獲済み
BE 01 = カイオーガ捕獲済み
BF 01 = グラードン捕獲済み
C0 01 = レックウザ捕獲済み
C9 01 = 孤島ラティ捕獲済み
CA 01 = ミュウ捕獲済み
C0 01 = レックウザ捕獲済み
50 0D = むげんのチケット配達員出現

【Em】バグポケモン0x085Fを使用した任意コード実行

技アニメ実行とは別の任意コード実行方法が見つかったので紹介します。

このコード実行方法の特徴は以下の通りです。

  • 不正ポケモンコードを利用する
  • プログラムの直参照なのでボックスを適切な状態にしていれば100%成功する
  • 技アニメと比べて実行の手間が少ない
  • スクリプトの記述が必要ない分多くのメモリを処理の記述に使用できる


↓実践動画

以下実行手順です。

1)バグポケモン0x085Fの生成



生成に使用する個体はNPC交換のタネボー(NN:セブン)です。


f:id:BZL:20190923172314p:plain
交換にはラルトスが必要なので所持していない場合は102番道路で捕まえます。


f:id:BZL:20190923172413p:plainf:id:BZL:20190923172425p:plain
カナズミジム隣の民家にいるボーイスカウトに話しかけます。


f:id:BZL:20190923172453p:plain
ラルトスが欲しいと言われるのでタネボーと交換します。


ここで交換したタネボー努力値をH95、A8に調整します。
私は以下の通りに振りました。

マックスアップ*9

ケムッソ*5

ポチエナ*8



f:id:BZL:20190923175740p:plain
努力値の調整が終わったらこのタネボーを材料にダブルコラプションを行います。
成功するとこの画像のようなバグポケモンが生成されます。


2019/10/07 追記
実機環境ではダブコラを行わずPID破損のみ行えば生成されたタマゴを孵化させて0x085Fを入手できます。
PID破損したタマゴが生成された場合はボックス12の11匹目からボックス14の30匹目までを全て空欄にし、ボックス1の名前をボックス1『いぶたぃ び』、ボックス2の名前を『アアアyコくく』にしてからポケセンで孵化させてください。
(ポケセン外で孵化させるとフリーズします。例外が存在する可能性有り)
「おや…?」からの暗転時間が少々長い(恐らくLZ77解凍処理の不正実行によるループ)ですが、約5秒程度待機すれば正常に孵化処理が実行されます。
孵化処理後はメモリが不安定になっている可能性があるのでレポート保存後のリセットをおすすめします。


以上でバグポケモン0x085Fの生成は終了です。
この段階ではまだ0x085Fの様子は見ないでください。

2)任意コードの入力



重要:ボックス12の11匹目からボックス14の30匹目までを全て空欄にしてください。
実行されるプログラムの記述にはボックス名1-14を使用することができます。
プログラムを記述したら0x085Fの様子を見ます。
スクリプト実行の場合ボックスを閉じたタイミングで処理が発動します。
以下はコードの例です。


さいはてのことうへのワープスクリプト

ボックス ボックス名
ボックス1 『くぶ むあめあミ』
ボックス2 『アいメGタ l』
ボックス3 『いむだメえぱうチ』
ボックス4 『アのメえぶけl』
ボックス5 『ぎせ うぃVうい』
ボックス6 『アアアぐはぎ 』
ボックス7 『ねタミび』

ボックス6の『はぎ』の部分を適当な文字列に書き換えるとワープ先を任意のものに変更できます。

ワープ先 対応する文字列
みなみのことう 『はけ』
たんじょうのしま 『はげ』
へそのいわ 『はぢ』



エンディング処理実行

ボックス ボックス名
ボックス1 『 ぶ びじオぬく』




3)コード実行の原理について



完全におまけなので興味なかったら見なくていいです



エメラルドで追加された処理の内の一つにポケモンのアニメーション』というものがあり、ポケモンの種族ごとに様々なアニメーションが割り当てられています。
内部処理的にアニメーションの割り当てには1ByteのID指定と、そのIDに紐付けられたアニメーションのプログラム参照テーブル、そしてポケモンの種族とアニメーションのIDを紐付けるテーブルが使用されます。

バグポケモンは不正なポケモンコードを持っているのでポケモンコードを使用して参照されるテーブルの殆どで不正参照が行われます。(正面画像等の例外は有り)
前述した通りポケモンのアニメーションのプログラムはIDに紐付いたテーブルを参照して実行されるので、不正なIDを渡すと本来プログラムでない領域を参照させることができます。

アニメーションのプログラム参照テーブルは0x085D34E8に配置されています。
このテーブルの内容を調べると有効なアニメーションIDは0x00-0x96でそれ以降のIDは不正領域参照となっていることが分かります。
使用可能な1Byte分のIDを一通り調査した結果、プレイヤーが自由に変更できるRAMを参照させることのできるIDは0xBA(参照RAM:0x0202FFFF)のみとなりました。
0x0202FFFFのプログラム参照の場合、参照位置より先にポケモンを置かないことによってボックス名の格納RAMまで安全にアクセスすることができます。
(0xBDはボックスRAM0x0202FFFEを参照しているので一見使用できるように思えますがTHUMBステートで実行されないアドレスなので除外しています)

ポケモン毎のアニメーションIDの指定テーブルは0x082FA374に配置されているので、この領域を調査することでバグポケモンに割り当てられたIDを調べることができます。
アニメーションID0xBAを参照していて尚且生成に必要な努力値調整数の少ないバグポケモンを調べた結果、0x085Fがこの条件に合致しているのではないかと考えました。

このコード実行バグについて調査・考察した内容は以上となります。
因みにこのコード実行法はFRLGでは無理です。

【Em】セーブデータ改竄によるシステムハック

セーブデータに保存されるデータを利用して、ゲーム開始時に任意コードを実行できる方法を発見したので解説します。
この記事で紹介する方法ではゲーム開始時に自動的に実行される任意コードからバイナリエディタ起動準備を行い、L+Rの同時押しでいつでもバイナリエディタが起動できるようになります。


↓動画

また、システムハックの導入にはバイナリエディタの起動環境を整えていること、16進数を理解していることを前提条件とします。

導入手順解説の前に、具体的に何を行ったかについて解説します。

従来の手法では、技アニメスクリプトの不正アドレス参照をトリガーにしてボックス上に記述した任意コードを実行する、といった方式でチューリング完全の処理を実行させることができていました。

実行できる任意コードはGBAのハードウェアを完全に制御することが可能なので、割り込み処理等を変更することでシステムハック自体は簡単に行えます。
(この記事で行っていることも大体同じ原理です)
bzl.hatenablog.com

割り込み処理変更によるシステムハックを実行すれば、技アニメ再生後は任意のタイミングで任意コードを実行することができます。
しかし、割り込み処理のポインタを含む静的RAMの変更内容は基本的にゲーム終了と同時にリセットされてしまうため、システムハックを行ってもその効果をゲーム終了後も持続させることはできませんでした。

そこでゲーム開始時にメモリを改竄するため、ゲーム開始時の処理をトリガーに任意コードを実行する方法がないか調査した結果、主人公スプライトに紐付けられたオブジェクトアクションID(デフォルト0x0B)がセーブデータ上に保存され、開始時にセーブデータ依存でRAM展開されることに気付きました。
(オブジェクトアクションIDについての資料はこちら)
オブジェクトアクションIDに紐付けられたプログラムはNPCスプライトが描画されている限り実行され続けるので、ここで不正プログラムを参照させれば主人公スプライトが描画されるゲーム開始時に任意コードを実行させることができます。

紐付けられたプログラムの参照テーブル付近のデータを調査した結果、0x084DDA40にボックスRAM0x02030401(0x02030400に記述されたプログラムをTHUMBステートで参照する)へのポインタとなるデータが配置されていたので、ここを参照できるオブジェクトアクション0x6Eを任意コード実行のトリガーとして使用することにしました。

ゲーム開始時に行われる処理の流れは以下の通りです。

  1. 主人公スプライト描画
  2. オブジェクトアクション0x6Eに紐付けられたプログラム(0x02030400)の実行
  3. 静的RAM(0x0203D000)へのスクリプト展開
  4. ボックス1の2匹目から記述されているプログラムを静的RAM(0x0203D020)にコピー
  5. 静的RAM(0x0203CE00)への割り込み処理展開
  6. 割り込み処理参照ポインタ(0x03007FFC)の書き換え
  7. システムハックの完了


導入手順


1)バイナリエディタの導入



記事冒頭で前提条件として挙げた通り、データの打ち込みにはバイナリエディタを使用します。
(理論上はアニメスクリプトでも書き込めるが、使用できるバイナリデータに限りがあるのとボックス埋め込み用にコード組むのがめんどくさい)

バイナリエディタ未導入の場合、以下の記事を参考に導入してください。
http://bzl.hatenablog.com/entry/2019/07/16/075233bzl.hatenablog.com

2)データ書き込みアドレスの始点計算



バイナリエディタが導入できたら、バグ技0x2B5C、又はバグポケ0x085Fを使用してバイナリエディタを起動します。
今回データを書き込む領域はボックスRAM(動的RAM)になるので、乱数によって対応するメモリアドレスが変化してしまいます。
適当な領域に書き込むとダメタマゴフラグの影響でプログラムが破損するので、正確な位置にデータを書き込む必要があります。

まず、バイナリエディタで0x03005AF4、0x03005AF5、0x03005AF6、0x03005AF7のデータを読み込み、この時読み込んだデータを前から①、②、③、④として扱います。
f:id:BZL:20190922205425p:plain
画像で読み込まれたデータは①AC、②94、③02、④02となっています。
このデータを④③②①の順に並び替えると0x020294ACというアドレスになると思います。
これがボックスRAMの始点です。

ボックスRAMの始点に0x6ED8を加算するとデータ書き込み先のアドレスが算出できます。
この画像のケースではデータ書き込み先のアドレスは0x02030384になります。

この手順で開いたバイナリエディタは閉じずにそのまま手順3に移行してください。
もし閉じてしまった場合は、再度手順2の頭からやり直しです。(動的RAMの先頭アドレスは画面切り替え毎に変動するため)

3)データ書き込み



手順2で算出したアドレスをこれ以降pと表記します。

任意コード実行にバグポケ0x085Fを使用している場合p+0x00~p+0xBBまでの改変は必要ありません。
その代わりにp-0x34の位置を始点に以下のデータを書き込んでください。

書き込み位置 データ
p-0x34 00
p-0x33 48
p-0x32 00
p-0x31 47
p-0x30 F1
p-0x2F 17
p-0x2E 03
p-0x2D 02


p+0x00~p+0x7Fまでのメモリ領域を0x1A,0x00,0x1A,0x00...と埋めていきます。
バイナリエディタの導入時点で既にここのメモリは書き換えられているはずなので実際に書き込む手間はそこまで多くありません。

プログラムとして参照しても問題ないようにした上で0x2B5Cを引き続き使用できるようにする為にp+0x80の位置に以下のスクリプトを記述します。

書き込み位置 データ
p+0x80 03
p+0x81 DD
p+0x82 17
p+0x83 33
p+0x84 02
p+0x85 99
p+0x86 00
p+0x87 08

0x023317DDをポインタとして扱って大丈夫なのか?と思う方がいるかもしれませんが問題なく参照可能です。(実機、VBA1.7.2で確認済み)

p+0x88~p+0xBBまでの領域を0x00で埋めます。

p+0xBCを始点に以下のプログラムデータを書き込みます。
(長いのでスポイラーにしています)

書き込み位置 データ
p+0xBC F0
p+0xBD B4
p+0xBE 04
p+0xBF 1C
p+0xC0 29
p+0xC1 48
p+0xC2 01
p+0xC3 38
p+0xC4 01
p+0xC5 78
p+0xC6 00
p+0xC7 29
p+0xC8 47
p+0xC9 D1
p+0xCA 01
p+0xCB 21
p+0xCC 00
p+0xCD E0
p+0xCE AA
p+0xCF AA
p+0xD0 01
p+0xD1 70
p+0xD2 41
p+0xD3 1C
p+0xD4 26
p+0xD5 48
p+0xD6 00
p+0xD7 68
p+0xD8 54
p+0xD9 30
p+0xDA 20
p+0xDB 31
p+0xDC 78
p+0xDD 22
p+0xDE 92
p+0xDF 00
p+0xE0 00
p+0xE1 E0
p+0xE2 AA
p+0xE3 AA
p+0xE4 0B
p+0xE5 DF
p+0xE6 20
p+0xE7 48
p+0xE8 22
p+0xE9 49
p+0xEA 02
p+0xEB 1C
p+0xEC 00
p+0xED E0
p+0xEE AA
p+0xEF AA
p+0xF0 21
p+0xF1 32
p+0xF2 89
p+0xF3 23
p+0xF4 9B
p+0xF5 00
p+0xF6 03
p+0xF7 33
p+0xF8 00
p+0xF9 E0
p+0xFA AA
p+0xFB AA
p+0xFC 02
p+0xFD 25
p+0xFE 2E
p+0xFF C0
p+0x100 1D
p+0x101 48
p+0x102 1E
p+0x103 49
p+0x104 00
p+0x105 E0
p+0x106 AA
p+0x107 AA
p+0x108 1E
p+0x109 4A
p+0x10A 1F
p+0x10B 4B
p+0x10C 20
p+0x10D 4D
p+0x10E 21
p+0x10F 4E
p+0x110 22
p+0x111 4F
p+0x112 EE
p+0x113 C0
p+0x114 22
p+0x115 49
p+0x116 24
p+0x117 4A
p+0x118 24
p+0x119 4B
p+0x11A 25
p+0x11B 4D
p+0x11C 00
p+0x11D E0
p+0x11E AA
p+0x11F AA
p+0x120 24
p+0x121 4E
p+0x122 25
p+0x123 4F
p+0x124 EE
p+0x125 C0
p+0x126 26
p+0x127 49
p+0x128 26
p+0x129 4A
p+0x12A 27
p+0x12B 4B
p+0x12C 27
p+0x12D 4E
p+0x12E F4
p+0x12F 25
p+0x130 00
p+0x131 E0
p+0x132 AA
p+0x133 AA
p+0x134 AD
p+0x135 19
p+0x136 80
p+0x137 27
p+0x138 BF
p+0x139 00
p+0x13A 01
p+0x13B 37
p+0x13C 00
p+0x13D E0
p+0x13E AA
p+0x13F AA
p+0x140 EE
p+0x141 C0
p+0x142 09
p+0x143 49
p+0x144 03
p+0x145 31
p+0x146 23
p+0x147 4A
p+0x148 00
p+0x149 E0
p+0x14A AA
p+0x14B AA
p+0x14C 22
p+0x14D 4B
p+0x14E 0E
p+0x14F C0
p+0x150 09
p+0x151 48
p+0x152 23
p+0x153 49
p+0x154 00
p+0x155 E0
p+0x156 AA
p+0x157 AA
p+0x158 08
p+0x159 60
p+0x15A F0
p+0x15B BC
p+0x15C 20
p+0x15D 1C
p+0x15E 01
p+0x15F 49
p+0x160 08
p+0x161 47
p+0x162 00
p+0x163 00
p+0x164 FD
p+0x165 A2
p+0x166 08
p+0x167 08
p+0x168 00
p+0x169 D0
p+0x16A 03
p+0x16B 02
p+0x16C 00
p+0x16D E0
p+0x16E AA
p+0x16F AA
p+0x170 F4
p+0x171 5A
p+0x172 00
p+0x173 03
p+0x174 28
p+0x175 30
p+0x176 00
p+0x177 23
p+0x178 00
p+0x179 CE
p+0x17A 03
p+0x17B 02
p+0x17C 0F
p+0x17D 00
p+0x17E A0
p+0x17F E1
p+0x180 00
p+0x181 E0
p+0x182 AA
p+0x183 AA
p+0x184 05
p+0x185 00
p+0x186 80
p+0x187 E2
p+0x188 10
p+0x189 FF
p+0x18A 2F
p+0x18B E1
p+0x18C 00
p+0x18D E0
p+0x18E AA
p+0x18F AA
p+0x190 0A
p+0x191 48
p+0x192 40
p+0x193 78
p+0x194 03
p+0x195 21
p+0x196 88
p+0x197 42
p+0x198 00
p+0x199 E0
p+0x19A AA
p+0x19B AA
p+0x19C 0B
p+0x19D D1
p+0x19E 09
p+0x19F 4B
p+0x1A0 1B
p+0x1A1 78
p+0x1A2 01
p+0x1A3 2B
p+0x1A4 00
p+0x1A5 E0
p+0x1A6 AA
p+0x1A7 AA
p+0x1A8 07
p+0x1A9 D0
p+0x1AA 08
p+0x1AB 4B
p+0x1AC 00
p+0x1AD 20
p+0x1AE 18
p+0x1AF 60
p+0x1B0 D8
p+0x1B1 60
p+0x1B2 07
p+0x1B3 48
p+0x1B4 98
p+0x1B5 60
p+0x1B6 07
p+0x1B7 48
p+0x1B8 18
p+0x1B9 61
p+0x1BA 07
p+0x1BB 48
p+0x1BC 00
p+0x1BD E0
p+0x1BE AA
p+0x1BF AA
p+0x1C0 6E
p+0x1C1 21
p+0x1C2 81
p+0x1C3 71
p+0x1C4 06
p+0x1C5 4B
p+0x1C6 18
p+0x1C7 47
p+0x1C8 8C
p+0x1C9 23
p+0x1CA 00
p+0x1CB 03
p+0x1CC 38
p+0x1CD 0E
p+0x1CE 00
p+0x1CF 03
p+0x1D0 00
p+0x1D1 E0
p+0x1D2 AA
p+0x1D3 AA
p+0x1D4 F0
p+0x1D5 6F
p+0x1D6 03
p+0x1D7 02
p+0x1D8 F0
p+0x1D9 27
p+0x1DA 00
p+0x1DB 03
p+0x1DC 00
p+0x1DD E0
p+0x1DE AA
p+0x1DF AA
p+0x1E0 FC
p+0x1E1 7F
p+0x1E2 00
p+0x1E3 03


殿堂入り処理等、何らかの原因でシステムハックが解除された時にすぐ復帰できるように、バグ技0x2B5Cやバグポケ0x085Fで実行できる任意コードを記述します。
内容は0x02036FF6に0x6Eを代入するコードです。
ボックス名1の領域(p+0x146C)を始点に以下のデータを書き込みます。

書き込み位置 データ
p+0x146C 02
p+0x146D 48
p+0x146E 6E
p+0x146F 21
p+0x1470 81
p+0x1471 75
p+0x1472 70
p+0x1473 BC
p+0x1474 FF
p+0x1475 51
p+0x1476 80
p+0x1477 BD
p+0x1478 E0
p+0x1479 6F
p+0x147A 03
p+0x147B 02

ボックス名に直した場合の文字列データは以下の通りです。

ボックス ボックス名
ボックス1 いぶホむゥユミB
ボックス2 アィClマうい

最後に、以下のメモリ改変を行います。

メモリアドレス データ
0x0203CFFF 0x?? → 0x00
0x02036FF6 0x0B → 0x6E

以上でRAM改竄は完了です。


!注意
RAM改竄終了後は手順4の内容を終えるまで絶対にレポートを書かないこと。
もし入力ミスがあった場合ゲーム起動時にクラッシュするようになるので実質的なセーブ破損状態になる。
この状態になった場合『さいしょから はじめる』を選択してニューゲームするか外部ツールでセーブデータを改造する以外に回避する手段がない。


4)処理の実行



ポケモン選択画面やバッグ等を開いてから再度スタートメニュー画面に戻ります。
マップが再描画されオブジェクトアクションに紐付けられたプログラムが参照し直されると、前述の手順で書き込んだプログラムが実行され、割り込み処理の差し替えとバイナリエディタの静的RAMコピーが行われます。

フリーズせず正常に動作することを確認できたら、レポートを書いて終了してください。




以上の操作を完了させることにより、無改造のエメラルドをほぼ完全にハックすることができます。
ゲーム性は完全に崩壊しますが、メモリ弄りが大好きな方は是非試してみては如何でしょうか。
因みに、FRLGでも同じ手法でハックすることが可能です。