Back Crack

Target: crkme02a.exe

とりあえずBPをセットして"ABCDEF"と入力し登録ボタンをクリックしてみましょうか。

あいや? なんかバレてますね、つか、なんでバレてんの? 実は、プログラムは自分自身がデバッグされていることを認識することが出来ます。 デバッグをチェックする方法はこれ以外にもありますが、 いずれにせよ何らかのチェックを行って条件分岐させたのは間違いありません。 OllyDbgの素晴らしい機能を使ってこのMsgBoxへ分岐した場所を特定することにしましょう。 BPをセットした00401240のすぐ上にMessageBoxA 関数が呼び出されていますね。 恐らくこの関数が実行されたのでしょうから、ここからコードを逆追いしていきましょう。 すると0040121Eで"JNZ 00401215"分岐命令をを発見!! しかも1つ前はCMP命令で比較しています!!! げっちゅー♪ ヽ(´ー`)ノ ここが分岐場所!! ・・・違います。 "JNZ 00401215" のジャンプするアドレスをよく見てください、00401215 です。 00401215へジャンプしても再び0040121E JNZ 00401215へ戻ってきてしまいます。 つまり0040121Eでジャンプしようがしなかろうが"0040122C Call MessageBoxA" を実行してしまいます。 この分岐はハズレですね、ここよりさらにさかのぼってコード見ていきましょう。 ちょっとここでOllyDbgのワンダフルな機能の1つ"Hit trace"を使ってみることにしますか。 Hit traceとは実行されたコードと実行されなかったコードを色分け表示する機能です。 まずはCtrl+F2を押してcrkme02a.exeをリロード。 リロード後F9で起動、フェイクパス"ABCDEF"を入力して手を止めてください。 まず"0040122C CALL MessageBoxA" の前後を適当に範囲選択します。 適当といわれても困るでしょうから004011E4 〜 0040124Aとしましょうか。 範囲選択したら、右クリック - Hit trace - Add selection を選択、これでHit traceがセットされます。 セットできたら登録ボタンを押してみましょう、押したらOllyを見てください。 実行されたコードが赤くなっています、灰色のところは実行されていません。 先ほどの分岐を逆追いしてみると"00401209 Call 00401233"が灰色で実行されていないことが分かります。 呼び出し先の00401233を見てみると、なんとお目当てのGetWindowTextA関数へたどり着きました。 "00401209 Call 00401233"の1つ前は"JB 004011FC" さらに1つ前はCMP命令で比較をしています。 JB命令は"Jump below"小さいならジャンプという条件分岐命令で、小さいかどうかの判断はキャリーフラグ(C)で判断します。 フラグがセットされていれば小さいことを表し、リセットされていれば小さくないことを表しています。 ココでジャンプしないようにすればよさそうですね。 はて?、どうやってジャンプしないようにするのん? コードを改造してしまいましょう。 再びリロード F9で起動 "00401207 JB 004011FC"でF2を押してBPをセット、フェイクパス"ABCDEF"を入力して登録ボタンを押す。 ブレークしましたね、そしたら"JB 004011FC"をWクリックしてJBをJAに変更してやりましょう。 JA命令はJump Aboveで大きいならジャンプという意味です。 大きいかどうかの判断はゼロフラグとキャリーフラグの2つで判断します。 両フラグ共にリセットされている状態で大きいことを表します。 つまりこれはジャンプする条件を逆にしてしまうということです。 JBをJAに変更したらF9を押して実行を継続させましょう。 ハイ、GetWindowTextAでブレークしましたね。 次回へ続く

今回のポイント "コードの改造 = パッチ"

Back Crack