Nous
savons ici que nous avons à faire à un crackme utilisant
de la crypto, pour identifier certains algo je vais le scanner avec CryptTool
v1.2
CryptTool |
Offset
19B2 : Possibility of Hash MD
Nothing : SHA 384 Hash
Nothing : SHA 384 Hash
Nothing : SHA 512 Hash
Nothing : Tiger Hash
Offset 121E : TEA or ExTEA encryption
Offset 11CC : TEA or ExTea decryption
Nothing : DES
Nothing : newDES
Nothing : BlowFish
Nothing : RC2
Nothing : RC4
Nothing : Rinjael
Nothing : TwoFish
Nothing : Gost
Nothing : Misty 1
Nothing : Tiger Hash |
On sait déjà
qu'il faut s'attendre à du TEA associé à un hash
de type MD. Cela sera à vérifier bien sur en désassemblant
le keygenme. Passons à l'analyse
* Reference To: USER32.GetDlgItemTextA, Ord:0104h
|
:004010F2 8B3D98504000 mov edi, dword ptr [00405098]
:004010F8 8D459C lea eax, dword ptr [ebp-64]
:004010FB 6A64 push 00000064
:004010FD 50 push eax
:004010FE 68E9030000 push 000003E9
:00401103 56 push esi
:00401104 FFD7 call edi // call GetDlgItemTextA
:00401106 8BD8 mov ebx, eax
:00401108 83FB03 cmp ebx, 00000003 // le nom doit avoir une longueur mini
:0040110B 7D1C jge 00401129 // de 3 car |
:0040112F 6A64 push 00000064 :00401131 51 push ecx :00401132 68E8030000 push 000003E8 :00401137 56 push esi :00401138 FFD7 call edi // call GetDlgItemTextA :0040113A 83F810 cmp eax, 00000010 // le serial doit avoir une longueur :0040113D 75CE jne 0040110D // de 16 car (10h) |
:00401146 E8B5FEFFFF call 00401000 // fonction Hexstring to dword sur les 8 premiers chiffres :0040114B 8985B0FDFFFF mov dword ptr [ebp-250], eax // stock ce dword |
:00401158 E8A3FEFFFF call 00401000 //idem avec les 8 suivants :0040115D 8985B4FDFFFF mov dword ptr [ebp-24C], eax // stock |
:0040116A E831080000 call 004019A0 // initialisation du hash MD ---------------------------------------------------------------------------- on repere ici l'initialisation d'un hash MD, si l'on regarde le dossier de christal dans le M5 : :00401224 mov dword_0_4140B4, 67452301h :0040122E mov dword_0_4140B8, EFCDAB89h :00401238 mov dword_0_4140BC, 98BADCFEh... (pour le dernier dw, il suffit de chercher sur internet) on note une différence dans le 3ème dword, le hash à donc été modifié et il faudra en tenir compte dans le keygen ---------------------------------------------------------------------------- :004019A0 8B542404 mov edx, dword ptr [esp+04] :004019A4 57 push edi :004019A5 B917000000 mov ecx, 00000017 :004019AA 33C0 xor eax, eax :004019AC 8BFA mov edi, edx :004019AE F3 repz :004019AF AB stosd :004019B0 C70201234567 mov dword ptr [edx], 67452301 :004019B6 C7420489ABCDEF mov [edx+04], EFCDAB89 :004019BD C74208EFCDAB89 mov [edx+08], 89ABCDEF :004019C4 C7420C76543210 mov [edx+0C], 10325476 :004019CB 894214 mov dword ptr [edx+14], eax :004019CE 894210 mov dword ptr [edx+10], eax :004019D1 5F pop edi :004019D2 C3 ret |
:0040116F 8D559C lea edx, dword ptr [ebp-64] //nom dans edx
:00401172 53 push ebx
:00401173 8D8540FFFFFF lea eax, dword ptr [ebp-C0]
:00401179 52 push edx
:0040117A 50 push eax
:0040117B E860080000 call 004019E0 // md5_update
:00401180 8D8D40FFFFFF lea ecx, dword ptr [ebp-C0]
:00401186 8D9578FEFFFF lea edx, dword ptr [ebp-188]
:0040118C 51 push ecx
:0040118D 52 push edx
:0040118E E83D090000 call 00401AD0 //md5_finish (calcule le hash) |
pour savoir
quel hash a été modifié on va remplacer la valeur
d'initialisation par la vraie valeur,faire calculer le hash par le keygenme
et la comparer avec un hash donné par CryptTool. C'est un hash
MD4
à
télécharger : md4.c
+ md4.h
A noter que
si l'on entre dans le call de calcul, on voit que x3chun fait un lstrcpy
du hash vers une variable, il faudrat faire de même dans notre keygen
pour que tous les serials généré soient valides.
En effet le hash est considéré comme une string donc la
copie s'arretera au premier byte égal à 00.
:00401B4F 56 push esi
:00401B50 50 push eax * Reference To: KERNEL32.lstrcpyA, Ord:0302h
|
:00401B51 FF1554504000 Call dword ptr [00405054] |
on arrive
à l'initialisation du TEA.
:004011CB BA2037EFC6 mov edx, C6EF3720 // valeur caracteristique du tea pour le decodage
:004011D0 8B33 mov esi, dword ptr [ebx] // 1er dword du serial
:004011D2 8B7B04 mov edi, dword ptr [ebx+04] // 2eme dword |
suit l'algo,
il change quelque peu par rapport à celui vu dans le M5, mais on
s'y retrouve :), pour l'explication en détail sur le tea je vous
laisse regarder cette page
http://www.ftp.cl.cam.ac.uk/ftp/papers/djw-rmn/djw-rmn-tea.html
(thx jB)
donc l'algo
prend une variable Data_tea de 2 dwords (64 bits -> le fake serial)
et une variable Key de 4 dwords (128 bits -> le hash) decode le tout
et renvoie dans Data_tea 2 dwords.
le test se
termine par la comparaison entre data_tea[0], 78336368 et data_tea[1],
756E3A29
:0040124D 81FE68633378 cmp esi, 78336368
:00401253 7404 je 00401259
:00401255 83450C01 add dword ptr [ebp+0C], 00000001 * Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401253(C)
|
:00401259 81FF293A6E75 cmp edi, 756E3A29
:0040125F 7404 je 00401265 |
Donc pour
faire un keygen valide :
modified
md4(Name)
copie du hash vers un autre buffer
encrypter 78336368 et 756E3A29 avec le hash
Le code source
est téléchargable ici : keygen.zip |