SFC「バトルドッジボール」のパスワード解析をやっていく その4 わかってない部分を明らかにしていく

前回は、パスワードの正誤判定チェックは1文字の偶数パリティで行われていることがわかった。
あと残っている謎は
「キャラのデータが10文字の場合と12文字の場合ってどうやって分けてるの?」
「キャラのデータの末尾の3文字って意味あるん?」
「2週目とかのカウンター」
この辺だろうか。

10文字or12文字のフラグ

「どこまでがそのキャラのデータか」をデータに組み込むには「先頭に文字数を付加する」「区切り文字を挿入して区切る」大きく分けてこの2パターンが簡単だと思う。星をみるひとのパスワードの場合、先頭にキャラIDを示す固定文字があって、その文字からそのキャラについての固定長でデータが入っているという感じだった。
バトルドッジボールの場合もキャラIDっぽい文字を示す箇所はあるのだが、この文字自体はおそらく能力値でも使われる可能性がある文字だろう。
データが固定長でない場合、キャラIDが先頭にあっても「どこまでが能力値?キャラIDっぽい文字が出たけど、ここから次のキャラのデータでいいの?」という判定はできないと思う。
なので「キャラIDの上位ビットか下位ビットが1010の場合は10文字、1100の場合は12文字」とか「0000 0000 が出てきたら区切り」とかそういうのじゃないのかなーと思いながら、過去に収集したパスワードを前回作ったツールに放り投げてみたがどうもこの予想は外れているらしい。


で、前回ためしに強引に作ったパスワードの場合、能力値がなぜか16進数で表示されていたんだった。
f:id:annnnnnna:20190818150440p:plain

ギアどチ♦ ♦♦♦♦そ グイじ♦♦ ♦♦♦♦ア
こかだ♦♦ ♦♦♦♦シ シがズアJ ♦♦P♦ト
ウさ

1勝したりキャッチしたりしたので作成時点とちょっと違うが、能力値をいじらなかった場合このようなパスワードになった。


で、この能力値は内部的におかしくなって、減らしていって0を突き抜けて999にできる項目がある。
じゃあこの中で一つの値を999にした場合、パスワードはどうなるのか
f:id:annnnnnna:20190824122344p:plain

なアどチ♦ ゲklpそ Yイをえダ こ?ぐえア
Gかえオp あぼ2iシ えがレぞp いDぜしご
ヤす

全体的にだいぶ変わってしまったけど、先頭に注目したい。
「ギ」はチームIDの部分だと思うけど、「な」に変化した。「0001 0000」→「0101 0000」の変化なんだけど、2bit目がなんかのフラグなんじゃないか?


敵を倒したり能力値の割り振りを色々変えたりしてパスワードとってみる

なとどチ♦ ゲRしpそ Yイをえダ ず?ぐえア
Gかえオp あぼぞiシ えがレぞp いDぜしう
ヤすMpe アんシOが

文字数が増えるとき、各キャラの能力値の桁が伸びるもんだと思ってたんだけど、「ヤす」の場所が同じってことは(たまたまってこともあるだろうけど)後ろに8文字追加されるだけで各能力値などの位置は固定なんじゃないか?
勝利数だけ増やした↓

な8どチ♦ ゲRしpそ Yイをえダ ず?ぐえア
Gかえオp あぼぞiシ えがレぞp いDぜしチ
ヤすMpe アんシOが

パリティっぽい挙動をする文字が34桁目から40桁目に位置がずれてるから3キャラに2文字ずつ足したと考えると辻褄合うしやっぱり中間に文字増えてると思った方が良さそう。

で、色々いじってるんだけど、42文字のパターンと50文字のパターンしか出せていない。文字数に応じて各キャラのデータが10文字or12文字を判断してるんじゃなかろうか。

どうなったら50文字になるかはいまいちわかっていない。
キャラIDの位置も当然ずれているとして、2人目は「じ」→「ダ」に変化しているように見えるし、16ビット分ずれているわけではないかもしれない。



16進数表記になっている能力値に+1すると10進数表記になるが、そこから-1して元の値に戻した場合

ギアどチシ ささシさち ぞウじ♦シ シさシさく
しきだ♦さ さ♦ささて スぎズほJ さシPさば
けし

f:id:annnnnnna:20190824144423p:plain
ダークブレインの各能力値は+100~116になっているのだが、最初に予想した各能力値の位置を見ると0の時と同じ文字がある。
体力の「シ」とフットワークの「さ」だ。これらは能力値100の項目だ。わかったぞ。

全能力値を100にしてパスワードを取ってみよう

ギアどチシ ゲさしゼち ぞウじ♦コ ぐゲぐけく
しきだ♦き あスゴウて てぎズとJ いキPアば
けし

最初のパスワードが↓

