Home > スポンサー広告 > TempAR 1.59/1.62/1.63 の使い方 【後編】 rev 10

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コメント: -

Home > スポンサー広告 > TempAR 1.59/1.62/1.63 の使い方 【後編】 rev 10

Home > TempAR Manual > TempAR 1.59/1.62/1.63 の使い方 【後編】 rev 10

TempAR 1.59/1.62/1.63 の使い方 【後編】 rev 10


TempAR 1.59/1.62/1.63 の使い方【前編】 の続きです。
このエントリーでは、【サーチ】 に関して取り扱います。






  目次



リンクをクリックすると、各項目にジャンプ出来ます。(随時追加)
見出し横の▲▼をクリックすると、前/次項目へジャンプします。(随時追加)


サーチメニュートップ
サーチ範囲設定

固定値サーチ

変動サーチ
比較方式

サーチのヒストリー、アンドゥ、リセット機能
サーチ結果をコードに追加
サーチ結果のコードをCWC形式に変換して再登録する方法

実際のサーチ - 固定値サーチ編
 □MHP3rdの所持金
 □The 3rd Birthdayのプリレイズ使用フラグ
 □The 3rd Birthdayのプリレイズ使用フラグの計算箇所を操作

実際のサーチ - 変動サーチ編
 □MHP3rdの斬れ味
 □MHP3rdの斬れ味が常に最大値になるようにする
 □MHP3rdの飛竜1HPの変動アドレスをポインターコード化
 □The 3rd Birtydayのバリヤーの無敵タイマーを利用して無敵化


  サーチメニュートップ - [Searcher]





項目和訳説明
Find Exact Value固定値サーチ検索したい数字が分かっている場合に使用
Find Unknown Value - 8bit変動サーチ 8bit検索したい数字が分からない場合に使用 8bit
Find Unknown Value - 16bit変動サーチ 16bit検索したい数字が分からない場合に使用 16bit
Find Unknown Value - 32bit変動サーチ 32bit検索したい数字が分からない場合に使用 32bit
Find Textテキストサーチ-
Search Rangeサーチ範囲データが格納されるアドレス(ワークアドレス)の範囲が
おおよそ分かっている場合に設定することで、
検索時間短縮と検索Hit数の絞り込みが出来ます。
Reset Searchサーチ結果
リセット
検索を最初からやり直す場合に使用します。
Search Historyサーチ方法
利用履歴
方法だけでなく数値まで履歴に残ります。
アプローチ方法を変える参考に。


  サーチ範囲設定 - [Search Range]




[Search Range] のメニューに入ると、サーチする範囲を決定出来ます。
データが格納されるアドレス(ワークアドレス)のおおよその範囲が予想が出来る場合、
範囲を狭めることで検索時間の短縮と検索Hit数を減らすことが出来ます。





PRXでReal addressing ? True(実アドレス表記) 設定の場合はこうなります。




  固定値サーチ - [Find Exact Value]


使用するキー

キー機能
←→カーソル横移動
↑↓閲覧モード時 項目縦移動
データタイプ切り替え [8/16/32 bit]
スタート表示切り替え [10進数・ASCII・Float / OPコード]
×[閲覧|編集]モード切り替え
↑↓編集モード時 [アドレス/数値]変更


実際の画面


[Find Exact Value] で固定値サーチメニューに入りました。
初回は必ず32bitタイプの画面 になります。
2回目以降は、前回にセットした、bit数変更、OPコード表示を記憶しているので、
設定に応じた表示になります。





bit数を変更する場合は、□ボタンを押します。(現在16bitタイプ)





さらにbit数を変更する場合は、□ボタンを押します。(現在8bitタイプ)





数値を変更してみました。
←→でカーソルを横移動させ、10進数(DEC) の位置まで移動させれば、
10進数で数値を検索出来ます。





STARTボタンを押してみました。
10進数表示の代わりに、OPコードが表示されます。




  変動サーチ - [Find Unknown Value]


    比較方式

比較モード意味1意味2
Same前回と同じ
Different前回と違う
Greater前回より大きい
Less前回より小さい
Inc By 数値+数値前回から数値分増加
Dec By 数値-数値前回から数値分減少
Equal To 数値=数値数値と同じ (Exact Valueと同じ)
Not Equal To 数値≠数値数値と違う
Greater Than 数値>数値数値より大きい
Less Than 数値<数値数値より小さい


    変動サーチ画面


変動サーチをするには、サーチメニューから Find Unknown Value - **bit を実行します。
2回目以降のサーチは、Fixed ←→ Unknown の行き来は自由ですが、
データタイプの変更は出来ないことに注意してください。








基礎的な比較方式4つです。
初回変動サーチで現在の状態を記憶させた後に、
状態をほんの少しだけ変更したらDifferentサーチの実行を繰り返し、
ヒット件数をある程度まで減らしたら今度はSameで絞り込んでいきます。
まだヒット件数が多いうちにSameで検索すると未使用領域の0x00等にヒットしてしまい
なかなかヒット件数が減りません。
GreaterやLessは、正確な数字が分からないが増減が分かるときに使います。






