きっかけは、某ポケモンエディタ系の掲示板の質問からでした。その質問は「自分のポケモンの裏IDを知るには、どうしたら良いか」と言う内容でしたが……。
エメラルドでしたら、たかさんさんが「裏ID表示コード」を公開なさっているので調べることが可能ですが、その方が知りたかったのは、ファイアレッド(前期版か後期版かは不明)でした。
「ツールにセーブデータを読み込ませて調べる」と言う回答の他に「裏ID変更コードで、元を変更した方が早い」と言うのが有りました。それを読んで私は、ちょっと「カチン」ときましたね。
あまり簡単に「主人公のIDを変えろ」と言わないで欲しいし、安易に他人(特に初心者)に勧めないで欲しいと言うのが理由だったんですが……。(エディタの依頼内容を見るとIDが酷すぎます)
それに、XDとの連帯を考えている方々には、XDポケモンの裏IDを知ることは必須ですからね。現時点では、GBAに送って裏IDを調べるしか方法が有りませんが、エメラルド以外はセーブデータを吸い出して、ツールに読み込ませない限りは無理ですから。
早速、VBASDL-Hの使い方を覚えて、コードサーチに挑戦してみることにしました。(ある意味、無謀かぁ?)
私はVBASDL-H自体は使用したことが有ったんですが、起動させるのが面倒でしたし、GBAのコードはサーチする方々が大勢いらっしゃるので、大体は事足りていましたから。(苦労する必要は無いかな~と)
まずは、エメラルドのコードがどういった処理をしているのかを、調べてみました。
「88D4h」(ldrh r4,[r2,#0x6])レジスタ2に格納されているアドレスに+06hしたアドレスの値をレジスタ4にハーフワードロード(2Byte)。
本来の処理は「6854h」(ldr r4,[r2,#0x4])レジスタ2に格納されているアドレスに+04hしたアドレスの値をレジスタ4にワードロード(4Byte)。
上記内容から探すのは「ldr命令」で「ldr r4,[r2,#0x4]」を探し出せれば理想的という事ですかね。
やはり、先駆者の方々が一から手探り状態で、苦労してサーチして下さっていると後の者は助かります。ヒントが沢山ありますから。
さて手始めに、ルビーのコードサーチから始めてみる事にしました。
取り合えず、ID処理という事なので手持ち一匹目の親のIDが格納されているアドレスで「bpr」コマンド。
ブレイクしたアドレス付近を「dt」コマンドで表示させて見ると「ldmia命令」と[stmia命令」の繰り返し処理です。
表示されたレジスタの内容を見てみると、どうも02018010h辺りからデータが展開されて順次処理されていく感じです。順次処理されていては、チョット困りますね。
案の定、処理を追って「ldr命令」(使用レジスタが違っていた)を見つけましたが、命令を書き換えるとダメ卵状態になってしまいました。
多分、それ以前の段階でIDのみを読み込む処理が有るんだとは思いますが……私にはこれ以上処理を追ってサーチするのは、お手上げでした。
これはもう、ディスアセンブラ使用してテキストファイルに落し「ldr命令」を検索して、怪しげなものを試した方が早いかなぁ……と思いました。(サーチのスキルは身につきませんが)
私はこういった単純作業は嫌いじゃないし、やりだすとハマってしまうので。
取り合えず、ディスアセンブラも探して来るようだし、続きは明日にしますかぁ~、と飲みはじめちゃったんですが……。
やはり気になったので、バイナリエディタで「6854h」(ldr r4,[r2,#0x4])を検索して見ると、思わず「えっ!もしかしたら」状態でした。エメラルドのコードの該当アドレス付近と、データの並び方がそっくりだったんです。
早速、その検索したアドレスを「bt」コマンドでブレイクさせてレジスタの値を見てみると、命令に該当するレジスタには展開先のアドレスが格納されていました。処理を考えてみると、どうもビンゴみたいですね。
早速「6854h」(ldr r4,[r2,#0x4])を「88D4h」(ldrh r4,[r2,#0x6])に変更し、PARコードにして実機で確認してみました。バグることなく裏IDが表示されます。
ん~、今回は「ヤッター」と言うよりも「ウソでしょー!」状態でしたね。
「ファイアレッド、リーフグリーン」もバイナリエディタで検索すると、該当アドレスが特定できてしまいましたから、ものすごーい、パターンサーチです。(恥かしいデス)
確かに、これだとスキルが身につきませんね。
まあ、コードは作成出来ましたので目的は達成できましたが……今回は、あまりにも拍子抜けでしたぁ。
それから、ファイアレッドの後期版のコードも必要でしょうから、購入して作成しておきました。
皆さん、一度きちんと自分のポケモンの裏IDを確認してみると、いいと思いますよ。
ポケモン裏ID表示コード
このコードは手持ちポケモンの「ポケモンじょうほう」欄に記載されている、表IDの代わりに裏IDが表示されます。
(PARのコードをONにしている時のみ)
ルビー・サファイア
11A71F30 ED6D06DD
ファイアレッド・リーフグリーン(初期版)
99BB78CC E85D00E0
ファイアレッド(後期版)
7D36AAB7 8DC68938
※ ROMコードですのでPARの場合は、他のROMコードとの併用は出来ません。
マスターコードは、今のPARにはほとんど登録済みだと思いますが、ファイアレッドの後期版は登録済みのものでは多分ボタンが効かなくなると思います。
(プロアクションリプレイ2限定版で試した)
その際は、たかさんさんの所にある、ファイアレッド「後期ROMプログラム用」のものをお使い下さい。
実機で確認済みですが、コード使用に関しては自己責任でお願いします。
無断転載しないで下さいね。お願いします。
エメラルドでしたら、たかさんさんが「裏ID表示コード」を公開なさっているので調べることが可能ですが、その方が知りたかったのは、ファイアレッド(前期版か後期版かは不明)でした。
「ツールにセーブデータを読み込ませて調べる」と言う回答の他に「裏ID変更コードで、元を変更した方が早い」と言うのが有りました。それを読んで私は、ちょっと「カチン」ときましたね。
あまり簡単に「主人公のIDを変えろ」と言わないで欲しいし、安易に他人(特に初心者)に勧めないで欲しいと言うのが理由だったんですが……。(エディタの依頼内容を見るとIDが酷すぎます)
それに、XDとの連帯を考えている方々には、XDポケモンの裏IDを知ることは必須ですからね。現時点では、GBAに送って裏IDを調べるしか方法が有りませんが、エメラルド以外はセーブデータを吸い出して、ツールに読み込ませない限りは無理ですから。
早速、VBASDL-Hの使い方を覚えて、コードサーチに挑戦してみることにしました。(ある意味、無謀かぁ?)
私はVBASDL-H自体は使用したことが有ったんですが、起動させるのが面倒でしたし、GBAのコードはサーチする方々が大勢いらっしゃるので、大体は事足りていましたから。(苦労する必要は無いかな~と)
まずは、エメラルドのコードがどういった処理をしているのかを、調べてみました。
「88D4h」(ldrh r4,[r2,#0x6])レジスタ2に格納されているアドレスに+06hしたアドレスの値をレジスタ4にハーフワードロード(2Byte)。
本来の処理は「6854h」(ldr r4,[r2,#0x4])レジスタ2に格納されているアドレスに+04hしたアドレスの値をレジスタ4にワードロード(4Byte)。
上記内容から探すのは「ldr命令」で「ldr r4,[r2,#0x4]」を探し出せれば理想的という事ですかね。
やはり、先駆者の方々が一から手探り状態で、苦労してサーチして下さっていると後の者は助かります。ヒントが沢山ありますから。
さて手始めに、ルビーのコードサーチから始めてみる事にしました。
取り合えず、ID処理という事なので手持ち一匹目の親のIDが格納されているアドレスで「bpr」コマンド。
ブレイクしたアドレス付近を「dt」コマンドで表示させて見ると「ldmia命令」と[stmia命令」の繰り返し処理です。
表示されたレジスタの内容を見てみると、どうも02018010h辺りからデータが展開されて順次処理されていく感じです。順次処理されていては、チョット困りますね。
案の定、処理を追って「ldr命令」(使用レジスタが違っていた)を見つけましたが、命令を書き換えるとダメ卵状態になってしまいました。
多分、それ以前の段階でIDのみを読み込む処理が有るんだとは思いますが……私にはこれ以上処理を追ってサーチするのは、お手上げでした。
これはもう、ディスアセンブラ使用してテキストファイルに落し「ldr命令」を検索して、怪しげなものを試した方が早いかなぁ……と思いました。(サーチのスキルは身につきませんが)
私はこういった単純作業は嫌いじゃないし、やりだすとハマってしまうので。
取り合えず、ディスアセンブラも探して来るようだし、続きは明日にしますかぁ~、と飲みはじめちゃったんですが……。
やはり気になったので、バイナリエディタで「6854h」(ldr r4,[r2,#0x4])を検索して見ると、思わず「えっ!もしかしたら」状態でした。エメラルドのコードの該当アドレス付近と、データの並び方がそっくりだったんです。
早速、その検索したアドレスを「bt」コマンドでブレイクさせてレジスタの値を見てみると、命令に該当するレジスタには展開先のアドレスが格納されていました。処理を考えてみると、どうもビンゴみたいですね。
早速「6854h」(ldr r4,[r2,#0x4])を「88D4h」(ldrh r4,[r2,#0x6])に変更し、PARコードにして実機で確認してみました。バグることなく裏IDが表示されます。
ん~、今回は「ヤッター」と言うよりも「ウソでしょー!」状態でしたね。
「ファイアレッド、リーフグリーン」もバイナリエディタで検索すると、該当アドレスが特定できてしまいましたから、ものすごーい、パターンサーチです。(恥かしいデス)
確かに、これだとスキルが身につきませんね。
まあ、コードは作成出来ましたので目的は達成できましたが……今回は、あまりにも拍子抜けでしたぁ。
それから、ファイアレッドの後期版のコードも必要でしょうから、購入して作成しておきました。
皆さん、一度きちんと自分のポケモンの裏IDを確認してみると、いいと思いますよ。
ポケモン裏ID表示コード
このコードは手持ちポケモンの「ポケモンじょうほう」欄に記載されている、表IDの代わりに裏IDが表示されます。
(PARのコードをONにしている時のみ)
ルビー・サファイア
11A71F30 ED6D06DD
ファイアレッド・リーフグリーン(初期版)
99BB78CC E85D00E0
ファイアレッド(後期版)
7D36AAB7 8DC68938
※ ROMコードですのでPARの場合は、他のROMコードとの併用は出来ません。
マスターコードは、今のPARにはほとんど登録済みだと思いますが、ファイアレッドの後期版は登録済みのものでは多分ボタンが効かなくなると思います。
(プロアクションリプレイ2限定版で試した)
その際は、たかさんさんの所にある、ファイアレッド「後期ROMプログラム用」のものをお使い下さい。
実機で確認済みですが、コード使用に関しては自己責任でお願いします。
無断転載しないで下さいね。お願いします。
VBA-SDLについては私の得意分野ではなかったりします。
コマンドが不慣れです(笑)。
VBAのソースに手を加えてデバッグコンソールにログを出力した方が手っ取り早いです。
私の場合は、ログ出力する場合に条件を絞り込ませるようにしています。
出来るだけ出力行を減らさないと...。
例えばこんな感じでVBAのワーク変数PC(プログラムカウンタ?)の内容とレジスタの内容を出力しています。
Addr:816C2CA
R[0]:498
R[1]:2025B3C
R[2]:2003642
R[3]:3005B68
R[4]:118
R[5]:666
R[6]:203B990
R[7]:3002360
R[8]:3005B68
R[9]:3005C80
R[10]:0
R[11]:0
R[12]:78
R[13]:3007DDC
R[14]:816C4CB
R[15]:816C2CC
R[16]:4000003F
あとはマシン語と比較しながら汎用レジスタの値を追跡しつつ処理ロジックを解析します。
汎用レジスタの値の変化が分かれば大概の処理の流れは『おやじ』でも追えます(笑)。
いずれにせよ数百行となる事が普通ですね。
まれにピンポイントの処理(数行しか処理されない)の場合は助かるのですが...。
条件の絞り方は某掲示板で書いた事があるのですが、汎用レジスタに次の値がある場合の条件式としています。
①変更されるRAMのアドレス②特定の値
又は、PCそのもの実行アドレス。
また、VBAソース内関数(マクロ定義)でCPURead?Quick系を併用してRAM中の値を参照して条件と組み合わせる事もしています。
SDLより数段解析が早いはずなのですが、条件変更する度にリビルド(EXE作成)しないといけないので、その辺がネックです。
久々の書き込みでした。たかさんより...。
喘息の方は、もう良くなられましたか?
気温の変化が激しい時期ですので、お互いに体調管理に注意しましょう。もう年ですからね。(笑
今回のサーチはお恥ずかしい限りですね。まさか、あんな方法で見つかるとは……。(汗
私もVBA-SDL-Hのコマンドなんて良く分かりません。日本語訳したものをプリントして、見ながらやってます。まじめに使い始めて、まだ1週間もたってませんから。
まあ、コマンドの内容を見ると、使いこなせれば便利みたいですね。
試しにログを出力させて見たんですが、指定を間違えて230MB越えのテキストファイルになってしまいました~。
開くのに時間がかかりますが、覗いてみるとブレイクさせた所の処理が順番に書かれてあるので、それを見て流れを追って行くと、難しいですが面白いですね。当たり前ですが、ちゃんと命令通りにレジスタの値が変化していきますから。
やはり、プログラムを組める方々っていいですよね。ソースファイルを見て自分で手直しが出来てしまうんですから。
取り合えず、私がやりたいのはDeSmuMEのソースを実行ファイルにしたいです。やり方ゼンゼン分かりませんが、何とかしてみたいですね。
それから、本当はコードを、たかさんさんの所に投稿したいんですが、エメラルドのコードじゃ有りませんからねぇ。ん~、まことに残念です。
軽い風邪を引いたのですが、この歳になると風邪の症状が落ち着くと気管支炎になってしまいます。毎回の事なので諦めモードです。
現在も少々痰まじりの咳が止まりません(泣)。
さて、『kabiva』さんに刺激された訳ではないのですが、実はここ数日サーチをしていました。
ネタも尽きかけてきているのですが、画面遷移させて何かするやり方を考えていました。
ボツネタっぽいのですが、テキストコードで変更するより直感的に変更できるだろうと...。
パターンサーチについては私達レベルの人間はそれでいいのではないでしょうか?
実際ある程度ロジックは後追いで読めますから解析の手がかりを見つける方法として私は採用しています。
ポケモン的にはROMコードのほとんどがこの方法でできます。一部アドレスを含んだ場合はパターンが合わないケースがありますが、該当アドレス近辺のパターンで検索するとほぼ見つける事ができます。
先駆者(私も?)の方に感謝です。
>本当はコードを、たかさんさんの所に投稿したいんですが...。
『kabiva』さんのコードであれば喜んでOKです(笑)。
私のHP見ている方も異論ないでしょう。
常連さんについては何でもありです。
お許し頂ければ修正作業に着手させて頂きます。ご検討頂ければ幸いです。
たかさんでした。
ZAPDOS
親
JASON
ID
55401
性格
せっかちな せいかく
2009ねん8月29にち 212ばんどうろで
Lv.60のときに
であった ようだ。 しんぼうづよい。
あまいものが すき。
になっています。
それではよろしくお願いします。
↑を見る限りではプラチナ版ではないですか?
出現させるときだけ改造させたか、
何度も粘ったかのどちらかだと思います。