Hellforge General Crackme IV
by LaZaRuS
Tutorial de Lucifer48 [Immortal Descendants]
(16 juillet 1999)
Ce crackme a été compilé par un compilateur inconnu (RHG-Profan). Pour ma part, je trouve que ça
ressemble un peu à du delphi dans le sens où il y a très peu d'appel à l'api, et des call sont
appélés à plusieurs reprises pour diverses raisons. Allons y ! Voilà deux façons d'entrer dans le
code: bpx MessageBoxA ou bpx Hmemcpy.
XXXX:00421582 PUSH EBP
XXXX:00421583 CALL 0041D35C ;lit le nom, puis ensuite le serial (*)
XXXX:00421588 POP ECX
XXXX:00421589 JMP 00421907
...
XXXX:0042159A PUSH EBP
XXXX:0042159B CALL 0041E3C4 ;mauvais serial (affiche la MessageBoxA)
(*) Ce call est appélé deux fois, la première fois le nom est lu (via SendMessageA, ce n'est pas
une dialog box), la deuxième fois c'est le serial.
Dans le call 0041D35C:
...
XXXX:0041D3C7 MOV EDX,[EBP-0104] ;le nom (se termine par un caractère nul)
XXXX:0041D3CD MOV EAX,00430518 ;destination (voir remarque)
XXXX:0041D3D2 MOV ECX,000000FF ;255 caractères maximun
XXXX:0041D3D7 CALL 00403AC8
Remarque: En 00430518, le nom aura ce format (taille du nom suivi du nom):
-----CRACKME!BSS+1518------------------------------byte--------------PROT---(0)--
XXXX:004305018 09 4C 75 63 69 66 65 72-34 38 .Lucifer48......
---------------------------------------------------------------------------------
Plus tard, à ce même endroit (00430518), le serial sera lu et aura la même disposition. J'ai donc
décidé de mettre un petit breakpoint (BPM 004305018 W) pour voir ce qui ce passe.
Voilà le résultat partiel (voilà tour à tour le chaînes de caractères qui sont copiées):
Lucifer48
name$
Lucifer48
serial2%
1234
serial2%
SERIAL
5678
serial2%
SERIAL
16784 ;<------ the right serial !!
serial%
36157800 ;comparaison avec mon serial (faite après la création du bon serial)
That was wrong
D'ou sort ce serial ?? Comment est-il calculé ??
Nous allons regarder ce qui ce passe lors de la recopie du serial. C'est ici:
XXXX:00402D7A MOV AL,[EBX+ESP-01] ;ebx=5
XXXX:00402D7E MOV [EDI],AL ;edi=0043051x
XXXX:00402D80 INC EDI
XXXX:00402D81 DEC EBX
XXXX:00402D82 JNZ 00402D7A
(attention cette "routine" sert à plusieurs reprises...)
Et juste au dessus:
XXXX:00402D3C MOV ECX,0000000A
XXXX:00402D41 XOR EBX,EBX
XXXX:00402D43 XOR EDX,EDX
XXXX:00402D45 DIV ECX ;conversion héxadécimal -> décimal
XXXX:00402D47 ADD EDX,30
XXXX:00402D4A MOV [EBX+ESP],DL
XXXX:00402D4D INC EBX
XXXX:00402D4E TEST EAX,EAX
Pour mon nom j'ai 16784 = 4190h d'où sort ce 4190h ???
Je découvre que, seul la longueur du nom est importante !
* 1 caractère, (1B00h), serial/ 6912
* 2 caractères, (1FD2h), serial/ 8146
* 3 caractères, (24A4h), serial/ 9380
...
* 9 caractères, (4190h), serial/ 16784
Et donc..... serial = 5678 + 1234*(taille-du-nom)
239ko pour ça !!!!!!
Greetings: All ID members (Volatility, Torn@do, ...), Eternal Bliss, ACiD BuRN,
Duelist, LaZaRuS, people on #cracking4newbies, french crackers, and other crackme makers.
(c) Lucifer48. All rights reversed