パスワードを忘れたdxaファイルの解凍の仕方

DxLibに付属するパッキングツールを用いたデータの解凍方法について解説する。と言ってもパスがついてない場合はDecode.EXEに突っ込めば解決するのだが。

今回解説するのは、パスワードが使用されてパッキングされているデータの解凍方法である。

まず、パッキングツールのソースコードが公開されているのでそれを見てパスワードがどのように利用されているのかを見ていこう。

まず、パスワードは12文字になるように繰り返されるか省略されている。例えばパスワードが"12345”だったとしたら"123451234512"になるようになるし、"qwertyuiopasdfghjkl"の場合は"qwertyuiopas"になる。

あとは文字をunsigned char型になおして、ビットシフトや反転を用いて得た12文字分のデータにしてそれを画像やら音楽データのバイナリにXOR演算して暗号化されている(以下、パスワードからビットシフトやらで生成された12文字の数字の列を鍵ということにする)。それではパッキングされたデータを見ていこう。

ソースコードから読み込んでみると、最初のヘッダー部分はどのdxaファイルも同じであることがわかる。つまり、どのような物をパッキングしようが変わらないバイトが存在するということである。これを手がかりにパスワードを解明していく。

最初の2バイトは必ず「DX」をパスワードを鍵でxorした結果が保存されている。また0X08〜0X0fバイトまでも共通していて、それぞれは”DX"という文字列とヘッダ構造体サイズの大きさの部分である。これは値がわかるのである程度検討がつき、9文字目から12文字目の4文字分がわかるだろう。その次はデータの容量などファイル固有の部分になっていくので割愛する。

パスワードが必ず12文字になることを利用して1文字パスワードでパッキングしたデータのバイナリと解凍したいパッキングされたデータのバイナリを1バイトずつ比較してみると最初の2文字がわかる。また、9文字目から12文字目までもバイナリの比較でわかる。

さて、最初の2文字がわかったところでWSLを立ち上げてstringsコマンドでexeに書き込まれている文字列を表示し、その結果を最初の2文字でgrepしてみるとかなり文字列が限られてるのがわかると思う。最初のに文字が同じでパスっぽい文字列はだいたい一つに絞られるであろう。

このようにすればパスワードを紛失してしまったデータも手に入れることができる。

私はこの方法で、パスがわからないパッキングされたデータを2つ解凍しました……。

追記:

この方法が今のバージョンでもできるのかわからないですが昔のバージョンでつくた場合はできる可能性は高いです。