がいどシシ ゲさしゼそ グイじえコ ぐゲぐけア
こかだオき あスゴウシ シがズとJ いキPアト
ウさ

1桁目はチームID、2桁目はステージ進行度、4、14、24桁目はMP、34文字目はパリティなので変化は無視して、他の変化した部分を抽出すると10~12桁目、20~22桁目、30~32桁目、40~42桁目だけが変化したことがわかる。
今まで「不明」だった部分は各能力値の100の位を表していたっぽいことがわかった。
前半5文字でそれぞれ0~99を表現して、後ろの3文字で5項目分の0~9を表現していて、また、各項目が9ををオーバーした場合に16進数表記になるんだろう。

一応確認
ダークブレインのジャンプ力を「ゼ」→「♦」に変化させたとき、「00」→「A2」に変化した。
「ゼ」「00100110」
 ↓
「♦」「11001000」
「1010 0010」が増えている。これは「A2」なので、上位4ビットで10の位、下位4ビットで1の位を表していて、9を超える場合16進数表記に化けてしまうわけだ。


100の位と思しき部分の変化を見てみると
「そグイ」「00101100 00010001 00000110」
 ↓
「ちぞウ」「00111101 00100010 00000111」
「00010001 00010001 00000001」が増えている。4ビットずつ各能力値に対応してそうですね。
ただ、この場合だと各能力値は「F99」と表示される値、つまり「1699」までしか表現できないので、Lv20に相当する「9999」を表現するためには桁が足りないっぽい。おそらく、増える文字は
というわけで、42文字パターンは解析できたといっていいかな。

50文字のパターンも見ていく

16進数表記の状態に+1してからすべて0(雷門のフットワークだけ100)にした状態から、外野のショットだけ999にする(理由はわかっていないけど、外野のショットを999にすると安定して50文字のパターンになる)

なアどチシ ゲさしゼそ グイアえダ こゲぐけア
こかけオき あぼ2ウシ シがいザグ いキぜしエ
ヤすMpエ アんシぜが

何度も見ている「チシ ゲさしゼそ」が出てきますね。なのでこの辺の値の使われ方は変化していないと考えていいでしょう。
この状態でさらにダークブレインのショットを900にしてみましょうか

なアどチシ ゲさlゼそ グイアえダ こゲぐけア
こかけオき あぼ2ウシ シがいザグ いキぜしポ
ヤすMpエ アんシぜが

意外なところが変化した。
「し」「00101001」
 ↓
「l」「11000010」
増加分は「1001 1001」なので「9 9」ですね。
つまり「さし」=「0000」から「さl」=「9900」に変化したということになるでしょう。
体力、ショット~ジャンプ力の順で2文字ずつ10の位と1の位、1000の位と100の位が表されていると考えられます。

能力値0の場合でも「ああああ」などにならずに多少のオフセットがあるせいでわかりにくくなっていますが、雷門のフットワークの100と外野の9999を調整すれば50文字パターンでの全能力値0のパスワードが作れそうですね。
ジェネレーターはその状態を起点にすれば作れそう。

なアどチシ ゲさしゼそ グイアえダ こゲぐけア
こかけオき あぼ2ウシ シがいザグ いキぜしエ
ヤすMpエ アんシぜが

35~36文字目の「グい」が100で
43~44文字目の「Mp」が9999かな
「グい」「00010001 00000001 」 から「00 01」の「0000 0000 0000 0001」を引いて「グあ」
「Mp」「10011110 11000110」から「99 99」の「1001 1001 1001 1001」を引いて「アル」
にすれば良さそう。

と、思ったのだが、ここで問題発生。ゲーム画面で表示されたはずの上記のパスワードが通らないのだ。スクショ重ねて確認したから入力ミスではない。
前回の記事に「全文字のXorをとっても00000000にならない」と追記したのだが、どうやら改造パスワードからの進行結果としてゲーム画面が表示してくるパスワードが嘘らしい。
この50文字のパスワードだと40文字目の「エ」がパリティにあたるのだが、ここを「ハ」にすると全文字のXorの結果が0000000になる。これだと通った。

あらためて

なアどチシ ゲさしゼそ グイアえダ こゲぐけア
こかけオき あぼ2ウシ シがいザグ あキぜしU
ヤすアルエ アんシぜが

を通そうとしたのだがうまくいかなかった。全能力値0なので42文字パターンで十分な内容なのだが、その場合の50文字パスワードは受け付けてもらえないのだろうか…


外野のショットを9900にして試してみたが

なアどチシ ゲさしゼそ グイアえダ こゲぐけア
こかけオき あぼ2ウシ シがいザグ いキぜしゴ
ヤすアpエ アんシぜが

この「ゴ」も嘘パリティなのだが、計算してみると実際は「242」にあたる文字が入るはず。しかしそんな文字はないのでこのパターンのパスワードは通せないということになりそう。