update 2004.07.25

Chankast 改造コードサーチ講座 第1回 〜パラメータサーチ〜


概要
Chankast改造コードサーチ講座第1回は、全ての基本であるパラメータサーチです。
難易度は非常に低いのですが、恐らく最も使用する機会は多いと思われます。
是非とも身につけておきましょう。

準備
今回は以下のツールを使用します。
・DBxSTAND たにしげ師匠作のプロセスメモリエディタ
・ChanCalc ChankastのメモリアドレスをDreamCastの実アドレスに変換します(詳細は後で)
・DreamHacker スクリプト型の改造コード実行ツール
プロセスメモリエディタにはDBxSTANDを用いていますが、基本的に「何でもOK」です。
ただし、サーチ範囲を指定できるものが理想です。
なお、この記事を書いてる現在、DBxSTANDの後継であるSTAND-Mxのベータ版が公開されていますが、
サーチ機能にバグが多いため今回は使用しません。

ターゲット セガガガ
序盤の敵相手にダメージ当てすぎ
RPGはとにかくパラメータがたくさん出てきます。
しかもゲージなどのように曖昧な表記も少なく、大抵、簡単にヒットしますので、
入門用としてこのゲームのパラメータをサーチしてみましょう。

作業1 ドリームキャストのメモリ情報が格納された場所を探す

ドリームキャスト(以後DC)エミュレータChankastは、実機をエミュレーションする際に、
Windows上に、DC実機と同容量のメモリエリアを確保します。
実機ではその中にBIOS・フラッシュメモリ・メインRAMなどを割り当てて作業域として使い、
Chankastでも全く同じ構造を採用することでエミュレーションを実現しています。

ただ、サーチするときに「Windows上(Chankastのプロセス)のどこにそのエリアがあるか」がわからなければ、
闇雲に全域を検索することになってしまい、膨大なデータを参照するのに必要な時間を考えると現実的ではありません。

そこで拙作のChanCalcを使います。
Chankastでゲームを開始した(Windows上にDC実機のメモリを再現した)状態まで進んだら、
ChanCalcを起動して、[Search]ボタンを押してやります。
この[Search]を実行する前にChankast側でRun→Pauseを実行してエミュレーションを停止しておけば、
CPU負荷が下がりサーチが高速化されますのでこちらを推奨します。

それが終わると完了報告のメッセージボックスが開くので、それを閉じると…
ChanCalcのサーチ結果
[Search]ボタンの隣に8桁の数列(私の環境では04290000)でアドレスが表示されます。
これはChankastを起動する度に変動する可能性があるので、サーチ前に必ず実行してください。

この数値こそが、Chankastのプロセスメモリ上に確保された仮想的なDCのメモリエリアの
アドレス00000000です。
つまりこのサーチを実行したChankastのプロセスのアドレス04290000には、
DC実機のアドレス00000000の情報が入っているということになります。
それではアドレス04290000以降をサーチ範囲としてパラメータサーチを行いましょう。
(もちろん環境によって04290000の値が変わりますので、読み替えてください)。

作業2 DBxSTANDで能力値をサーチ

やはりパラメータサーチといえばステータス書き換えがメインですね。
それではためしに能力値を書き換えてみましょう。

まずChankastを起動してChanCalcで基本アドレスを求めたらDBxSTANDを起動して、
Chankastのプロセスを指定します。
メモリエディタが開いたら、右下にある「サーチする領域」のチェックを全て外してください。
デフォルトでサーチ領域として表示されている範囲にDCのメモリエリアは含まれていないので、
(上でChanCalcでアドレスを求めたのも、これが理由です)
サーチする領域の欄の上で右クリック→新規追加で、下図のように設定します。
画像表示OFFの環境の方はゴメンナサイ
これで、アドレス04290000〜04FFFFFFの範囲がサーチ領域として登録されるので、
このDC MemoryMapをチェックしてサーチ可能にしましょう。
次にDBxSTANDのサーチ機能の[新規(N)]を押して初期パラメータを保存します。
ステータスの最大値は999なので2BYTE長が良いでしょう。

