ジルオール 〜インフィニット〜

キーワード
レジスタ
ワークアドレス


内容
簡易アドレスサーチ


セーブデータの値から数値サーチしワークアドレスを所持金に表示させる

大抵のソフトはステータス等セーブデータでまとまっていればセーブのアドレス差と同じ分ワークアドレスが
離れていますがこのソフトはセーブデータのアドレス差からワークアドレスの差を計算することは出来ません
セーブデータのアドレスとワークアドレスはこの様になっていますので見て下さい

セーブ:ワーク:効果
12B0:00B6667C:所持金
4311:00B65EC1:マップフラグ
主人公
195F:00B67016:Lv
1960:00B670F8:好感
1962:00B670EE:最大HP
1964:00B670F0:現在HP
1966:00B670F2:最大MP
1968:00B670F4:現在MP
196A:00B67010:Exp
1972:00B670EC:+40仲間加入
1976:00B67020:STR
1977:00B67021:VIT
1978:00B67022:INT
1979:00B67023:MIN
197A:00B67024:AGI
197B:00B67025:DEX
197C:00B67028:ソウル習得
1980:00B6702C:Brave
1981:00B6702D:Kind
1986:00B67032:Cool
1988:00B67034:スキルポイント
198C:00B6703C:スキル
1990:00B67040:スキル
1994:00B67044:スキル
19A4:00B67038:ソウルポイント
19A8:00B67018:精霊ポイント
19AA:00B6701A:精霊ポイント

主人公の右手武器
19C1:00B67069:グラフィック
19C8:00B6706C:形状・強度・種類
+0001=形状A  +0000=ソード
+0002=形状B  +0040=グレートソード
+0003=形状C  +0080=槍
+0004=形状D  +00C0=斧
+0005=形状E  +0100=ショートソード
+0006=形状F  +0140=弓
+0008=強度1  +0180=ナックル
+0010=強度2  +01C0=盾
+0018=強度3  +0200=クロース
+0020=強度4  +0240=ブレストプレート
+0028=強度5  +0280=ボディアーマー
+0030=強度6  +02C0=プレートアーマー
+0038=強度7  +0300=アクセ

19CA:00B6706E:ECLv・属性
+0000=1  +0000=無
+0010=2  +0080=火
+0020=3  +0100=水
+0030=4  +0180=土
+0040=5  +0200=風
+0050=6  +0280=闇
+0060=7  +0300=聖
+0070=8

主人公の防具
1A0A:00B670AA:属性

+は同じ項目のもの武器の種類であれば種類の値を排除して論理和する

セーブデータでは付近にあってもワークアドレスでは付近にはない事が多いので連続書き込みで
範囲を調整してセーブ、その部分が変更されていればその範囲の中にワークアドレスがある。という
手法でもいいんですがそれだとかなり手間がかかります
その手間を減らそうと作ったコードがこちらになります

簡易アドレスサーチ(アドレス$00B67004〜$00B670FC)

データから主人公のアドレス表示(1バイト)
1C9A0328 145627C6
1C9A032C 204DE753
1C9A0330 832C37A1
1C9A0334 284BE7xx
1C9A0338 C38BE7A6
1C9A033C 373437A1
1C9A0340 374EE7A6
1C9A0344 2B52E70E
1C9A0348 07D6B00E
1C9A034C 372DE7A6
1C9A0350 15F6E79D
1C8FE060 0C53C7A5

データから主人公のアドレス表示(2バイト)
1C9A0328 145627C6
1C9A032C 204DE753
1C9A0330 872C37A1
1C9A0334 284Bxxxx
1C9A0338 C38BE7A6
1C9A033C 373437A1
1C9A0340 374EE7A6
1C9A0344 2B52E78A
1C9A0348 07D6B00E
1C9A034C 372DE7A7
1C9A0350 15F6E79D
1C8FE060 0C53C7A5
xにセーブデータの数値を入れると所持金にそのデータがあるアドレスが10進数で表示されます

ただこれはxに入れたデータと同じであれば所持金へはき出すだけですから複数箇所があると
一番最後の箇所のアドレスが出ます
その場合はslti命令の値を低くすることでアドレス範囲が減りますのでそれで調整していきます

データから主人公のアドレス表示(2バイト)はこの様になっています

000f8000 addu  t0, zero, zero
000f8004 lui   t1, $00b6        t1=$00b60000
000f8008 lhu   t2, $7004(t1)      t2=$00b67004
000f800c ori   t3, zero, $0201     t3=$00000201
000f8010 beql  t2, t3, $000f8018
000f8014 addiu  v0, t1, $7004      v0=$00b67004
000f8018 addiu  t0, t0, $0001      t0=$00000001
000f801c slti  t4, t0, $007d            
000f8020 bne   t4, zero, $000f8008
000f8024 addiu  t1, t1, $0002      t1=$00b60002
000f8028 jr   ra

青いバーの所がxのデータで
v0は所持金のデータをロードした時に使用されているレジスタ

この時注意しなくてはいけないのはバイナリエディタではリトルエディアンで表示されているので
ビッグエディアンにしなければいけません
例えば
01 02 03 04
これを反対にする
04 03 02 01
この様にしてxに入れると後は同じデータがあったアドレスを出してくれます