前回からどれだけ数字が増減したか?の比較です。
元の数字がはっきり分からなくても、増減の数字が予測出来るときに使います。






Equal To はある数字に変化したのが分かっているときに。
Not Equal To はこの数字で無いことが分かっている時に使います。
例としては、Lessで検索すると0x00の検索結果が残ってしまうので
この0x00の検索結果を排除して検索結果を絞り込むのに役立ちます。
Equal To は、Continue to find Exact Vallue と同じ効果です。






『より大きい』『より小さい』 の数値指定が出来る比較モードです。





START ボタンを押すと、10進数・ASCII・Float / OPコード 表示を切り替えます。



  サーチのヒストリー、アンドゥ、リセット機能 - [History/Undo/Reset]


ヒストリー - [Search History]


[Search History]の下のペインに検索した履歴が表示されます。
画面下側に行くほど検索順が若くなっていきます。
画像の例では、一番最初にDifferent、次にLess、その次にSameで検索したということが分かります。
具体的な数値が分からず、DifferentとSameぐらいでしか検索出来ないときに、今どっちを検索していたか
分からなくなってしまったうっかりさんな人には有用ではないでしょうか。


アンドゥ - [Undo Search]


間違えた数字で検索してしまった。適切で無い比較式で検索してしまった。
そんな時にUndo Searchを実行すると1つ手前の検索結果に戻って
検索し直すことが出来ます。
アンドゥは多段階で手前に戻ることが出来ます。(おそらく無制限?)
リドゥはありません。

操作を間違えた訳じゃ無くても、数値のプラスマイナス方向が予想と違っていた、など
前に戻ってやり直したいときに効果を発揮します。

サーチリセットしてしまうと、それまでの検索履歴がリセットされしてしまい、
アンドゥで戻れなくなります。


リセット - [Reset Search]


リセットは、現在のサーチ結果を初期化して、最初からやり直したい場合に使用します。


  サーチ結果をコードへ追加


サーチ結果を全部追加 - Add Search Results


Add Search Resultsを実行すると、Search Results : XX Foundで表示されている
XX件を全てコードに追加します。(100件以上は試したことが無いのでそれ以上の挙動は不明。)



サーチ結果から1つ選んで追加 - Add Selected Cheat


Mode 0=Sameの行で↑を押すか、
Add Search Resultsの行で↓を押すと、
サーチ結果にカーソルが移動します。

あとはカーソルを移動させて、目的のアドレスを×ボタンでコードに追加出来ます。
Only showing first 100 (先頭から100件のみ表示)
という言葉が示すとおり、先頭100件しか表示されていないことに注意してください。


  サーチ結果のコードをCWC形式に変換して再登録する方法


サーチ結果のアドレスが変?

サーチ結果をコードに追加すると、AR形式で登録されます。
TempAR上からは確認できませんが、dbを開くと、コードヘッダは
_L ではなく、_M になっています。
また、アドレスがサーチ結果と微妙に違っていたり、
CWCでは見たことが無いような数字になっていることに気づくと思います。
この項では、サーチ結果をCWC形式に直して再登録する手順について書いていきます。

実際の手順


検索結果が2件ヒットしました。
上段の結果を×ボタンでコードに追加してみます。
現在のアドレス設定は、Real addressing ? Falseです。




[Cheater]画面でコードを確認します。
サーチから追加したコードを選択します。




△ボタンを押して、Edit Cheatを実行します。




0x08CB61B8 ← アドレス表示がこのようになっています。
0x004B61B8 ← サーチ結果の表示ではこうでした。

これは実アドレス表記(Real addressing)の為です。
詳しく知りたければ、『0x08800000』などで検索してみてください。




△ボタンを押して、コピーメニューを呼び出します。




適当なCopierを←→で選択して、Copy addressを実行し、アドレスをコピーします。
右側の情報表示に、Address = 0x08CB61B8 が入りました。
1行のコードならば、ついでに、Copy valueで数値もコピーしておきます。




[Browser] タブに切り替えます。
音量+-を押して、Browser0~9の適当な場所を選択します。
使い方が分からなければ、Browser0で構いません。
現在のアドレスは、0x00000000 になっています。




△ボタンを押して、コピーメニューを呼び出します。
先ほどコピーしたアドレスが入っている Copier を選択します。




Paste address でアドレスを貼り付けます。




0x08CB61B8 を貼り付けたにも関わらず、現在のアドレスが、
0x004B61B8 に移動しました。




アドレスを移動せずに、そのまま△ボタンを押して、コピーメニューを呼び出します。
Copy address でアドレスをコピーします。




右側の情報表示に、Address = 0x004B61B8 が入りました



[PRX] タブに移動して、Add new cheat #1 line(s) long の行を選択します。
行数を←→で選択した後に、□ボタンを押して、CWC形式のコードを作成します。




コード編集画面になりました。




