Nous allons maintenant coder un keygen en assembleur. Vous pouvez accéder au keygen complet en cliquant sur ce lien KEYGEN. Le vrai problème de ce keygenme réside dans le code du keygen. En effet, le serial dépend de 3 bytes situés dans le binaire d'origine variables à chaque lancement ! Notre keygen doit donc tout d'abord se charger de récupérer ces 3 octets. Nous allons donc commencer le travail en scannant les processus actifs à la recherche du module "esoquynthe.exe". une fois le binaire trouvé, nous allons ouvrir le processus correspondant et nous allons subtiliser les 3 fameux bytes. Il ne nous restera plus qu'à utiliser la TABLE DE VERIFICATION pour récupérer la bonne séquence à cliquer.
Nous allons donc commencer par scanner les processus actifs à la recherche de notre module en utilisant une technique très répendue : CreateToolhelp32Snapshot
Les datas :
lpNumberOfBytesWritten DWORD 0
Nom_Module BYTE "esoquynthe.exe",0
hProcessSnap DWORD 0
hModuleSnap DWORD 0
pProcessEntry PROCESSENTRY32 <>
pModuleEntry MODULEENTRY32 <>
titre BYTE "information :",0
texte BYTE "Le crackme esoquynthe n'est pas lancé !",0
Le code :
push 0 push TH32CS_SNAPPROCESS call CreateToolhelp32Snapshot ; Snapshot of processes mov hProcessSnap, eax mov pProcessEntry.dwSize, SIZEOF PROCESSENTRY32 push offset pProcessEntry push hProcessSnap call Process32First ; Get first process Test_Process: cmp eax, 0 jnz Scan_Process jmp sortie Scan_Process: push pProcessEntry.th32ProcessID push TH32CS_SNAPMODULE call CreateToolhelp32Snapshot ; Snapshot of modules in the current process mov hModuleSnap, eax mov pModuleEntry.dwSize, SIZEOF MODULEENTRY32 push offset pModuleEntry push hModuleSnap call Module32First ; Get first Module Test_Module: cmp eax, 1 jnz Next_Process push offset pModuleEntry.szModule push offset Nom_Module call lstrcmpiA test eax, eax jnz NextModule jmp LIRE_PROCESS NextModule: push offset pModuleEntry push hModuleSnap call Module32Next jmp Test_Module Next_Process: push hModuleSnap call CloseHandle push offset pProcessEntry push hProcessSnap call Process32Next jmp Test_Process sortie: push 0 push offset titre push offset texte push 0 call MessageBoxA jmp fin ; ************************************ Détermine le code ! LIRE_PROCESS:
Nous allons alors ouvrir le processus et récupérer les 3 bytes.
LIRE_PROCESS: push pProcessEntry.th32ProcessID push 0 push PROCESS_VM_READ call OpenProcess push lpNumberOfBytesWritten push 4 push offset CHAINE push 405103h push eax call ReadProcessMemory
Nous pouvons alors tranquillement générer la bonne séquence de touches en utilisant une table comme la TABLE DE VERIFICATION.
Les Datas :
FORMAT_ BYTE "%.8x",0
CHAINE DWORD 0
CODE DWORD 0
DWORD 0
CODE_ascii BYTE 0 DUP(10)
TABLE BYTE 04h,03h,02h,01h,00h
BYTE 01h,00h,04h,03h,02h
BYTE 02h,01h,00h,04h,03h
BYTE 03h,02h,01h,00h,04h
Le code :
mov esi, offset CHAINE
mov edi, offset CODE
mov ecx, 1
Scan:
mov eax, 0
cmp byte ptr [esi], 0
jne @F
add eax, 0
jmp suite
@@:
cmp byte ptr [esi], 1
jne @F
add eax, 5
jmp suite
@@:
cmp byte ptr [esi], 2
jne @F
add eax, 0Ah
jmp suite
@@:
cmp byte ptr [esi], 2Bh
jne suite
add eax, 0Fh
suite:
cmp byte ptr [edi+ecx-1], 0
jne @F
add eax, 0
jmp boucle
@@:
cmp byte ptr [edi+ecx-1], 1
jne @F
add eax, 1
jmp boucle
@@:
cmp byte ptr [edi+ecx-1], 2
jne @F
add eax, 2
jmp boucle
@@:
cmp byte ptr [edi+ecx-1], 3h
jne @F
add eax, 3
jmp boucle
@@:
cmp byte ptr [edi+ecx-1], 4h
jne boucle
add eax, 4
boucle:
mov ebx, offset TABLE ------------------ Récupérer la valeur dans TABLE
add ebx, eax
movzx eax, byte ptr [ebx]
mov byte ptr [edi+ecx], al
inc ecx
inc esi
cmp ecx, 4
jne Scan
mov esi, CODE
push esi
push offset FORMAT_
push offset CODE_ascii
call wsprintfA
add esp, 0Ch
mov esi, offset CODE_ascii
add esi, 7
push esi
push SERIAL1
push hWin
call SetDlgItemTextA -------------------------------- Premier bouton
dec esi
mov word ptr [esi], 0
dec esi
push esi
push SERIAL2
push hWin
call SetDlgItemTextA ---------------------------------- Second bouton
dec esi
mov word ptr [esi], 0
dec esi
push esi
push SERIAL3
push hWin
call SetDlgItemTextA ---------------------------------- troisième bouton
dec esi
mov word ptr [esi], 0
dec esi
push esi
push SERIAL4
push hWin
call SetDlgItemTextA ---------------------------------- Quatrième bouton
Vous pouvez constater qu'à aucun moment je n'utilise les valeurs poussées sur la pile dans le binaire d'origine. Seule la TABLE est importante, le reste n'est que du décor.