これを踏まえこの様にして名前やマップ・禁呪のフラグのアドレスを見つけました

簡易アドレスサーチ(アドレス$00B65000〜$00B67004、2バイト)
1C9A0328 145627C6
1C9A032C 204DE753
1C9A0330 872C17A5
1C9A0334 284Bxxxx
1C9A0338 C38BE7A6
1C9A033C 373417A5
1C9A0340 374EE7A6
1C9A0344 2B52D7A8
1C9A0348 07D6B00E
1C9A034C 372DE7A7
1C9A0350 15F6E79D
1C8FE060 0C53C7A5
xxxxの例
暗号状態の値=復号状態の値
5C28=8B83
D3E4=1CC7

セーブデータはこうなっていた
アドレス:データ
名前(ル)
12CC:83
12CD:8B
マップフラグ(管理人がサーチした時のデータ)
4312:C7
4313:1C

$00B6667Cが所持金のアドレスですのでその付近にあるだろうと$00B65000〜主人公のステータスまでの範囲にしてあります
アドレスの範囲が広すぎれば重くなったり、フリーズするはずですがこの程度であれば問題はありません
但し同じデータがあった場合は範囲を変えて、やり直しをしなければなりませんので使い勝手がよくないです。

xと一致した場合のアドレスを空きメモリに記録し、武器のグラフィック変更の長い方のコードを応用してやれば
全て確認できるかと思いますが今回は面倒なのでこのくらいで止めました。

しかしセーブデータの容量を減らす為なのかわかりませんがこの様にセーブデータとワークアドレスが
バラバラだと大変ではないんでしょうか?
ビットデータで2種類以上のデータが混ざっているのもあってわかりにくい
この前にコードを作っていたソフトは暗号化や何かのおかげで
セーブデータを見てもよく解らない状況だったのでまだましですけど・・・


ちょっと作ってみた。
D0BE3F88 00000180
2033FA70 0C03E000
D0BE3F88 00000880
2033FA70 0C0D0C5A
200F8000 3C080010
200F8004 0008482D
200F8008 8D2A80AC
200F8014 516C0001
200F8018 25290004
200F801C AD2A9000
200F8020 8D0B80B0
200F8024 014B582B
200F8028 1580FFF8
200F8030 080D0C5A
200F8034 AD409000
200F8044 3C0800BE
200F8048 95083F74
200F804C 3C0B0010
200F8050 816C80A4
200F8054 318C000A
200F8058 15800008
200F805C 31090008
200F8060 11200002
200F8064 856A80A8
200F8068 254A0001
200F806C 31090002
200F8070 55200001
200F8074 254AFFFF
200F8078 A56A80A8
200F807C 310C000A
200F8080 A16C80A4
200F8084 000A5080
200F8088 016A5821
200F808C 03E00008
200F8090 8D629000
20185F38 0803E000

サーチデータ
200F8010 340Cxxxx

サーチデータが
b単位であれば
200F800C 914B0000
200F802C 254A0001

hwバイト単位であれば
200F800C 954B0000
200F802C 254A0002

アドレス範囲
200F80AC 00yyyyyy
200F80B0 00zzzzzz
SELECT+□=アドレスy〜zの範囲をサーチし、
データxと一致したアドレスを空きメモリへ記録
START+□=記録終了
記録されたデータのアドレスをずらすR1=+1,R2=-1終了位置で0にしてます

記録用フックはsceprintf内のjalに、アドレス表示用は
所持金の表示用処理のロード部分に掛けてあります
所持金のロードが常時されていなければRを押してメニュー開かなくてはならない上に
試していないので本当に効果があるのか怪しい。フックもここでいいのか…
上で書いた一致したアドレスを全て記録するというものはこの様な形に
なるのではないか位に思って下さい

x,y,zに適当な数値を入れてバッチリストで構造だけ見てみるといいかもしれません。


戯れ言
やる気がこんなに保ったのは珍しく1ヶ月近くサーチしてました
大抵2週間しないうちに飽きるか出来なくなるかのどちらかなんですが、何故か楽しかったからですね

コードを作っていて楽しかったソフトは九龍妖魔學園紀、ドラッグオンドラグーン2、ジルオールという順番かな
反対に作ってダメだこれと思ったのはマグナカルタ、テイルズオブシンフォニア。
マグナカルタは全てがシンフォニアは戦闘がどうなっているのかさっぱりわからなかった

九龍はプレイ自体も楽しかったんですが、シンボル残りのソフト特有のコードが出来たのが大きかったです
3Dでは表現しづらい面を2Dにしてうまく出していたのもよかったです。2Dの方が作るの大変そうですが
DOD2は連射間隔と残弾数が出来たのが快適ーってな雰囲気でよかったかな
他に出来たアイテムとか武器とかは正直どうでもよかった
それよりも移動やモーションの速度を作った人は凄すぎ。見ても全然わからなかったです
でジルオールは敵出ないと町移動は使えるかもという位で、力作は武器グラフィック変更
そういえばこれも移動速度のコードが出てますね。どうやって見つけているんでしょうか

戻る