△ボタンで、コピーメニューを呼び出し、
先ほどコピーしたアドレスが入っている Copier を選択した後、
Paste addressを実行し、アドレスを貼り付けます。




アドレスを貼り付けて変更しました。



ついでに、Paste valueを実行し、数値も貼り付けます。




数値を貼り付けて変更しました。




コードの命令が違うので先頭の数字を書き換えて完了です。



コードタイプCWCheatPSPAR
0x0aaaaaaa8bit書き込み32bit書き込み
0x1aaaaaaa16bit書き込み16bit書き込み
0x2aaaaaaa32bit書き込み8bit書き込み
これはほんの一例です。PSPARとCWCheatとでは、コードタイプがかなり異なります。
これ以外の命令に関しては同梱のマニュアルやwiki等を参照してください。

まとめ

冗長なので、簡単にまとめます。

1. サーチからコード追加
2. [Cheater] から追加したコードのアドレスをコピー
3. [Browser*] でアドレスを貼り付け
4. [Browser*] でアドレスが自動変換される
5. [Browser*] でアドレスをコピー
6. [PRX] から□ボタンで新規コード追加
7. [Cheater] から手順6で追加した新規コードにアドレスを貼り付け
8. コードタイプを変更


  実際のサーチ - 固定値サーチ編


固定値サーチ

固定値サーチでサーチ可能なデータの一例

・画面で数値が確認できる類のデータ (経験値/お金/アイテム個数 等)
・画面で数値が確認できる類のデータの画面表示用データ (上に同じ)
・フラグ/速度/透明度/カーソル位置等

PSPのゲームの解析した本数が数本と少ないのでPSPに関しては詳しく知りませんが、
PCゲームの場合ですと、この手の書き換えやすいデータに関しては、
データを暗号化して格納(XORでシンプルなものから色々)していたり、
数値改竄検出用チェックサムで数値書き換えを検出するとゲームが落ちたり
データを2重化して常時相互チェックして数値が書き換えられたら
互いに正しい数値で書き換え直す等
ソフトメーカーによっては改造対策が施されていることがあります。

しかし、対策されていないソフトであれば、簡単に発見して書き換えられますので、
サーチを始める人が最初に手を出すのに適したサーチ方法でしょう。

主なメリットとしていくつか挙げてみます。

1. サーチ時間がかからない
2. サーチのヒット件数が少ない
3. 具体値を入れるので特定が容易である。
4. 固定値サーチで他のアドレスを特定しておけば
  変動サーチを行う際の足がかりとしてアドレス範囲を再利用出来る。


固定値サーチの例1

MHP3rdで、所持金(ゼニー)を固定値サーチで検索してみます。



ゲームはMHP3rdです。ゲーム開始時に所持金を1500zもらいます。




Find Exact Value で固定値サーチを開始します。




カーソルを→に動かして、Dec(10進数)の下にカーソルを持って行きます。
×を押して編集モードにし、↑↓で数値を変更して1500にします。その後、×ボタンを押します。
カーソルを↓に動かして、Search を開始します。



サーチのヒット件数が42件と表示されました。




条件を変えることで絞り込みをさせ、サーチのヒット件数を減らします。
げどく草を買って、1480zにしてみました。




Continue to find Exact Valueを選択して、今度は1480で検索します。
サーチのヒット件数が1件になりました。

0x013A5E24 というアドレスが、もし所持金のアドレスであったならば、
近くのアドレスにユクモポイントやギルドポイント、所持アイテム種類や個数などの、
プレイヤーが確認出来る数値がおそらく格納されているだろうと推測できます。




カーソルを↑↓でアドレスまで移動させ、×ボタンを押してコードに追加します。




[Cheater] 画面に移動して、今追加したばかりのコードを選択します。




△ボタンでサブメニューを呼び出し、Edit cheat を実行して
数値の編集を行います。




サーチ時の数字の1480がそのまま入っています。
数値変更せずにこのままコードを有効にして、何かを買ってみて有効性を
確認してからでもいいんですが、説明を端折ります。
所持金最大値にしてみます。
そのまま数値に 9999999 を入れても構いませんが、少ないキー操作で数値を変えたい場合は
次に進んでください。




△ボタンでコピーメニューを呼び出します。
Value = 0x00000000 になっているCopierに切り替えて、Paste Value を実行します。




1480 だったのが、0 になりました。




1000万の桁で↑を1回押して、0010000000 (1000万) にします。




1の桁で↓を1回押して、0009999999 (999万9999) にします。




[Cheater] トップに戻り、×ボタンでコード有効 [Y] にし、♪ボタンで [CHEAT ON] に変更します。




所持金が変更されました。

数値がそのまま格納されているようなデータは、固定値サーチで簡単に見つかります。
ゲームによっては、数値に0の下駄を履かせていたり、
表示されている数値と内部の数値が違ったりしますので、
見つかったアドレスが画面表示用だった、というのはよくある話です。



固定値サーチの例2

