パスワードを忘れた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つ解凍しました……。
追記:
この方法が今のバージョンでもできるのかわからないですが昔のバージョンでつくた場合はできる可能性は高いです。
後輩にV百合について布教された
みなさん推しは居ますか?
私はいません。(推しは生きる希望となりうるので持ったほうがいいです)
久しぶりに会った後輩とおしゃべりしてたら、いつのまにかVの話になり、こちらが話す隙を与えず推しの話をされ、圧倒されていました。そこで話題になったには主に「元アマリリス組」の話でした。
人類は、ほぼ未知の存在である物事について圧倒的な情報量を投げつけられると「お、おぅ……。」となることが知られています。私はそのような生物と化していました。
そこでなかなか面白い話が聞けて良かったです。
今その後輩の推しの配信をききながらこの記事を書きました。
こちらからVの話をできなかったのが残念でした。
胸の中に芽生える虚無
靴が古くなったので新しく靴を買った。靴の方は古い靴と同じものだ。馴染んでしまったからしょうがない。そうして鳴らすために4kmぐらい歩いたら靴擦れ起こした。靴下が血ですごい汚れたし、同じの買ったのになんで靴擦れ起こすんだよという気持ちがあった。
いつも思うが靴を買うタイミングっていつなんだろうか?私は靴の底が抜けたり、雨の日に浸水がやばくなったら買い換えるみたいな適当タイミングで買い換えるので適切なタイミングを今度知りたい。
閑話休題、靴擦れを起こしてしまったということは不幸なことに外に出づらい状況を招いた。そうなると人とも会わない生活を過ごすことになり、虚無になりやすい。現状に対しては辛いことなので無理して改善していきたい。
こんにちは、みなさん虚無やってますか?
やってませんか、そうならいいです。
低レイヤを知りたい人のためのcコンパイラ作成入門でつまった
ベクタとマップを実装するとこまで来たんだが、(ステップ6の等号非等号は飛ばした)mallocがうまく行かなくて、テストが積んだっぽい。
./9cc -test
9cc: malloc.c:2401: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || *1 == 0)' failed.
Makefile:10: recipe for target 'test' failed
というのがでテストが通らない。
解決策がわからんので一旦放置になるのかな……。なかなか面白かっただけに残念、9ccのコードを追って行くか……。あとサンプルの関数名が明らかに間違ってるのはとりあえず書き上げてから間違いを治そうという気持ちで書いているからなのだろうか(mapのテストなのにtest_vectorという関数名はおかしいやろ……。)
*1:unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1
低レイヤを知りたい人のためのCコンパイラ作成入門をやってみた
Cコンパイラ作成本、完成は相当先になりそうだし、あまりもったいぶっても仕方がないので、めっちゃ最初の部分だけとりあえず公開しました。この手順に従ってできるのは恐ろしく原始的なコンパイラですが、始めてみるキッカケにはなるかも。 https://t.co/rbHWp2kyGM
— Rui Ueyama (@rui314) November 1, 2018
というのがあると知って取り組んでみた。
サンプルとして出てくるコードにちょくちょく間違いっぽいものがあるけれどどうやって知らせればいいのかわからない。
掛け算割り算ができると、計算順序がうまく出来てるなという時間があるし、変数導入で結構本物のプログラミング言語感が出てくるから結構面白い。