ドライブチェック練習問題3

バイナリ
http://dl.dropbox.com/u/13673436/GetDriveTypeFuncC.exe
ソース
http://dl.dropbox.com/u/13673436/GetDriveTypeFuncC.cpp

この問題はGetDriveTypeB.exeのちょっと改良型
前回のように以下のCALLをNOPで潰しても認証成功にはならない.

004011D3     E8 F8FEFFFF    CALL GetDrive.DriveCheck

なんでかというと認証が成功した場合にフラグを立てている.そして,Windowに文字列を描画する時にもう一度そのフラグが立っているかを判定し,立ってない場合には認証失敗の文字列を描画して,立っている場合には成功の文字列を出している.
実際にフラグを立てている以下の場所である.

004011BC  |> C605 70334000 >MOV BYTE PTR DS:[FinalCheckFlag],1

MOVは移動命令.FinalCheckFlagのメモリ空間に1を代入している.実際のソースではFinalCheckFlag=true;
となっている.解析する側としてはこのフラグを立ててやればいいんだから.CALL命令を潰した場所にフラグを立てる処理に置き換えれば良い

004011D3     E8 F8FEFFFF    CALL GetDrive.DriveCheck
004011D8     84C0           TEST AL,AL
004011DA     75 1D          JNZ SHORT GetDrive.004011F9
↓
004011D3     C605 70334000 >MOV BYTE PTR DS:[FinalCheckFlag],1
004011DA     EB 1D          JMP SHORT GetDrive.004011F9

*== TARGET_FILE ================
FILENAME GetDriveTypeC.exe
* FileSize: 8704 bytes
* LastMod.: 2011/02/21 14:36:27
*===============================
000005D3: E8 C6
000005D4: F8 05
000005D5: FE 70
000005D6: FF 33
000005D7: FF 40
000005D8: 84 00
000005D9: C0 01
000005DA: 75 EB