Listing asm commenté de DEFI1

00401000 ]/$ 6A 00 PUSH 0 ; /pModule = NULL
00401002 |. E8 AB010000 CALL [JMP.&kernel32.GetModuleHandleA] ; \GetModuleHandleA (*1*)
00401007 |. A3 50304000 MOV DWORD PTR DS:[403050],EAX
0040100C |. 6A 00 PUSH 0 ; /lParam = NULL
0040100E |. 68 29104000 PUSH elooo1.00401029 ; |DlgProc = elooo1.00401029
00401013 |. 6A 00 PUSH 0 ; |hOwner = NULL
00401015 |. 6A 65 PUSH 65 ; |pTemplate = 65
00401017 |. FF35 50304000 PUSH DWORD PTR DS:[403050] ; |hInst = 00400000
0040101D |. E8 60010000 CALL [JMP.&user32.DialogBoxParamA] ; \DialogBoxParamA (*2*)
00401022 |. 6A 00 PUSH 0 ; /ExitCode = 0
00401024 \. E8 83010000 CALL [JMP.&kernel32.ExitProcess] ; \ExitProcess (*3*)
00401029 /. 55 PUSH EBP
0040102A |. 8BEC MOV EBP,ESP
0040102C |. 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
0040102F |. 83F8 10 CMP EAX,10
00401032 |. 75 0F JNZ SHORT elooo1.00401043
00401034 |. 6A 00 PUSH 0 ; /Result = 0
00401036 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401039 |. E8 4A010000 CALL [JMP.&user32.EndDialog] ; \EndDialog (*4*)
0040103E |. E9 C3000000 JMP elooo1.00401106
00401043 |] 3D 01020000 CMP EAX,201
00401048 |. 75 18 JNZ SHORT elooo1.00401062
0040104A |. 8B45 14 MOV EAX,DWORD PTR SS:[EBP+14]
0040104D |. 50 PUSH EAX ; /lParam
0040104E |. 6A 02 PUSH 2 ; |wParam = 2
00401050 |. 68 A1000000 PUSH 0A1 ; |Message = WM_NCLBUTTONDOWN
00401055 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401058 |. E8 43010000 CALL [JMP.&user32.PostMessageA] ; \PostMessageA (*5*)
0040105D |. E9 A4000000 JMP elooo1.00401106
00401062 |] 3D 10010000 CMP EAX,110
00401067 |. 75 21 JNZ SHORT elooo1.0040108A
00401069 |. 33C0 XOR EAX,EAX
0040106B |. 6A 66 PUSH 66 ; /RsrcName = 102.
0040106D |. FF35 50304000 PUSH DWORD PTR DS:[403050] ; |hInst = 00400000
00401073 |. E8 1C010000 CALL [JMP.&user32.LoadIconA] ; \LoadIconA (*6*)
00401078 |. 50 PUSH EAX ; /lParam
00401079 |. 6A 00 PUSH 0 ; |wParam = 0
0040107B |. 68 80000000 PUSH 80 ; |Message = WM_SETICON
00401080 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401083 |. E8 1E010000 CALL [JMP.&user32.SendMessageA] ; \SendMessageA (*7*)
00401088 |. EB 7C JMP SHORT elooo1.00401106
0040108A |] 3D 11010000 CMP EAX,111
0040108F |. 75 6C JNZ SHORT elooo1.004010FD
00401091 |. 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
00401094 |. 8B55 10 MOV EDX,DWORD PTR SS:[EBP+10]
00401097 |. C1EA 10 SHR EDX,10
0040109A |. 66:3D E903 CMP AX,3E9
0040109E |. 75 4C JNZ SHORT elooo1.004010EC
004010A0 |. 68 49304000 PUSH elooo1.00403049 ; /String2 = "Grmbl"
004010A5 |. 68 58304000 PUSH elooo1.00403058 ; |String1 = elooo1.00403058
004010AA |. E8 09010000 CALL [JMP.&kernel32.lstrcpyA] ; \lstrcpyA (*8*)
004010AF |. 6A 2D PUSH 2D ; /Count = 2D (45.)
004010B1 |. 68 00304000 PUSH elooo1.00403000 ; |Buffer = elooo1.00403000
004010B6 |. 68 EB030000 PUSH 3EB ; |ControlID = 3EB (1003.)
004010BB |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004010BE |. E8 CB000000 CALL [JMP.&user32.GetDlgItemTextA] ; \GetDlgItemTextA (*9*)
004010C3 |. E8 47000000 CALL elooo1.0040110F ; ********** CALL DE VERIF DU SERIAL **********
004010C8 |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
004010CA |. 68 37304000 PUSH elooo1.00403037 ; |Title = "Hehe"
004010CF |. 68 58304000 PUSH elooo1.00403058 ; |Text = "Grmbl"
004010D4 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
004010D7 |. E8 BE000000 CALL [JMP.&user32.MessageBoxA] ; \MessageBoxA (*10*)
004010DC |. 33C0 XOR EAX,EAX
004010DE |. BF 00304000 MOV EDI,elooo1.00403000 ; ASCII "12345"
004010E3 |. B9 32000000 MOV ECX,32
004010E8 |. F3:AA REP STOS BYTE PTR ES:[EDI] ; Vide le buffer qui contient le serial
004010EA |. EB 1A JMP SHORT elooo1.00401106
004010EC |] 66:3D EA03 CMP AX,3EA
004010F0 |. 75 14 JNZ SHORT elooo1.00401106
004010F2 |. 50 PUSH EAX ; /Result
004010F3 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004010F6 |. E8 8D000000 CALL [JMP.&user32.EndDialog] ; \EndDialog
004010FB |. EB 09 JMP SHORT elooo1.00401106
004010FD |] B8 00000000 MOV EAX,0
00401102 |. C9 LEAVE
00401103 |. C2 1000 RETN 10
00401106 |] B8 01000000 MOV EAX,1
0040110B |. C9 LEAVE
0040110C \. C2 1000 RETN 10
0040110F /$ 60 PUSHAD ; ***** DEBUT DU CALL DE VERIF ***** (registres sauves sur la pile)
00401110 |. 68 00304000 PUSH elooo1.00403000 ; parametre du call qui va suivre (ce paramètre = serial entre)
00401115 |. E8 32000000 CALL elooo1.0040114C ; convertit le serial entre en hexa (valeur retournee dans eax)
0040111A |. B9 07000000 MOV ECX,7 ; ecx = 7
0040111F |. 99 CDQ ; [edx:eax] = eax (eax etendu a 64 bits et edx = 0 - sign(eax))
00401120 |. F7F9 IDIV ECX ; eax = eax / ecx (division signee ; eax = resultat et edx = modulo)
00401122 |. 83E9 03 SUB ECX,3 ; ecx = ecx - 3
00401125 99 CDQ
00401126 |. F7E9 IMUL ECX ; eax = eax * ecx (multiplication signee)
00401128 |. 05 37130000 ADD EAX,1337 ; eax = eax + 1337h
0040112D |. 83E8 09 SUB EAX,9 ; eax = eax - 9
00401130 |. 3B05 32304000 CMP EAX,DWORD PTR DS:[403032] ; eax = DS:[403032] ? (DS:[403032] = 0BADCAFEh)
00401136 |. 75 0F JNZ SHORT elooo1.00401147 ; if (eax != 0BADCAFEh) on jmp a popad
00401138 |. 68 3C304000 PUSH elooo1.0040303C ; /String2 = "C'est good !"
0040113D |. 68 58304000 PUSH elooo1.00403058 ; |String1 = elooo1.00403058
00401142 |. E8 71000000 CALL [JMP.&kernel32.lstrcpyA] ; \lstrcpyA
00401147 |] 61 POPAD ; ***** FIN DU CALL DE VERIF ***** (registres recuperes de la pile)
00401148 \. C3 RETN ; Retour a l'instruction qui suit l'appel au call (004010C8)
00401149 CC INT3
0040114A CC INT3
0040114B CC INT3
0040114C /$ 55 PUSH EBP ; Debut de la fonction de convertion en hexa
0040114D |. 8BEC MOV EBP,ESP
0040114F |. 56 PUSH ESI
00401150 |. 57 PUSH EDI
00401151 |. 33C0 XOR EAX,EAX ; eax = 0
00401153 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8] ; esi = offset du buffer qui contient le serial entre
00401156 |. 33C9 XOR ECX,ECX ; ecx = 0
00401158 |. 33D2 XOR EDX,EDX ; edx = 0
0040115A |. 8A06 MOV AL,BYTE PTR DS:[ESI] ; prend chaque caractere du serial rentre 1 a 1
0040115C |. 46 INC ESI ; esi++ (caractere suivant)
0040115D |. 3C 02 CMP AL,2 ; hexa(caractere) = 2 ?
0040115F |. 75 12 JNZ SHORT elooo1.00401173 ; if (hexa(caractere= != 2)) alors jmp 00401173
00401161 |. 8A06 MOV AL,BYTE PTR DS:[ESI]
00401163 |. F7D2 NOT EDX
00401165 |. 46 INC ESI
00401166 |. EB 0B JMP SHORT elooo1.00401173
00401168 |] 2C 30 /SUB AL,30 ; (hexa(caractere) stocke dans al) - 30h
0040116A |. 8D0C89 |LEA ECX,DWORD PTR DS:[ECX+ECX*4] ; /
0040116D |. 8D0C48 |LEA ECX,DWORD PTR DS:[EAX+ECX*2] ; \ convertit en hexa
00401170 |. 8A06 |MOV AL,BYTE PTR DS:[ESI] ; al = hexa(caractere suivant)
00401172 |. 46 |INC ESI ; esi++
00401173 |] 0AC0 OR AL,AL
00401175 |.^ 75 F1 \JNZ SHORT elooo1.00401168 ; s'il reste encor des caractere du serial on jmp en 00401166
00401177 |. 8D0411 LEA EAX,DWORD PTR DS:[ECX+EDX] ; met l'offset du buffer "resultat" dans eax
0040117A |. 33C2 XOR EAX,EDX
0040117C |. 5F POP EDI
0040117D |. 5E POP ESI
0040117E |. C9 LEAVE
0040117F \. C2 0400 RETN 4 ; on quitte la fonction et revient a notre routine
00401182 $- FF25 20204000 JMP DWORD PTR DS:[[&user32.DialogBoxPara] ; user32.DialogBoxParamA
00401188 $- FF25 1C204000 JMP DWORD PTR DS:[[&user32.EndDialog]] ; user32.EndDialog
0040118E $- FF25 14204000 JMP DWORD PTR DS:[[&user32.GetDlgItemTex] ; user32.GetDlgItemTextA
00401194 $- FF25 28204000 JMP DWORD PTR DS:[[&user32.LoadIconA]] ; user32.LoadIconA
0040119A $- FF25 10204000 JMP DWORD PTR DS:[[&user32.MessageBoxA]] ; user32.MessageBoxA
004011A0 $- FF25 24204000 JMP DWORD PTR DS:[[&user32.PostMessageA]] ; user32.PostMessageA
004011A6 $- FF25 18204000 JMP DWORD PTR DS:[[&user32.SendMessageA]] ; user32.SendMessageA
004011AC .- FF25 04204000 JMP DWORD PTR DS:[[&kernel32.ExitProcess] ; kernel32.ExitProcess
004011B2 $- FF25 00204000 JMP DWORD PTR DS:[[&kernel32.GetModuleHa] ; kernel32.GetModuleHandleA
004011B8 $- FF25 08204000 JMP DWORD PTR DS:[[&kernel32.lstrcpyA]] ; kernel32.lstrcpyA
004011BE 00 DB 00

Precisions :

		
(*1*) GetModuleHandleA 
-->> Renvoie l'handle du crackme

(*2*) DialogBoxParamA
-->> Crée une modal dialog box, et bloquera l'application tant qu'elle n'aura pas été détruite.

(*3*) ExitProcess
-->> On quitte le crackme

(*4*) EndDialog
-->> Fermeture de la boite de dialogue

(*5*) PostMessageA  
-->> Envoi d'un message (notifications, traitements asynchrones)

(*6*) LoadIconA
-->> Charge la ressource icône spécifiée depuis un fichier exécutable (.EXE) associé avec une instance d'application

(*7*) SendMessageA
-->> Envoi d'un message (sans passer par la file d'attente)

(*8*) lstrcpyA
-->> Copie le contenu d'un buffer dans un autre buffer (ici le buffer qui correspond à la string à afficher dans la messagebox)

(*9*) GetDlgItemTextA
-->> Récupère le contenu du buffer

(*10*) MessageBoxA
-->> Affiche une boite de dialogue prédéfinie contenant le texte spécifié