とりあえずLv.3の状態では、
体力 25 / 夢 10 / 情熱 11 / すばやさ 9 / 知力 7 / カリスマ 13
ですが、これらは多少順番違いがあっても連続で並んでいるということが考えられます。
なので体力のパラメータが格納されているアドレスを求めることで、
上記6つ全ての箇所が把握できる確率が非常に高いです。

そこで、数値・文字列をサーチの欄に、以下の文字列を入力します。
M25
そして[検索]ボタンを押せば、アドレス04290000〜04FFFFFFにある、
2バイトで10進数25(16進数19 00)の箇所がピックアップされます。
なお、1バイトならS25、4バイトならL25と指定します。
パラメータの最大値によって使用する型が違うということを覚えておきましょう。
(S=0〜255 / M=0〜655535 / L=0〜4294967295)

とにかく、上の1回目の検索で該当件数1230件になりました。
さすがに1230件も調べるのはかなり無謀ですので、範囲を絞り込みます。
現在のHPを表す「体力」ならば戦闘で簡単に変動しますが、こちらは能力値ですので、
無難に戦闘してレベルを上げちゃいましょう。
私は面倒だったので経験値を書き換えて1回の戦闘でレベルを上げましたが…。

さて、Lv.4になったとき、パラメータは
体力 27 / 夢 10 / 情熱 15 / すばやさ 11 / 知力 9 / カリスマ 13
に変化しました。
それでは、先ほどM25を入力した欄に、今度はM27を入力して[検索]を押しましょう。
当然の如く、一発で該当件数1件、アドレス0496DC74に絞り込まれました。
この周辺を見ると、能力値だけでなく各種ステータスが固まっていることもわかります。
ステータスいろいろ
上図から、アドレス0496DC70に現在のHP〜アドレス0496DC7Eにカリスマが、
2バイト毎に格納されているのがわかります。
試しにこの範囲の全てのパラメータに E7 03 (999) を書き込んでみましょう。
ステータスMAX!

そしてセガガガに画面を戻してYボタンでステータス画面を開くと…
改造成功
とまあ、こんな感じになるわけですねぇ。

作業3 実アドレスを求める

ここでヒットしたアドレス0496DC70は、初めにも説明したように毎回変動し、
他の人に改造コードなどの形式で情報提供することができません。

そこで、このWindows上のアドレスを「DC実機でのアドレス」に変換して、
改造ツールにこの値を指示してやる、という考え方があります。
改造ツール側が「どこからDC実機のアドレス00000000が始まっているか」を計算することで、
ユーザは環境依存する部分を気にすることなく「実機のアドレスを指定する」だけで、
改造コードを実行できるような仕組みですね。

ChanCalcにはこれらを相互変換する機能があるので、これを活用してみましょう。
実は 0496DC70 - 04290000 = 006DDC70なだけだったりする
上図のようにAddrConvert [Windows]->[DreamCast]の左欄にDBxSTANDでヒットしたアドレスを入力して、
[ -> ]ボタンを押してやれば右側に変換後のアドレスが表示されます。

…いや、これだけなんです(汗)。
理論的にわかる人は恐らく「ツール使うのも面倒くせぇし、エクセルでやってやるわ!」
と、もっと効率よくできてしまうはずです。
まあそこは各自の好きなようにしてやってください。

なお、AddrConvert [DreamCast]->[Windows]を使えば、今取得したアドレスから、
Windows上でのアドレスに変換することもできるので、一旦コードを作れば、
次からは再度パラメータサーチすることなく目的のアドレスを得ることが可能になります。
(当然、[Search]ボタンによるベースアドレス取得は必要ですが)。

