今回も前回と同じくクラッキングバイブル同梱の CD内にあるCrackMe0x01を別のアプローチでクラックしてみる。 前回はチェック部分をNOPで書き換える事によって、 クラックを行った。 このプログラムは 入力した値のチェック ↓ 正解している場合の処理 ↓ 不正解な場合の処理 といった具合になっており、前回は入力した値のチェックの部分 (厳密にはチェック後に影響される分岐命令)を NOPに書き換える事でチェックをパス(=スルー)し、そのまま 正解している場合の処理へ突入させていただけである。 つまり、前回は処理の順番を利用してクラックに成功しただけである。 仮に 入力した値のチェック ↓ 不正解な場合の処理 ↓ 正解している場合の処理 という処理の順番になっていた場合、 入力した値のチェックの処理の部分をNOPで書き換えたとしても、 不正解な場合の処理に突入してしまう事となる。 (バッファオーバーフローのように大規模に NOPで書き換えるという手もあるが、 今回は考えないこととする) そこで今回は正解している場合へ処理を 強制的に移行させる事を考える。 処理を移行させる命令の1つとしてJMP命令がある。 JMP命令を利用しクラックしてみる。 クラックのやり方としては前回とほぼ同様である。 1回実行する GetWindowText関数を検索する 検索方法は Ctrl + n である。 すべての参照にブレークポイントをセットする。 シリアルナンバーを適当に入力し登録を押す。 すると、GetWindowTextAで処理が止まる。 F8を押して TEST EAX,EAX JNZ SHORT CrackMe0.004011F8 まで処理を進める。 ここまでは前回と同じである。 今回は冒頭でも書いた通り、NOPではなくJMP命令を使う。 単純に処理を 004011E2 へ移行させれば良いので、 TEST EAX,EAX を JMP 004011E2 と書き換えてやればいい。 書き換え対象の命令を右クリックし、逆アセ修正をクリック。 すると下の画像のような入力画面になる。 と入力し、アセンブルをクリックする。 入力画面のキャンセルをクリックし閉じる。 そのまま処理を進めると、登録に成功したことが分かる。 つまりクラックに成功した。 [*]余談 書き換えた命令の次に JNZ SHORT CrackMe0.004011F8 という命令がある。 JNZ命令とはフラグレジスタの内容によって分岐させる命令である。 (ZFが0ではない場合にジャンプする) これを利用して TEST EAX,EAX を CMP EAX,EAX と書き換えるクラック手法も存在する。 こちらの方がクラック後の分岐において、 フラグレジスタの矛盾が小さい為 より自然なクラッキングだと思われる。 |
この記事に
- >
- コンピュータとインターネット
- >
- コンピュータ
- >
- ソフトウェア