多重起動防止
参考URL
http://sp-.up.seesaa.net/image/taju-1.html
(同じAPI使っているのでほとんどまんま一緒だったりする)

バイナリ
http://dl.dropbox.com/u/13673436/FindWindow.exe
ソース
http://dl.dropbox.com/u/13673436/FindWindow.cpp
多重起動防止のためのAPIはFindWindowを使った。今回作成されるウインドウ名は”多重起動Crackme”なので以下のようにした。

FindWindow(NULL,_T("多重起動Crackme"))

成功すると0が返ってくるということなので,その通りに書いた。(あいかわらず説明いい加減だななぁ…)

解析
まず、最初に起動させて”ぶひひひ成功”と出るのを確かめる。2つ目を起動しようとしていると”既に起動しています”とでる。OKボタンを押して終了する。次にollydbgから開く。そうすると以下のような感じなると思う。この画面がでないのであれば、Ctrl+NでFindWindowWを探してたどり着くこと。

000F1007   . FF15 AC200F00  CALL DWORD PTR DS:[<&USER32.FindWindowW>>; \FindWindowW
000F100D   . C74424 10 4000>MOV DWORD PTR SS:[ESP+10],40
000F1015   . C74424 0C 0421>MOV DWORD PTR SS:[ESP+C],FindWind.000F21>
000F101D   . C74424 04 0000>MOV DWORD PTR SS:[ESP+4],0
000F1025   . 85C0           TEST EAX,EAX
000F1027   . 75 0E          JNZ SHORT FindWind.000F1037

これをぱっと見た感じでTESTしてJNZしている01371025の当たりが判定処理をしていることがなんとなくわかるだろう。とりえず、000F1025にF2でブレークポイント仕掛けてF8でステップ実行してJNZの命令まで行く。JNZの処ではジャンプしようとしている。しかし、ジャンプすると失敗のメッセージがでるのでここをNOPにするか、TESTをXORにすればよい。

000F1025     33C0           XOR EAX,EAX
000F1027   . 75 0E          JNZ SHORT FindWind.000F1037

XOR版
00000425: 85 33