The 3rd Birthday で、フラグをサーチしてみます。
フラグの管理方法にも複数有り、
状態毎に1byteずつアドレスを確保して00/01/FFなどで表現するタイプ、
複数の状態を2進数でビットを立ててまとめて表現するタイプ、
などがあります。

固定値サーチでダメ元でやってみて、ヒットしないようなら
変動サーチを試します。それで駄目なら解析するしか無いでしょう。




プリレイズの使用回数を無制限にしてみます。
まずは、OEチップのプリレイズを装備しておきます。
バリアーは無い方がいいですが、合っても発動率が低いので無視して構いません。




プリレイズがすぐに発動できるように、ディフェンスCのコスチュームを装備します。
ボスとすぐに遭遇出来て、すぐに攻撃してくれるEpisode 1-1のGenocideを選びます。




プリレイズの使用回数がどのように管理されているのか、処理を想像してみます。

1. プリレイズ残り使用回数カウンタがあり、未使用で1、使用済で0、になる。
2. プリレイズ使用済みカウンタがあり、未使用で0、使用済で1、になる。

プリレイズを持っていない時はおそらく0でしょう。
ならば、持っていても未使用の場合は0の方がプログラムの都合がいいはずです。
2番の考えを元にサーチしてみることにします。

初回サーチに0をサーチすると、サーチ時間が長くなるので、1から始めます。




敵の攻撃を食らって死亡しました。




プリレイズが発動して、蘇生します。
おそらく、カウンタの数字に1が入っていることでしょう。
固定値サーチで1をサーチします。




ゲーム上のスタートボタンでメニューを呼び出し、Retry でやり直します。
死亡する前ということで、固定値サーチで0をサーチします。

この後は、キャラを適当に動かしたり、攻撃したり、メニューを呼び出したり、
動かす毎に0でサーチして、サーチのヒット件数を絞ります。

わざと死亡してプリレイズを発動させ、1でサーチしたら、
キャラを動かしたり、メニューを呼び出したりして、また1でサーチします。
これらを複数回繰り返すと、ヒット件数が1-2件になるはずです。




0x014AB11A というアドレスを8bitで0x00に固定したら、
アヤさんが何度死んでも生き返るゾンビになりました。

_C0 PreRaise Counter 0
_L 0x014AB11A 0x00000000




固定値サーチの例3

固定値サーチでプリレイズフラグのアドレスを特定したのでPSPLINKで解析してみます。
内容だけに文字だらけで読みにくいかと思います。すみません。




まず、敵の攻撃を食らって死亡します。
プリレイズが効果を発揮する手前でスタートボタンを押して
メニューを呼び出して時間を一時停止させます。





pspsh のウィンドウで、ブレークポイントをセットします。
プリレイズフラグのアドレス(0x014AB11A) に書き込む箇所が知りたいのでオプションはwです。
hはハードウェアブレークポイントです。
bpset 0x014AB11A+0x08800000 w

画像の例では実アドレスなのでそのままアドレスを打つだけですが
実アドレスでない場合は、0x08800000を加算する必要があります。
解析する場合は実アドレスの方が都合が良いので、
Real addressing オプションを有効にした方がいいですね。

スタートボタンで一時停止を解除し、ゲームを再開させてプリレイズを発動させます。
実際にはプリレイズのエフェクトが出る前に計算が行われ、この箇所で停止する為
プリレイズが発動したかどうかは画像では確認出来ません。





上記のアドレスでゲームが停止し、ブレークします。
0x0897BCD0: 0xA0A49C1A  sb a0, -25574(a1) (PSPLINKは実アドレス表示です)

savemem 0x08800000 0x01800000 T3B.bin
と打ち込んで、PCにメモリダンプファイルを保存します。ファイル名は適当で結構です。





PS2disを開き、今ダンプしたファイルをD&Dします。
ファイルのアドレス 00000000、 メモリアドレス 08800000
開いたダイアログにセットします。





PS2disで、編集-指定のアドレスにジャンプ(ホットキーG)を実行し、0897BCD0 を入力します。

0897BCD0  sb  a0, $9c1a(a1)

sb はストア命令で、a1 レジスタに格納されている数値に $9c1a を符号拡張した数値を加算し、
この数値をアドレスとして扱い、a0レジスタに格納されている数値の最下位バイト(x86で言うALなど)を
先のアドレスに代入しろ、ということなので、ここでおそらくプリレイズ使用フラグ=1が
書き込まれていると推測できます。





a1レジスタの中身を確認します。
pspsh で exprint と打つと、レジスタの中身が見られます。
a0 : 0x00000001 となっています。プリレイズ使用済フラグ=1が入っていると思われます。
a1 : 0x09CB1500 となっています。
これに $9c1a を加算する訳ですが、$9c1aの符号拡張が必要です。





うさみみハリケーンの付属品の UsaMimi Expression Calculator / Converter を起動し、
0x9C1A を打ち込みます。
次に、最下段にある、符号付きByte/Wordのチェックボックスにチェックを入れます。

