Back Crack Next Crack

クラック その2 条件分岐

レジストパスが"doomo"だと分かりました。 今回は条件分岐の解説です。 まずGetwindowTextAにBPをセット、フェイクパスにABCDEFと入れて登録ボタンをクリック。 ブレーク後00401209番地までトレース(F8)してください。 アドレス401209まで進んだらレジスタウィンドウのEAXレジスタの値を確認してください、 いまEAXには直前のlstrcmpA関数の返り値が入っています。 FFFFFFFF となっていますね。 lstrcmpA 関数は比較した結果が同じで場合はゼロを、 異なる場合はゼロ以外(1かFFFFFFFF)を返します。 FFFFFFFF を返してきたということは比較の結果が"偽"であるということです。 それでは今回のポイント"TEST EAX,EAX"を説明します。 アセンブリでは命令にあたるTESTの部分をオペコードと言います。 EAX,EAXの部分の左側をディスティネーションオペランド(第1オペランド)、 右側をソースオペランド(第2オペランド) と呼び、 演算の結果はディスティネーションオペランドに入ります。 そして全てをひっくるめた"TEST EAX,EAX"の一文をニーモニックと言います。 TEST命令は少しややこしいので、加算命令の中の1つ"ADD"命令で説明します。 ADDとは単なる足し算のことです。 "ADD EAX,EDX" とあればEAXの値とEDXの値を普通に足し算します。 例えば "EAX=3 EDX=5"のときに"ADD EAX,EDX"実行した場合は、 単純にEAXとEDXの値を足し算してその結果をEAXに入れます。 演算結果はディスティネーション(第一)オペランドに入るということを 今この瞬間あたまにたたき込んでください。 さて、"TEST EAX,EAX"に戻りましょう。 "TEST"命令はビット演算のANDのことですが、 演算結果は破棄し演算結果の状態をフラグにのみ反映させます。 説明すると、 AND EAX,EDX の場合は、EAXの値とEDXの値をANDして演算結果をEAXに格納します。 TEST EAX,EDX の場合は、EAXの値とEDXの値をANDしますが フラグにのみその結果を反映させてEAXへは演算結果を格納しません。 フラグとは、演算結果がゼロになった、オーバーフローした、奇数になった、 といった各種状態を示すレジスタで、 今回はその中の一つであるゼロフラグについて説明していきます。 いまEAXレジスタには"FFFFFFFF"と入っていますね、 確認したらF8を一回押して"TEST EAX,EAX"を実行させましょう EAX,EAXとなっていますのでFFFFFFFF and FFFFFFFF を計算します。 TEST命令の演算結果は破棄されますのでEAXレジスタの値はそのままですね。 しかしフラグには演算の結果が反映されます。 レジスタウィンドウの"Z"というところを見てください灰色で"ゼロ"となっているはずです。 このZをゼロフラグといい、演算の結果が"ゼロ"となったときに"1"になり、 ゼロ以外のときに"0"になります。 フラグレジスタの容量は1ビットのなので0か1以外の値にはなりません。 つまり、1(セット)か、0(リセット)のどちらかです。 今回は演算結果が"FFFFFFFF"となりゼロではなかったのでゼロフラグは"0"ですね。 さて、今度はレジストパスである"doomo"を入力したときどうなるか見てみましょう。 CTRL+F2を押してプログラムをリロードします。 パスにdoomoと入力して登録ボタンをクリックし、 ブレーク後アドレス401209まで進んで再度EAXレジスタの値を確認してください。 "00000000" と返ってきているいうことは比較の結果は同じですね。 確認したらF8でTEST EAX,EAXを実行します、00000000 and 00000000 の結果はゼロになるので、 ゼロフラグがセットされることになります。 見てみましょう、1が入ってますね。 ここでゼロフラグがセット(1)されるかリセット(0)されるかで、 現在停止している"0040120B JE SHORT CRKME01.00401226"の処理が変わってきます。 それでは"JE"命令について説明します。 JEというのは"Jump Equal"のことで、イコールならジャンプすると言う意味です。 イコールかどうかはゼロフラグの状態を見て判断します。 ゼロフラグがセットされていれば Equal、リセットされていれば Not Equal です。 今回はゼロフラグに1が入っておりイコールなので00401226へジャンプします。 ジャンプするかどうかF8を押してみてください、ジャンプしましたね。 ジャンプした先は"正解です"のメッセージボックスを出す処理なのは何となく分かりますね。 それでは逆に、ゼロフラグがリセットされてたらどうなるでしょう、 その場合はジャンプしないはずですね、見てみましょう。 CTRL+F2を押してリロードし"ABCDEF"と間違ったパスを入れ登録ボタンを押し、 00401209〜0040120B を1つずつ確認しながらトレース(F8)していってください。 0040120Bまで来たらゼロフラグを確認、間違ったパスなのでフラグはゼロなりますね。 つまりこのあとジャンプしないはずです。 確認したらF8を一回押す、はい、ジャンプしませんね。 このあとは"不正解です"のメッセージボックスを出す処理なのは何となくわかりますね。 このように結果によって処理の流れを変えることを条件分岐といいます。

Back Crack Next Crack

- AND - ANDは、2進化した数値の各桁が両方とも1であるときにその桁を1にする ビット演算の1つです。 例1: 5 and 3 = 1 101 (5) and 11 (3) --------- 001 (1) 例2: C and 6 = 4 1100 (C) and 110 (6) ---------- 0100 (4) 例3: 7 and 7 = 7 111 (7) and 111 (7) ---------- 111 (7)