■
多重起動防止
参考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