|    今回も前回と同じくクラッキングバイブル同梱の  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  と書き換えるクラック手法も存在する。  こちらの方がクラック後の分岐において、  フラグレジスタの矛盾が小さい為  より自然なクラッキングだと思われる。  |  
この記事に
- >
 - コンピュータとインターネット
 - >
 - コンピュータ
 - >
 - ソフトウェア