0x9C1A は符号拡張すると、-25574 になることが分かりました。(PSPLINK上では最初からこの表記です)





では、0x09CB1500-25574 を計算するといくつになるか、
このまま UsaMimi Expression Calculator で計算します。
0x9CAB11A という数値になりました。
この数値は 0x014AB11A を実アドレス表記に直した場合と全く同じです。

0x0897BCD0: 0xA0A49C1A  sb a0, -25574(a1)
つまり、この行で代入されているということが確認出来ました。





a0 レジスタに1が代入されるタイミングを見てみます。
アドレスを遡ると、以下のような命令があります。
0897BCC8  li a0, 00000001
a0 レジスタの下位16bit(x86でいうAXなど)に 00000001を代入しろという意味です。

プログラムを書き換える場合は、分岐を書き換えたり、つぶしたり、
代入する即値やレジスタを変えてみたり、色々なやり方があるわけですが、
手っ取り早く、代入される即値を書き換えてみます。





PS2dis上で、0897BCC8 の行をダブルクリックします。





liの命令がoriになっていますが、詳しく書くと長くなるので端折ります。
プリレイズが発動して、使用済みフラグが $0001 で代入されるというのならば。




$0000 が代入されればいつでもプリレイズが使える訳なので、
$0000 に即値を書き換えてみます。(変更ボタンを押す必要はありません)
マシン語で 0x34040000 がアドレス 0x0897BCC8に入ればいいらしいことが分かりました。


後は、これをコードに直して、登録するだけです。
TempAR の [PRX] タブに移動し、
Add new cheat #1 line(s) long の項目で
×ボタンを押して、AR形式で追加します。
アドレス 0x0897BCC8
数値 0x34040000

AR形式
_C0 PreRaise li 0 ASM
_M 0x0897BCC8 0x34040000

□ボタンを押して、CWC形式で追加するなら。
CWC形式に直すと
_C0 PreRaise li 0 ASM
_L 0x2017BCC8 0x34040000

もしくは
_C0 PreRaise li 0 ASM
_L 0x0017BCC8 0x00000000


  実際のサーチ - 変動サーチ編


変動サーチ

変動サーチでサーチ可能なデータの一例

・画面で数値が確認出来ない類のデータ
 (ステータス/座標/モーション/アイテム種類/時間/速度/フラグ/キャラ等)
・画面で数値が確認出来る類のデータ
 (数値が具体的に分かるなら、固定値サーチの方が時間がかかりません)

変動サーチは以下のような特徴があります。

1.サーチ時間がかかる
2.ヒット件数が多い
3.固定値サーチでサーチ出来ないものが見つかる

固定値サーチに比べてヒット件数がやたら多く、絞り込む際の障害になりえます。
8bitでsameとdifferentだけではヒット件数が減らないこともしばしば。
他のコードのアドレスから予想してサーチ範囲を狭めてみたり、
予想出来る数値を使ってみたり(モーションで何もしない時は0x00だろう等)
大小を想像してlessやgreaterを使ってみたり(ダガーよりエクスカリバーの方がアイテムIDが大きいだろう等)
上記のようなちょっとした工夫でサーチにかかる時間を減らすことが出来ます。

プログラマーの人なら数値をどうやって管理しているかだいたい想像が付くでしょう。
プログラマーではない人の場合、何で検索するかというアイデアは、その人の経験の
蓄積がものを言うので、普段から色々考えながらサーチするといいですね。

変動サーチの例1

MHP3rdで、斬れ味を変動サーチで検索してみます。



変動サーチの初回は、現在の値を記憶するという機能です。
クエストに出て、変動サーチを開始してみます。




[Search Range] に入り、サーチする範囲を設定します。
サーチしやすい所持金などのいくつかの固定値サーチを行うと、
0x01300000付近のアドレスにデータが固まっていることが分かります。
クエスト中のステータス関係をサーチすると、0x00D00000付近の
アドレスにデータが固まっていることが分かります。
斬れ味はどちらのグループに入るか考えます。
斬れ味はクエスト関係ですから0x00D00000付近でしょう。
開始0x00D00000 終了0x00E00000 と範囲を設定してみます。
狭いですが、見つからなかったら少し広げてやればいいだけです。




もしこのゲームが完全なオリジナルな新作で、シリーズの続編で無い場合、
過去のシリーズの知識が通用しないわけで、何bitを選ぶか困るところです。
でも斬れ味の役割からして32bitのデータ長を選択する意味はなさそうなので、
8か16のどちらかということは想像出来ます。
1回斬ったら最低1減ると予想した場合、双剣で斬りまくれば
8bitの256回くらいすぐに超えそう、ということで16bitを選択します。

これで初回の変動サーチが記憶されました。




適当に何かを斬って、斬れ味現在値を減らします。




斬ったら斬れ味が減っているはずなので、前回より減っているという意味の Less でサーチします。
Less やDifferentを使う場合は、目的以外の行動を控えてサーチすると、素早くヒット件数を減らせます。




