Citation :
=> Point d'entrée de la fonction f004010DF() puis boucle avec :
- EBP-8 = adresse du code
- EBP+C = valeur du diviseur
004010F4 |> 8B55 F8 /MOV EDX,DWORD PTR SS:[EBP-8]
004010F7 |. 0FBE02 |MOVSX EAX,BYTE PTR DS:[EDX]
004010FA |. 8945 F0 |MOV DWORD PTR SS:[EBP-10],EAX
004010FD |. 8B4D F8 |MOV ECX,DWORD PTR SS:[EBP-8]
00401100 |. 83C1 01 |ADD ECX,1
00401103 |. 894D F8 |MOV DWORD PTR SS:[EBP-8],ECX
=> ^^ Avance dans le buffer ^^
00401106 |. 8B55 F0 |MOV EDX,DWORD PTR SS:[EBP-10]
=> ^^ recupère le caractère suivant du buffer ^^
00401109 |. C1EA 04 |SHR EDX,4
=> ^^ divise par 16 la valeur ASCII ^^
0040110C |. 8B4D F0 |MOV ECX,DWORD PTR SS:[EBP-10]
=> ^^ recupère le caractère suivant du buffer ^^
0040110F |. 83E1 0F |AND ECX,0F
00401112 |. D1E1 |SHL ECX,1
=> ^^ multiplie par 2 la partie basse ^^
00401114 |. 8B0495 3060400>|MOV EAX,DWORD PTR DS:[EDX*4+406030]
=> ^^ recupère la valeur depuis un tableau ^^ = TAB1 (tableau de masques en fait) = {00000000h,00000000h,00000000h,55550500h,A8AAAAAAh,AAAA2A00h,FCFFFFFFh,FFFF3F00h,00000000h,00000000h,00000000h,00000000h,00000000h,00000000h,00000000h,00000000h};
0040111B |. D3E8 |SHR EAX,CL
0040111D |. 83E0 03 |AND EAX,3
=> ^^ recupère les 3 derniers bits (val = 0 à 3) ^^
00401120 |. 0FBE88 7060400>|MOVSX ECX,BYTE PTR DS:[EAX+406070]
=> ^^ recupère la valeur depuis un tableau ^^ = TAB2 = {00h, 30h, 37h, 57h};
00401127 |. 894D F4 |MOV DWORD PTR SS:[EBP-C],ECX
0040112A |. 837D F4 00 |CMP DWORD PTR SS:[EBP-C],0
0040112E |. 74 20 |JE SHORT crack.00401150
=> ^^ On veut que la valeur soit comprise entre le caractère ASCII 48 et 128 ^^
00401130 |. 8B55 F0 |MOV EDX,DWORD PTR SS:[EBP-10]
00401133 |. 2B55 F4 |SUB EDX,DWORD PTR SS:[EBP-C]
00401136 |. 8955 F0 |MOV DWORD PTR SS:[EBP-10],EDX
00401139 |. 8B45 F0 |MOV EAX,DWORD PTR SS:[EBP-10]
0040113C |. 3B45 0C |CMP EAX,DWORD PTR SS:[EBP+C]
0040113F |. 73 0F |JNB SHORT crack.00401150
=> ^^ Teste si la valeur recuperée est bien < 10h ^^
Donc on veut que 0,1,2,...,9,A,B,...,F, les parties de code ne doivent contenir que des caractères hexa
00401141 |. 8B4D FC |MOV ECX,DWORD PTR SS:[EBP-4]
00401144 |. 0FAF4D 0C |IMUL ECX,DWORD PTR SS:[EBP+C]
00401148 |. 034D F0 |ADD ECX,DWORD PTR SS:[EBP-10]
0040114B |. 894D FC |MOV DWORD PTR SS:[EBP-4],ECX
0040114E |.^EB A4 \JMP SHORT crack.004010F4
=> ^^ Ajoute la valeur trouvée dans un buffer en multipliant par 10h la valeur d'avant ^^
Si l'on a rentré "0123F567-a-a" comme code, on a donc dans ce buffer :
0x00000001 au premier passage,
0x00000012 au deuxieme, ....
0x123F567 au dernier passage (avant le "-" qui n'est un caractère hexa)
00401150 |> 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
00401153 |. 83EA 01 SUB EDX,1
00401156 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00401159 |. 8910 MOV DWORD PTR DS:[EAX],EDX
0040115B |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0040115E |. 8BE5 MOV ESP,EBP
00401160 |. 5D POP EBP
00401161 \. C3 RETN
=> ^^ Remet en place le buffer contenant le code d'origine avant le dernier caractère lu ^^
|