//settimer
() timerid 为n1时
004017AA /$ 6A 20 PUSH 20 ;
/Length
= 20 (32.)
004017AC |. 68 E0664000 PUSH CrackMe.004066E0 ; |Destination = CrackMe.004066E0
004017B1 |. E8 D4040000 CALL <JMP.&kernel32.RtlZeroMemory> ; \RtlZeroMemory
//
将004066E0处清零.
004017B6 |. 68 13514000 PUSH CrackMe.00405113 ;
/c
:\windows\system32\option.ini
004017BB |. 6A 20 PUSH 20 ; |BufSize = 20 (32.)
004017BD |. 68 E0664000 PUSH CrackMe.004066E0 ; |ReturnBuffer = CrackMe.004066E0
004017C2 |. 6A 00 PUSH 0 ; |Default = NULL
004017C4 |. 68 39514000 PUSH CrackMe.00405139 ; |key
004017C9 |. 68 32514000 PUSH CrackMe.00405132 ; |serial
004017CE |. E8 8D040000 CALL <JMP.&kernel32.GetPrivateProfileStr>; \GetPrivateProfileStringA
//
把option.ini中的内容读到004066E0处
004017D3 |. 6A 40 PUSH 40 ;
/Length
= 40 (64.)
004017D5 |. 68 C0674000 PUSH CrackMe.004067C0 ; |111111111111111
004017DA |. E8 AB040000 CALL <JMP.&kernel32.RtlZeroMemory> ; \RtlZeroMemory
//
把004067C0处清零.
004017DF |. 6A 40 PUSH 40 ;
/Length
= 40 (64.)
004017E1 |. 68 00684000 PUSH CrackMe.00406800 ; |330103301111111
004017E6 |. E8 9F040000 CALL <JMP.&kernel32.RtlZeroMemory> ; \RtlZeroMemory
//
把00406800处清零.
004017EB |. 68 C0674000 PUSH CrackMe.004067C0 ; 111111111111111
004017F0 |. 68 E0664000 PUSH CrackMe.004066E0 ; ASCII
"gggggggg"
004017F5 |. E8 2BFFFFFF CALL CrackMe.00401725
?
//
004017FA |. 6A 20 PUSH 20 ;
/Length
= 20 (32.)
004017FC |. 57 PUSH EDI ; |Destination
004017FD |. E8 88040000 CALL <JMP.&kernel32.RtlZeroMemory> ; \RtlZeroMemory
00401802 |. 68 00684000 PUSH CrackMe.00406800 ; 330103301111111
00401807 |. 68 20674000 PUSH CrackMe.00406720 ; dnagfadu
0040180C |. E8 14FFFFFF CALL CrackMe.00401725
00401811 68 00684000 PUSH CrackMe.00406800 ; 330103301111111
00401816 |. 68 C0674000 PUSH CrackMe.004067C0 ; |111111111111111
0040181B |. E8 82040000 CALL <JMP.&kernel32.lstrcmpA> ; \lstrcmpA
//
从上分析关键是调用00401725处的函数
//
写入option.ini并读出来,
00401725 /$ 55 PUSH EBP
00401726 |. 8BEC MOV EBP,ESP
00401728 |. 6A 40 PUSH 40 ;
/Length
= 40 (64.)
0040172A |. 68 80684000 PUSH CrackMe.00406880 ; |dnaguadu
0040172F |. E8 56050000 CALL <JMP.&kernel32.RtlZeroMemory> ; \RtlZeroMemory
00401734 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ;
/String2
00401737 |. 68 80684000 PUSH CrackMe.00406880 ; |dnaguadu
0040173C |. E8 67050000 CALL <JMP.&kernel32.lstrcpyA> ; \lstrcpyA
//
上面是把第一个参数的值放入00406880处
//
00401741 |. 8D15 80684000 LEA EDX,DWORD PTR DS:[406880]
00401747 |. 8BF2 MOV ESI,EDX
00401749 |. 8A5A 06 MOV BL,BYTE PTR DS:[EDX+6]
0040174C |. 881E MOV BYTE PTR DS:[ESI],BL
0040174E |. 8A5A 07 MOV BL,BYTE PTR DS:[EDX+7]
00401751 |. 885E 04 MOV BYTE PTR DS:[ESI+4],BL
//
00401754 |. 33DB XOR EBX,EBX
00401756 |> 0FB60433
/MOVZX
EAX,BYTE PTR DS:[EBX+ESI]
0040175A |. 3C 39 |CMP AL,39
0040175C |. 7F 0A |JG SHORT CrackMe.00401768
//
如果AL中为字母的话,跳到401768去执行.
0040175E |. 83C0 05 |ADD EAX,5
00401761 |. 25 03000080 |AND EAX,80000003
00401766 |. EB 0D |JMP SHORT CrackMe.00401775
00401768 |> 83C0 03 |ADD EAX,3
//eax
= eax +3;
0040176B |. B9 05000000 |MOV ECX,5
//ecx
= 5
00401770 |. 99 |CDQ
00401771 |. F7F9 |IDIV ECX
//edx
= eax % ecx
00401773 |. 8BC2 |MOV EAX,EDX
//eax
= edx
00401775 |> 50 |PUSH EAX ; /<%d>
00401776 |. 68 00604000 |PUSH CrackMe.00406000 ; |%d
0040177B |. 68 C0684000 |PUSH CrackMe.004068C0 ; |1
00401780 |. E8 63040000 |CALL <JMP.&user32.wsprintfA> ; \wsprintfA
00401785 |. 83C4 0C |ADD ESP,0C
//
调用wsprintf对其格式化处理
00401788 |. 68 C0684000 |PUSH CrackMe.004068C0 ;
/1
0040178D |. 57 |PUSH EDI ; |ConcatString
0040178E |. E8 09050000 |CALL <JMP.&kernel32.lstrcatA> ; \lstrcatA
//
最后的与EDI
cat
.
00401793 |. 47 |INC EDI
00401794 |. 43 |INC EBX
00401795 |. 83FB 0F |CMP EBX,0F
00401798 |.^ 75 BC \JNZ SHORT CrackMe.00401756
0040179A |. 83EF 0F SUB EDI,0F
//
我们的重点是求的EDI的值.
0040179D |. 57 PUSH EDI ;
/String2
0040179E |. FF75 0C PUSH DWORD PTR SS:[EBP+C] ; |String1
004017A1 |. E8 02050000 CALL <JMP.&kernel32.lstrcpyA> ; \lstrcpyA
//
注意这里把EDI拷贝到[EBP+C]中去
004017A6 |. C9 LEAVE
004017A7 \. C2 0800 RETN 8
///////////////////////////////////////////////
//set
timer timerid 为n2时.
//
004018A3 /$ E8 AC030000 CALL <JMP.&kernel32.GetCurrentProcess> ; [GetCurrentProcess
004018A8 |. 6A 00 PUSH 0 ;
/pBytesRead
= NULL
004018AA |. 6A 02 PUSH 2 ; |BytesToRead = 2
004018AC |. 68 00694000 PUSH CrackMe.00406900 ; |t/
004018B1 |. 68 20184000 PUSH CrackMe.00401820 ; |pBaseAddress = 401820
004018B6 |. 50 PUSH EAX ; |hProcess
004018B7 |. E8 C2030000 CALL <JMP.&kernel32.ReadProcessMemory> ; \ReadProcessMemory
004018BC |. 66:A1 0069400>MOV AX,WORD PTR DS:[406900]
004018C2 |. 66:3B05 FF514>CMP AX,WORD PTR DS:[4051FF]
004018C9 |. 74 12 JE SHORT CrackMe.004018DD
004018CB |. 6A 00 PUSH 0
004018CD |. A0 40674000 MOV AL,BYTE PTR DS:[406740]
004018D2 |. 66:0FB6C0 MOVZX AX,AL
004018D6 |. 66:50 PUSH AX ;
/String
004018D8 |. E8 D7030000 CALL <JMP.&kernel32.lstrlenA> ; \lstrlenA
004018DD |> E8 72030000 CALL <JMP.&kernel32.GetCurrentProcess> ; [GetCurrentProcess
004018E2 |. 6A 00 PUSH 0 ;
/pBytesRead
= NULL
004018E4 |. 6A 02 PUSH 2 ; |BytesToRead = 2
004018E6 |. 68 00694000 PUSH CrackMe.00406900 ; |t/
004018EB |. 68 22184000 PUSH CrackMe.00401822 ; |t
/j
@h@g@
004018F0 |. 50 PUSH EAX ; |hProcess
004018F1 |. E8 88030000 CALL <JMP.&kernel32.ReadProcessMemory> ; \ReadProcessMemory
004018F6 |. 66:A1 0069400>MOV AX,WORD PTR DS:[406900]
004018FC |. 66:3B05 01524>CMP AX,WORD PTR DS:[405201]
00401903 |. 74 12 JE SHORT CrackMe.00401917
00401905 |. 6A 00 PUSH 0
00401907 |. A0 40674000 MOV AL,BYTE PTR DS:[406740]
0040190C |. 66:0FB6C0 MOVZX AX,AL
00401910 |. 66:50 PUSH AX ;
/String
00401912 |. E8 9D030000 CALL <JMP.&kernel32.lstrlenA> ; \lstrlenA
00401917 \> C3 RETN
//