ゲームに戻ったら、何も斬らずに、色々動いたりウィンドウを表示したりしてみます。




前回と同じという意味の Same でサーチします。
Sameを使う場合は、目的の行動は起こさずに、それ以外の行動を色々起こすことで
目的のアドレス以外の数値が変化し、素早くヒット件数を減らせます。




砥石を使って、減少している斬れ味現在値を増加させます。




前回より増えているという意味の Greater でサーチします。




斬れ味を減らしてLessでサーチ、斬れ味そのままでSameでサーチ、
斬れ味を回復させてGreaterでサーチ、これらをヒット件数が減るまで繰り返します。
0x00000000 がヒットしている場合は、Not Equal To = 0x00000000 で除外できます。

最終的には、0x00D42726 というアドレスが見つかるはずです。
代入する数値の上限が分からないので適当に入れます。
フリーズするようなら現在値を参考に数値を低めに設定します。
もしくはプログラムを書き換えることでどうにかなるかも知れません。

_C0 Sharpness
_L 0x10D42726 0x0000hhhh
※hhhhは適当な数字



変動サーチの例2


変動サーチの例1にて、MHP3rdで斬れ味のアドレスが分かりました。
これをPSPLinkで解析してみます。
【 固定値サーチの例3 】を読んでいることを前提に話を進めます。
文字ばっかりで読みにくいです。


1 psplink.prxを有効にした状態で、usbhostfsとpspshを起動し、
  pspshのウィンドウをアクティブにします。

2 ブレークポイントを斬れ味のアドレスにセットします。Enterはまだ押しません。
  bpset 0x00D42726+0x08800000 w

  敵を攻撃すると同時にEnterを押し、斬れ味減少時書き込む関数にブレークさせます。
  0x09CE9688 a6221416 sh v0, $1416(s1)

4 savememでダンプを出力します。
  savemem 0x08800000 0x01800000 MHP3.bin

  exprintでレジスタを表示させます。
  exprint

  メモするのが面倒なら、DOSのリダイレクトを使ってテキストに出力します。
  ファイル名は適当で構いませんが文字に制約があります。(空白が使えないなど)
  exprint >MHP3_register.txt

  s1=0x9541310 v1=0x000000qq
  s1には斬れ味現在値アドレスの基準アドレスが、
  v1には斬れ味現在値が格納されていることが分かります。

5 ダンプしたファイルをPS2disでメモリアドレスを08800000に指定して読み込みます。
  
  ブレークした周辺をPS2disで見ていきます。

  09ce967c s1=0x9541310 斬れ味現在値をa1にunsignedでロード。
  09ce9680 a1=斬れ味現在値にs0=斬れ味増減値を加算してv0にunsignedで格納。
  09ce9684 調べてません
  09ce9688 v0=斬れ味計算後の数値を 斬れ味現在値のアドレスにストア。
  09ce968c v0=斬れ味計算後の数値をa1にunsignedで格納。
  09ce9690 v0=斬れ味計算後の数値が0以下なら0x09ce97dcへ分岐。
  09ce9694 何もしない(ディレイスロット)
  09ce9698 斬れ味最大値をv1にロード。
  09ce969c 調べてません
  09ce96a0 s3に0をunsignedで格納。09ce9760の判定用にs3を初期化。
  09ce96a4 v1=最大値 v0=現在値 現在値が最大値を超えていたらv0に1をセット。それ以外なら0をセット。
  09ce96a8 v0=0で無い場合、現在値が最大値を超えた場合は、09ce9760に分岐。いわゆる最大値判定。
  09ce96ac 何もしない(ディレイスロット)


6 アドレス 09ce96a8 でカーソルキー→を押して分岐先にジャンプします。
  
  分岐先の最大値代入箇所。

  09ce9760 v1=斬れ味最大値をa1に格納。
  09ce9764 s3に1をunsignedで格納。『斬れ味が最大になった』メッセージフラグ用。
  09ce9768 v1=斬れ味最大値を 斬れ味現在値アドレスにストア。


7 プログラムを書き換えます。

  今回の斬れ味の場合だと…
  斬れ味を増減させている箇所を増減しないように計算方法を変えてやるか
  09ce9680 24a20000 addiu v0,a1,0

  『最大値判定』を利用する場合ならば、
  『斬れ味最大値を超えた場合』分岐に必ず飛ぶようにv0に1を代入すればいいので
  09ce96a4 34020001 ori v0, zero, $0001

  これだけだと1回斬る毎に『斬れ味が最大になった』メッセージが出てしまうので
  フラグのs3に0を代入してやります。
  09ce9764 24130000 addiu s3, zero, $0000


  あとは、コード化して最初にクエスト判定を入れれば、下と同じコードになります。
  【MHP3 CWC 2chまとめ】切れ味落ちない