とにかく、パラメータの範囲であるアドレス0496DC70〜0496DC7E全てを変換すると、
DC実機のアドレス006DDC70〜006DDC7Eの値を得ることができました。
この値はソフトウェアのバージョン違い(セガガガ初回版/通常版)などで異なる場合を除いて、
動的に確保しない限りは、必ず全ての環境で一致します。
それでは早速、改造コードにしてみましょう。

作業4 DreamHackerの改造コードを作る

ここがDreamHackerのコンテンツであるにも関わらず、一番最後に名前が出てくるのがトホホですが、
セガガガで常にパラメータをMAXに書き換える改造コードを作ってみましょう。
先に説明すると、改造コードは以下のようになります。

/セガガガ用改造コード〜講座用サンプル〜
*現在の体力と夢を999にする
006DDC70 03E7
006DDC72 03E7
*全能力値を999にする
006DDC74 03E7
006DDC76 03E7
006DDC78 03E7
006DDC7A 03E7
006DDC7C 03E7
006DDC7E 03E7
まず最初に、半角スラッシュ / の後にテキストを入力することで、
改造コードリスト上部にこの情報を表示することができるようになります。
主にゲーム名・作者名・注意点などを書くと良いでしょう。

半角アスタリスク * の後にコード効果を記述します。
「ここからコードが始まりますよ」という宣言になります。

続いて8桁のアドレス + 半角スペース + 書き込む値(1〜4バイト可変)の書式で、
改造コードを入力してやります。
一番上の *現在の体力と夢を999にする のコードの場合、
アドレス006DDC70に03E7(999)を書き込み、006DDC72に03E7(999)を書き込みます。
ここで気づいた方もいると思われますが、DBxSTAND上ではリトルエンディアン(E7 03)だったものが、
コード上ではビッグエンディアン(03E7)になっています。
これはプロアクションリプレイと同じ記述にするための仕様で、うっかり逆に書いてしまいそうになりますが、
気をつけてコーディングしてやってください。

また、後ろに03E7を書き込んでいますが、これは00(1バイト)〜FFFFFF(4バイト)まで、
自由にサイズを可変して使うことができます(例)63 = 1バイトで99書き込み / 0001869F = 4バイトで99999書き込み
プロアクションリプレイでは2バイト固定だったりと仕様がシビアだったのですが、
さすがにこの点は実用上に問題があるため改善させています。

基本的な構成としてはスラッシュ+アスタリスク+コード+アスタリスク+コード…
と連ねて記述することになります。

(例)DreamHackerの改造コードの書式

*アドレス00100000に10進数99を書き込む
00100000 63

*アドレス00100002に10進数999を書き込む
00100002 03E7

*アドレス00100004に10進数99999999を書き込む
00100004 05F5E0FF

*アドレス00100010がFFのときにアドレス00100011を00にする(今後の講座で説明します)
D0100010 FF
00100011 00
作業5 DreamHackerの改造コードを登録する

本来はメモ帳などで改造コードを記述し、ファイル名を「ゲーム名.DHK」として、
DreamHackerのサブフォルダ CODES に保存することで認識させるのですが、
コピペ機能を使ってカンタンに追加しちゃいましょう。

DreamHackerのメニューから[ コードをコピペ追加 ]を選び、
コード登録ウインドウ
中央の入力欄に先ほどの改造コードを入力して、保存コード名にはゲーム名などを入力して、
[保存]ボタンを押してやります。

これで…
登録完了
このようにゲームリストに先ほどのコードが追加され、使用可能になります。
メニューの[ Chankast捕捉 ]を実行してコードを有効にすれば完了です。

このとき CODES フォルダには先ほどの「保存コード名.DHK」のファイル名で、
コードファイルが保存されているので再編集する場合はそちらをメモ帳などで書き換えてください。

〜さいごに〜

以上が基本的な「パラメータサーチ→アドレス取得→改造コード作成」の手順です。
今回は扱いませんでしたが、今後、判定分岐コードなども組み合わせて、
もっと複雑なサーチ方法も紹介したいと思います。

おたのしみに〜♪


TOPに戻る