Crackme by Basse | |||
Intro | |||
I'm going to explain how this crackme works, but you won't find a valid
solution in here, if you want to find one, you'll have to brute it... TOOLS USED : WDASM |
|||
Where to start? | |||
If we try to enter a combination 3 times, the program crashes...ans possibly
your computer too! How is that possible?
|
|||
The code | |||
; Beginning of DlgProc 0040102C 55 push ebp * Possible Reference to Dialog: MYDIALOG, CONTROL_ID:0BB8, "" 0040106A 68B80B0000 push 00000BB8 0040106F FF7508 push [ebp+08] * Reference To: USER32.SetDlgItemTextA, Ord:0228h 00401072 E827020000 Call 0040129E ; Empty the edit box 00401077 58 pop eax ; pop hash 00401078 3DF700FB02 cmp eax, 02FB00F7 ; check hash 0040107D 7529 jne 004010A8 ; If not equal, inc counter 0040107F 6A40 push 00000040 ; Else good-guy message :) * Possible StringData Ref from Data Obj ->"Rev" 00401081 68AA304000 push 004030AA * Possible StringData Ref from Data Obj ->"Good job! You made it!" 00401086 6879304000 push 00403079 0040108B FF7508 push [ebp+08] * Reference To: USER32.MessageBoxA, Ord:01BBh 0040108E E8FF010000 Call 00401292 ; Display good-guy message * Possible StringData Ref from Data Obj ->"Success!" 00401093 6870304000 push 00403070 00401098 FF350D314000 push dword ptr [0040310D] * Reference To: USER32.SetWindowTextA, Ord:0259h 0040109E E807020000 Call 004012AA ; Put "success" in captionbar Ok, what do we have here? If we press the
'test' button, a hash value get's checked with 02FB00F7h, if we would
like to patch, the jnz is the place :) This is what the API reference says about SetWindowsHookExA : The SetWindowsHookEx function installs an application-defined hook procedure into a hook chain. An application installs a hook procedure to monitor the system for certain types of events. A hook procedure can monitor events associated either with a specific thread or with all threads in the system. This function supersedes the SetWindowsHook function. HHOOK SetWindowsHookEx( int idHook, // type of hook to install We find it here : :00401143 817D0C10010000 cmp dword ptr [ebp+0C], 00000110 ; WM_INITDIALOG * Reference To: USER32.SetWindowsHookExA, Ord:025Dh 00401162 E849010000 Call 004012B0 00401167 0BC0 or eax, eax ; if Hook succeeds 00401169 7405 je 00401170 0040116B A303314000 mov dword ptr [00403103], eax ; Save hook handle Next, the focus is set on the editbox, we are ready for input :) What happens in the above code? Well, when the DialogBox is created the
WM_INITDIALOG message is sent, so this code gets executed once at the
beginning. Next, the hook is set up. It' s a hook for WH_GETMESSAGE and the hook
routine starts at address 4011C0h. 004011C0 55 push ebp * Reference To: USER32.CallNextHookEx, Ord:0014h 004011D8 E89D000000 Call 0040127A 004011DD C9 leave 004011DE C20C00 ret 000C 004011E1 EB73 jmp 00401256 * Referenced by a (U)nconditional or (C)onditional Jump at Address:004011C7(C) 004011E3 837D0800 cmp dword ptr [ebp+08], 00000000 ; Check again 004011E7 756D jne 00401256 004011E9 8B5510 mov edx, dword ptr [ebp+10] 004011EC 817A0402010000 cmp dword ptr [edx+04], 00000102 ;WM_CHAR ? 004011F3 7561 jne 00401256 004011F5 8B4208 mov eax, dword ptr [edx+08] ; Move CHAR to eax 004011F8 8B4A08 mov ecx, dword ptr [edx+08] ; Move CHAR to ecx 004011FB 2A0508314000 sub al, byte ptr [00403108] 00401201 880D08314000 mov byte ptr [00403108], cl 00401207 D315FF304000 rcl dword ptr [004030FF], cl ; Start calculation 0040120D A008314000 mov al, byte ptr [00403108] 00401212 33C8 xor ecx, eax 00401214 C1E007 shl eax, 07 00401217 33C8 xor ecx, eax 00401219 C1E007 shl eax, 07 0040121C 33C8 xor ecx, eax 0040121E C1E007 shl eax, 07 00401221 33C8 xor ecx, eax 00401223 C1E003 shl eax, 03 00401226 33C8 xor ecx, eax 00401228 310DFF304000 xor dword ptr [004030FF], ecx 0040122E FF35FF304000 push dword ptr [004030FF] ; Store hash ... The next part, displays the hash in the captionbar (I think) Although I didn't see it (in XP) :( Ok, in the hook procedure all the CHARS are intercepted and the hash
is further calculated every time you press a key. The second byte var, is not needed for the algo, so we can cut it out
to speed up the bruting. mov al, byte ptr [serial+edi]
i=1
=> Note from the author if you want to start bruting <= It's only numbers, 0 - 9, and the length is 10. Basse Now you should be able to brute it in little time... |
|||
Final notes | |||
If you have questions, or remarks abou this tutorial, feel free to mail me.
Detten |
|||
|