8 いわゆる『○○したらMAX』というコードのパターンがこれです。
  たいていの場合最大値分岐があるので、必ず最大値分岐に飛ぶように書き換えるだけです。
  現在値アドレスに書き込む関数のちょっと後ろにたいてい最大値判定があります。
  周辺をよく見ると、最大値らしい値が並んでいることが分かります。
  難易度的にゲーム解析を始めたばかりの人が挑むにぴったりですし、実用性も高いので
  興味があれば試してみてください。

  メリットとして、プログラム直接書き換えは、ポインターアドレスを割り出す必要が無かったり、
  ダメージが現在値を上回った時の一撃死を防ぐことが出来たりします。
  (当たり判定操作=無敵の話は横に置く。)

  CWCなどの連続書き込みは、現在値が格納されているアドレスに数値を上書きし続ける動作ですが、
  敵が現在HPを上回る攻撃をしてきた場合、HPが0以下になった瞬間に死亡判定が発生し
  HPを上書きしても死亡判定は別なので一撃死に対処することが出来ません。
  常に一定の値が入るようにしたり、減算カットするようにプログラムを書き換えることで
  一撃死にも対応出来ます。(敵がキャラを掴んで一撃死させてくるようなのはまた別の話)


変動サーチの例3

MHP3rdで、飛竜1のHPのアドレス(シングルポインター)を変動サーチで検索してみます。
文章は短いですが画像が多めなのでかなり長い記事になっています。




何のクエストでも構いません。ここでは、訓練所の基礎訓練9を受注します。
ドスジャギィが対象です。




クエストを開始したら、初回の変動サーチを実行します。
何bitに設定するかは過去のシリーズがあるので、見当が付きます。
シリーズ物で無ければ勘ですね。




ドスジャギィを攻撃してHPを減らします。




HPの数値が減っているはずなので、Less でサーチします。



HPが100より少ない訳ないだろう、という推測の元に
Greater Than 100(10進数) でサーチ。

ヒット件数を絞り込むコツは各自で色々会得していると思います。
ここでは自分なりにやってみます。このやり方が唯一正しい方法という訳では無いので、
各自好きなやり方で絞り込んでください。




MHFじゃあるまいし、ドス雑魚のHPが1万もあるわけないだろう、という推測の元に
Less Than 10000(10進数) でサーチ。




ゲーム画面に戻り、敵を攻撃しなければ(継続してダメージが入るような攻撃はしない)、
HPに変動が無いはずなので、Same でサーチ。




ドスジャギィが死亡してないのに、HP=0 のはずが無いので
Not Equal To 0でサーチ。




ドスジャギィだけ攻撃していると、HPと同様に減少するものがあります。
それは斬れ味ですね。雑魚を斬るか、斬れ味をコードで固定するか、砥石で研ぎます。




最終的にヒット件数が1件になりました。
変動アドレスなので次のクエで役に立たなくなったりしますが、
ポインターアドレスを割り出す際に必要になります。
アドレスを何かにメモするか、×ボタンでコードに追加しておきます。




コードに追加した後の編集画面です。
Real Addressing ? False 設定ならサーチ画面では実アドレス表示ではありませんが
サーチからのコード追加は必ずAR形式で処理されるために
実アドレス表示になっていることに注意します。




ドスジャギィのHPを0まで減らします。




一撃与えただけで討伐出来ました。




TempARには監視アドレス機能が無いので、その代わりに Browser0
今のドスジャギィのHPのアドレスを貼り付けておきます。

クエスト毎に飛竜のHPは決められています。他のクエストを開始したら
Browser表示の数値をチェックし、飛竜のHPが入っているかどうかを確認することで、
アドレスが変動したかどうかが分かります。こうすることでサーチする手間が省けます。
飛竜のHPが分かっている場合の2次的な使い方のわけですが。



アドレスの範囲の予想がついたので、適当に Search Range を設定します。




