Reversing.kr easy crack
普通に実行してみる
パスワードを聞かれる。わからん。
IDAで開く
・IDAのFunctionウィンドウからWinMain関数を見てみると、ダイアログを出す命令DialogBoxParamがある。
int DialogBoxParam(
HINSTANCE hInstance, // アプリケーションのインスタンスのハンドル
LPCTSTR lpTemplateName, // ダイアログボックステンプレートを指定します
HWND hWndParent, // オーナーウィンドウのハンドル
DLGPROC lpDialogFunc, // ダイアログボックスプロシージャへのポインタ
LPARAM dwInitParam // 初期値
);
ここのlpDIalogFuncというプロシージャがダイアログボックスの処理を担当しているはずなのでDialogFuncの処理を見てみる。
DIalogFuncではsub_401080という関数を呼び出しているのでとりあえずそこを見ていく。
sub_401080ではダイアログのテキストを取得するGetDlgItemTextAが実行されている。
UINT GetDlgItemText(
HWND hDlg, // ダイアログボックスのハンドル
int nIDDlgItem, // コントロールの識別子
LPTSTR lpString, // テキストを受け取るバッファへのポインタ
int nMaxCount // 文字列の最大サイズ
);
ダイアログボックスから取得したテキストはlpStringが指すアドレスに格納しているのでこの部分を使って比較している可能性が高い。
String = -0x64
[esp+0x6C+String] = [esp+0x6C-0x64] = [esp+8]
バッファのポインタlpStringは[esp+8]であることが分かる。その後GetDlgItemTextAが呼び出されてそこに入力文字列が格納される。GetDlgItemTextAが呼び出された直後は、pushされた引数がなくなってespが増加するので先頭バッファのポインタは[esp+4]と表せる。
ここでは[esp+5](入力した文字列の2番目)と0x61(ASCIIコードで「a」)を比べている。
次に、「push 2」が実行されたのでespが4減って先頭バッファは[esp+8]になる。
[esp+0xa](バッファから3番目)と5yを引数としてstrcmp関数を呼び出しているので3,4番目の文字列は5yであることが分かる。
さらに進む。
strcmpを呼び出してから2回pushされたのでバッファ先頭は[esp+0x0C]になる。
[esi]に文字列「R3versing」
[eax] に [esp+0x10] (バッファの5番目以降の文字列)を格納する。
[eax]をdlに、[esi]をblに入れて文字列の5番目から最後までを繰り返し処理によって比較している。
最後に
で先頭の文字と0x45(E)を比較して、あっていたら正解の処理へ進む。
これらのことからパスワードは
Ea5yR3versing
であることが分かった。