改造データの見方


 

数値について
使われている数値は、通常10進数です。
数字の後ろに「h」が付いている物は16進数です。
数字の後ろに「b」か付いている物は2進数です。

例: 100 = 64h = 01100100b


バイトデータ並び表
表に使用されているデータは全て16進数です。(hは省略してあります)
左行の項目がアドレスです。
上列の項目がアドレス+何バイト目かを表しています。
データは1つ1バイトを表していますが、
2バイトで1つのデータを表す場合などはまとめてあります。

例:

  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
1CF60 01 02 69 40 4A 4D 経験値                


アドレス1CF60h番地から 01h 02h 69h 40h 4Ah 4Dh と、
6バイトのデータが連続して格納されていることを示す。
1CF66h番地と1CF67h番地は2バイトで経験値データが格納されていることを示す。


ビットデータ並び表
1バイトは、8ビット。データの中には、メモリ節約のため1バイトに複数のデータを詰め込む場合がある。
ビットデータは上位桁から7〜0ビットと表記する。

例:

85hのデータは以下のように表現される。

ビット  7  6  5  4  3  2  1  0
 


7ビット、2ビット、0ビットが1である。


複数バイトにまたがる数値データ
複数バイトにまたがる数値データは、特に断り書きがない限り
上位桁が上位アドレスに格納されている。

例:

先ほどの例からすると
1CF66h番地に 00h が、1CF67h番地に 01h が格納されていた場合、

  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
1CF60 01 02 69 40 4A 4D 00 01                


経験値は、0001h = 1ではなく、 0100h = 256 となる。


チェックSUM
セーブデータなどには、そのデータが壊れていないかどうか確認するためにSUMチェックを行う場合がある。
セーブデータを改造する場合に、これは傷害となる。

例:

以下のようなデータが存在し、100h番地から10Eh番地までがセーブデータ、10Fh番地がチェックSUMだとする

  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
100 00 01 20 00 15 00 FF 00 00 00 00 00 00 00 00 35


100h番地から10Eh番地までのデータを1バイトと単位で加算した値が10Fh番地に格納されている。
0+1+20h+0+15h+0+FFh+0+0+0+0+0+0+0 = 135h
(桁上げは無視されるので 35h)
データが変わっていれば当然加算の結果が異なるため、100h番地から10Eh番地までのデータを1バイトと単位で加算した値と、10Fh番地に格納されている値が異なってくる。
これに引っかかりデータが壊れていると判定された場合は、ゲームによってそのセーブデータが表示されなかったり、「壊れています」と親切にも表示してくれたりします。


データ修正方法A:


チェックSUMの位置が分かっている場合は、データを変更した場合にそのチェックSUMの値を同じように変更してやればよい。

例えば、102hのデータ20hを21hに変更した場合は、20hに1を足したわけであるから、チェックSUMの値にも同じく1を足して、10Fhのデータ35hを36hに変更すればよい。

  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
100 00 01 21 00 15 00 FF 00 00 00 00 00 00 00 00 36



データ修正方法B:


チェックSUMの位置が判明していない場合は、チェックSUMの値が変化しないようにデータを変更する。

例えば、102hのデータ20hを21hに変更した場合は、20hに1を足したわけであるから、他の変更しても差し支えないデータ(ここでは例えば101h番地)から1を引けばよい。そうすれば、1足して1引いたわけだから合計値(チェックSUMの値)は変わらないため、チェックに引っかからずに済む。

  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
100 00 00 21 00 15 00 FF 00 00 00 00 00 00 00 00 35



2バイトチェックSUM
これも基本的にはSUMチェックと同様。
ただし、加算の方法が2バイトづつなだけである。

例:

以下のようなデータが存在し、100h番地から10Dh番地までがセーブデータ、10Eh番地及び10Fh番地がチェックSUMだとする

  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
100 00 01 20 00 15 00 FF 00 00 00 00 00 00 00 34 02


2バイト単位なので見やすく書き直せば

  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
100 0100 0020 0015 00FF 0000 0000 0000 0234


100h番地から10Dh番地までのデータを2バイトと単位で加算した値が10Eh番地及び10Fh番地に格納されている。
100h+20h+15h+FFh+0+0+0 = 234h
(桁上げは場合によって無視されないときもある。その場合は1加算されている。)

修正の方法は、SUMチェックと同様である。
方法Aを使用する場合は、なるべく桁上げが起きない程度に行うと間違う確率が低い。


BITチェック
これも基本的にはSUMチェックと同様。
ただし、計算方法が異なる。

このチェック方式は、実際にどのような計算式を使用してどういう値を格納しているのか不明である。
ビットの総数とその位置を変えないようにしてやるとチェックをすり抜けることが可能である。

64h という値と 85h という値があったとする。
64h を増やしたい場合は、以下のようにして85h からBITをもらう。

二進数で表すと
64h = 0110 0100 b
85h = 1000 0101 b

BITを移動する。
E5h = 1110 0101 b
↑       ↑
05h = 0000 0100 b


※この場所はすでに増やしたい方の値にBITがあるので移動できない。

SUMチェックの場合と比較すると、※の部分が違うことになる。修正はこちらの方が幾分か注意を要する。
それは、ただ単に足し算・引き算すればOKというわけには行かないからである。

データ修正方法:


以下のようなデータが存在するとしよう
108h 109h が2バイトの数値データであるとしてこの値を増やしたい場合

  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
100 00 01 20 00 15 00 FF 00 64 00 32 00 01 00 00 02

 


数値の下位バイトから上位バイトへビットを移動させればよい。

00h = 0000 0000 b
64h = 0110 0100 b

04h = 0000 0100 b

60h = 0110 0000 b

値は 0064h → 0460h になる。 ( 100 → 1120 )

  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
100 00 01 20 00 15 00 FF 00 60 04 32 00 01 00 00 02

 



または、別の場所、例えば 10Ah からビットをもらう。

64h = 0110 0100 b
32h = 0011 0010 b

76h = 0111 0110 b
↑   ↑
20h = 0010 0000 b

値は 0064h → 0076h になる。 ( 100 → 118 )

 

  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
100 00 01 20 00 15 00 FF 00 76 00 20 00 01 00 00 02




戻る