今の状態のメモリをダンプしておきます。
このダンプファイルは後にツールで使用します。
スロット番号(Slot # 0) と、今回のドスジャギィのHPのアドレスの
組み合わせを忘れないようにメモしておきます。
Slot #0 - 0x01687106




飛竜のHPのアドレスはクエスト毎に再計算されます。
新しくクエストを受注します。




アオアシラに攻撃してHPを減らします。




ヒット件数が1件になりました。前回とは違うアドレスのようです。
同じアドレスになることもあるので、違うアドレスが割り当てられるまで
クエストをリトライします。




違うアドレスなので、メモリダンプしておきます。
前回と違うスロットに保存します。Slot #1に保存することにします。
(TempARが自動的に数値を繰り上げてくれます)
スロット番号とアドレスの組み合わせをメモしておきます。
Slot #1 - 0x01687656




Browser1 にアオアシラのHPのアドレスを貼り付けます。




アオアシラのHPを減らします。
メモリエディタの表示は当然ながらリトルエンディアンです。
リトルエンディアン表示が分かりにくければ
追加したコードから数値操作でも構いません。




ゲームに戻ってしばらくすると、飛竜が瀕死時の行動を取り始めます。
足ひきずり移動+巣に戻って回復行動を取ろうとしますね。




アオアシラのHPのアドレスが正しいことが分かりました。




ms0:/seplugins/TempAR/ 以下に dump*.ram というファイルが生成されています。
これは先ほどメモリダンプのファイルです。パソコンにファイルを移動します。




Multi Pointer Searcher】でポインターアドレスを特定します。
ここでメモリダンプしたファイルが必要になります。
画像は、起動しただけのところ。




File 1 で『開く』を押すかD&Dで dump0.ram を読み込みます。




アドレスにドスジャギィのHPアドレスを入力します。0x1687106




File 2 で『開く』を押すかD&Dで dump1.ram を読み込みます。




アドレスにアオアシラのHPアドレスを入力します。0x1687656




解析ボタンを押して、解析処理が終了したところ。
アドレス候補があるようです。




リストの箇所をクリックすると、リストボックスが開きます。
★のある行をクリックします。




右下のコード作成ボタンから、←→で候補を選んでコード化を実行します。




出力されたテキストファイルにCWC形式でポインターコードが記述されています。




テキストファイルにポインターアドレスとオフセットが記述されています。




CWC形式の場合
_C0 BOSS1_HP
_L 0x60324A10 0x00000000
_L 0x00010001 0x00000246


AR形式に直すと
_C0 BOSS1_HP
_M 0x60324A10 0x00000000
_M 0xB0324A10 0x00000000
_M 0x10000246 0x00000000
_M 0xD2000000 0x00000000





PMEtan付属の変換ツールなら簡単に変換出来ます。



変動サーチの例4

無敵化するには、無敵タイマーを利用したり、
無敵フラグを利用するなどのいくつかの方法があります。
とりわけ難易度が低いのは、無敵タイマーを利用する方法です。
これなら解析しなくてもサーチだけで無敵化が可能だったりします。
今回は無敵タイマーを利用して無敵を実現してみましょう。

まずは、ゲーム中で無敵になる瞬間を列挙してみます。

・敵にやられた際の吹っ飛び中無敵
・ダウン中のダウン無敵
・起き上がり中の起き上がり無敵
・死亡後の復活無敵
・前転などの回避無敵
・その他のアイテムや能力による強制無敵
・イベント中のイベント無敵
・エリア変更時のエリア変更無敵
・クエスト開始時のクエスト開始無敵
・etc ...など探せば色々あります。


これらは、以下のような形でタイマーが利用されていることが多いです。
無敵タイマーセット→ゲーム時間進行で徐々に減少→0以下かどうか判定
→0以下なら無敵が切れる

データの形式はゲームによってまちまちですので一概には言えませんが
時間を浮動小数点で表記している場合なら32bit
時間をフレームで表記している場合なら8/16bit
である場合が多いようです。




TempAR_usage_1007
ここではThe 3rd Birthday でバリヤーを利用して無敵にしてみます。
まず、OEチップのバリヤーを装備して発動させます。




TempAR_usage_1007
[Search Range] に0x01400000 - 0x01500000 をセットします。
このアドレス範囲をセットした数字の根拠は、他のステータスが
0x014A00000付近に格納されているからです。




TempAR_usage_1007
データタイプは何で格納されているか分かりません。
全部試してみるしかありません。

実はHPが浮動小数点で格納され、他の無敵タイマーも浮動小数点ということを
知っているので32bitにセットしちゃいます。




TempAR_usage_1007
ゲームに戻ってゲーム時間を経過させたら、すぐにスタートボタンでメニューを
呼び出して時間経過を止めます。
時間経過でタイマーの数値が減少しているはずなので、Less でサーチします。




TempAR_usage_1007
無敵中なら無敵タイマーが0のはずがないので、
Not Equal To = 0x00000000 でサーチします。



TempAR_usage_1007
無敵が切れたら無敵タイマーが0のはずなので
Equal To = 0x00000000 でサーチするか、
Continue to find Exact Value で 0x00000000 をサーチします。

その他、タイマーに浮動小数点で数字が入っているなら
Less than 0x80000000 (浮動小数点で-0.0)でサーチしたり
Greater Than 0x3F000000 (浮動小数点で+0.5)でサーチして
絞り込むのも悪くない方法です。

最終的にヒット件数が3つになりました。
全部同じ数値を指しています。どれか1つが当たりです。




TempAR_usage_1007
当たりは 0x0146F09C でした。

CWC形式でコード化してみます。
数値は浮動小数点で適当に入れています。HPの最大値と同じ数値にしてみました。
TempARの割り込みタイミングの間隔までにタイマー減少で0にならない程度の
大きさの数字を入れればどんな数字でも問題ありません。

_C0 BARRIER TIMER
_L 0x2146F09C 0x461C3C00

これだと敵の攻撃に全く当たらない、いわゆる無敵とは若干違いますね。
この先は貴方自身の手でサーチしてみてください。





関連記事
スポンサーサイト

コメント: -

Home > TempAR Manual > TempAR 1.59/1.62/1.63 の使い方 【後編】 rev 10

Return to page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。