Back Crack Next Crack

クラック その1

初期設定が出来たら早速 "crkme01.exe" をOllyにロード(F3)してみましょう。 右クリックの"送る"メニューにOllyのショートカットを入れておくと便利です。 ロードすると下のような画面が出ますね。 OllyDbgは、逆アセ、レジスタ、データ(メモリダンプ)、スタック、以上4つのペイン(ウィンドウ)で構成されます。 ちょっとした情報なんかはインフォメーション窓に表示されます。 上の画面を確認してF9でプログラムを起動させましょう。(F9 - プログラムの実行) 起動したらPassの入力画面が表示されましたね、 とりあえずフェイクパスとして"ABCDEF"を入力して登録ボタンをクリックしてみましょう。 当然のごとく "不正解です" とメッセージボックスが表示されますね。 さあ、考えてみましょう"登録ボタンを押してからプログラムが何を行ったか"をです。 まずは登録ボタンを押したあと、入力したフェイクパスの値を取り込んで、 その取り込んだ値を正解を示す別の値と照らし合わせて比較をして、 その結果を受けて "不正解です" というメッセージボックスを表示した、って考えられますよね。 ならどんな値と照らし合わせているのか見てみたくなるでしょう? 照らし合わせの前の入力したフェイクパスを取り込むところで プログラムの処理を止めて制御を奪ってしまえば見ることが出来そうですね。 しかしどこで止めればいいのかわかりませんね。 さあ、ポイントです、 Windowsアプリはこの"ダイアログに入力した値を取り込む"と言う作業に、 APIというOS側から用意された関数を使って行います。 ウィンドウやエディットボックスから値を取得するAPIは、 GetWindowTextA(W) と GetDlgItemTextA(W) の2種類だけです。 このアプリが上記の関数を使っていないか調べてみましょう。 コードウィンドウ上で右クリック → Search for → Name (label) in currenrt module。 これでこのプログラムが呼び出しているAPIの一覧が表示されます。 GetWindowTextA、か、GetDlgItemTextAが無いか見てみると・・・GetWindowTextAを発見! GetDlgItemTextAの方は無いようなので、 このプログラムは文字列の取得にGetWindowTextA関数を使っていることが分かりましたね。 とりあえずは、プログラムがこのGetWindowTextAを使う瞬間を捕まえてみましょう。 処理を中断させるためにブレークポイントをセットします。 ブレークポイント(以下 BP)というは一種のトラップです。 BPをセットしたアドレスのコードが実行されそうになると、 その直前でプログラムの実行をストップさせ制御を奪う機能のことを言います。 一覧の中からGetWindowTextAを選択、右クリック → Find references to import。 これでGetWindowTextAを呼び出しているアドレスの一覧が表示されます。 "004011F5 CALL " このコールというのが呼び出しです。 選択したら F2 を押しブレークポイントをセットします。(セットすると赤くなります) セットしたらアプリへ戻ってもう一度登録ボタンを押してみましょう。 どうです? 見事にブレークしてるでしょ? 今このプログラムはGetWindowTextA関数をコールする直前で停止しています。 ここで2つのことを覚えておいいてください、停止しているところのコードは実行する直前の状態です。 も1つは、GetWindowTextA or GetDlgItemTextA からの攻めは クラックの基本のアプローチです。 それではここから1命令ずつ実行(トレース)して見ていきましょう。 1命令ずつ実行するには"F7"か"F8"です。 F7とF8の違いはコール命令(サブルーチン)の中へ入るか入らないかの違いです。 F8は入らない方(ステップオーバー)、F7は入っていく方(ステップイン)、になります。 GetWindowTextA関数の中身を見てもしょうがないので今回はF8を押します。 押してすぐ下のアドレス004011FA〜00401204に注目です。
004011FA  PUSH crkme01.004030AC   ;/String2 = "doomo"
004011FF  PUSH crkme01.0040302C   ;|String1 = "ABCDEF"
00401204  CALL <JMP.&KERNEL32.lstrcmpA>
004011FA番地で何やら文字列が見えますね。 004011FF番地で見えている文字列は先ほど入力したフェイクパス!! そして00401204番地でlstrcmpA 関数をコールしています。 このlstrcmpA関数は文字列の比較を行うAPIです。 どうやら直前にPUSHされた2つの文字列を比較をするっぽいです。 比較? つーことは、doomoが正解? えっ 楽勝? フフフン フン♪ (^o^)/ 〜♪ と歌っているキミ、落ち着きなさい、これで終わりじゃないぞ。 と言いたいところですが、まずは確認してみたいというのが本音でしょう。 doomoと入力して登録ボタンを押してみてもいいですよ、 F9を押せばプログラムに制御が戻ります。 確認できました? 笑ってますね? Happyなキミの笑顔が浮かぶようです。 ちなみに今回のようなケースは倍直と呼ばれるものです。 倍直とは"バイナリから直に"と言う意味です。 試しにcrkme01.exeをHEXエディタにかけて"doomo"で文字列検索してみると その意味がよくわかると思います。

Back Crack Next Crack