___           ___           ___           ___           ___           ___     
     /\  \         /\__\         /\  \         /\__\         /\  \         /\  \    
     \:\  \       /:/  /        /::\  \       /::|  |       /::\  \       /::\  \   
      \:\  \     /:/__/        /:/\:\  \     /:|:|  |      /:/\:\  \     /:/\ \  \  
      /::\  \   /::\  \ ___   /:/  \:\  \   /:/|:|__|__   /::\~\:\  \   _\:\~\ \  \ 
     /:/\:\__\ /:/\:\  /\__\ /:/__/ \:\__\ /:/ |::::\__\ /:/\:\ \:\__\ /\ \:\ \ \__\
    /:/  \/__/ \/__\:\/:/  / \:\  \ /:/  / \/__/~~/:/  / \/__\:\/:/  / \:\ \:\ \/__/
   /:/  /           \::/  /   \:\  /:/  /        /:/  /       \::/  /   \:\ \:\__\  
   \/__/            /:/  /     \:\/:/  /        /:/  /        /:/  /     \:\/:/  /  
                   /:/  /       \::/  /        /:/  /        /:/  /       \::/  /   
                   \/__/         \/__/         \/__/         \/__/         \/__/    
				   .openmod.org

Reversing Engineering + Manual unpacked UPX + keygen .

-|- A. Introduction

Bonjour a tous. au programme dujour : le cracme #1 de Scarabee.

"Easy little crackme, just for you to find the serial (very basic) and perhaps to code a keygen, 
as the algo is not difficult at all. Coded for the real beginner, just a nice relaxing crackme 
for education sake."

ok . voyons ça de plus pret.

-|- B. Scarabee's Crackme


----------------------------------------------------------------------------------------

crackme : 1
crackme author : scarabee
type : Serial/Name/UPX

----------------------------------------------------------------------------------------


Analyse :
-----------

Avant de vous lancer corps et ame dans ollydebug, prennez toujours l'habitude d'analyse l'exe avec 
PEiD au prealable. Ceci pourrez vous eviter de perdre du temps.

PEiD nous indique ceci: 
UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo

Bon, on va commencer tranquillement par un manual Unpacking d'UPX.


Unpacking :
-------------
UPX, pour : "Ultimate Packer for eXecutables". Upx est un packer d'executable, totalement gratuit. 
Il ne fait que compresser l'executable, il ne le crypte pas. Cependant l'executable packer par UPX 
permet au String Data References d'etre 'cachés'. 


En recuperant UPX, les 3/4 du temps vous arriverez a decompresser l'executable packer, par un 
simple : upx.exe -d votrefichier.exe

Aujourd'hui on va se unpacker ça, manuellement .. a l'ancienne.

Lorsque UPX compresse un fichier, il greffe à ce fichier ce qu’on appelle le LOADER, qui est donc 
responsable de la décompression du fichier.

Il modifie l’entry-point du programme (qui correspond à l’adresse où commence le programme) pour 
que ce soit le LOADER qui se charge en premier, décompressant le programme en mémoire qui devient 
lisible.


Dump du crackme packé.
----------------------

Le dump correspond a copier un programme en mémoire.  Utile pour notre exemple, car nous allons copier 
tout ce qui se trouve en memoire aprés l'action du LOADER, ceci afin d'avoir le programme decompressé.

OEP pour Original Entry Point, c’est le point de depart ou le programme non packé va demarrer. 
Lorsqu’un packer est présent, c’est le LOADER qui se chargera en premier, et qui va commander la 
décompression de l'executable.Une fois décompressé, le LOADER va jumper vers l’OEP du programme, afin 
que celui-ci se lance normalement.

On degaine Ollydebug, et on ouvre notre crackme.exe. Olly nous indique que le programme semble crypte 
ou compressé. OK.

Upx n'interfere pas avec le programme. Upx sauvegarde donc la valeur de tous les registres avant son 
exécution, les restaure une fois qu’il a fini sa decompression. La fonction permettant de sauvegarder 
tous les registres est "pushad", celle permettant de les récupérer est "popad". Une fois que le LOADER 
a fini de travailler, il restaure les registres et passe la main au programme en sautant vers l’OEP de 
celui-ci.

ollydebug nous annonce des le depart le  : 
004623F0 > $  60            PUSHAD

puis, tout a la fin :
0046255A   > \61            POPAD
0046255B   .^ E9 D0CFFEFF   JMP 0044F530

ON pose un bpx sur le JMP en 0046255B, afin d'etre certain que le programme soit decompressé.  On lance, 
et olly break. On ferme rien, et on lance LordPe. Dans les processus en cours, on selectionne notre crackme, 
puis click droit > dump FULL.
On enregistre.

On click sur PE editor, on charge notre DUMP, et l'on modifie l'entry point. IL faut faire la valeur de 
OEP - celle de l'image base.

Donc 44F530 - 400000 = 4F530
On fait save puis OK.


IAT
------

Desormais il va falloir s'occuper de l'IAT. Quand une application veut appeler une fonction de l'API, elle 
n'appelle pas directement la DLL correspondante : elle utilise plutôt une table locale appelée l'IAT 
("Import Address Table") qui liste les adresses des fonctions de toutes les DLL utilisées par l'application. 
L'IAT est donc une table d'indirections qui permet de "lier" l'executable aux différentes DLL du système.

Pour import IAT nous allons tout d'abors lancer le cracme packé, puis IMPrec (1.6 pour ma part).
On selectionne notre active process, puis on modifie OEP sous IAT infos needed. Encore une fois on indique donc 
4F530 puis on clique sur IAT autosearch, IMPrec nous indique qu'il a trouvé quelque chose.
on fait un GET importes , IMPrec se charge d'importer les fonctions necessaire a l'executable.
ON fait maintenant un FIX DUMP, on selectionne notre DUMP precedent, et OK.  IMPrec se charge de reconstruire 
notre IAT

On relance PEiD et on analyse a nouveau notre dump_.exe .. et là .. bingo, il nous indique : 

Borland Delphi 6.0 - 7.0

le crackme est UNPACKED ;)



On s'endort pas, c pas fini. Il faut maintenant cracker le crackme.


Sous olly , search for all referenced text string

je trouve sur  : "WELL DONE!" "You found the serial, now a keygen"

ce qui nous amene ici :

0044F290  |.  B9 D8F24400   MOV ECX,0044F2D8                         ;  ASCII "WELL DONE!"


reprennons donc depuis un peu plu haut :

0044F226  |.  BB 01000000   MOV EBX,1
0044F22B  |>  8D55 F4       /LEA EDX,DWORD PTR SS:[EBP-C]
0044F22E  |.  8B87 F0020000 |MOV EAX,DWORD PTR DS:[EDI+2F0]
0044F234  |.  E8 D3F2FDFF   |CALL 0042E50C
0044F239  |.  8B45 F4       |MOV EAX,DWORD PTR SS:[EBP-C]
0044F23C  |.  0FB64418 FF   |MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]
0044F241  |.  F7EB          |IMUL EBX
0044F243  |.  0145 FC       |ADD DWORD PTR SS:[EBP-4],EAX
0044F246  |.  43            |INC EBX
0044F247  |.  4E            |DEC ESI
0044F248  |.^ 75 E1         \JNZ SHORT 0044F22B
0044F24A  |>  8D55 F0       LEA EDX,DWORD PTR SS:[EBP-10]
0044F24D  |.  8B87 F0020000 MOV EAX,DWORD PTR DS:[EDI+2F0]
0044F253  |.  E8 B4F2FDFF   CALL 0042E50C
0044F258  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
0044F25B  |.  E8 6452FBFF   CALL 004044C4
0044F260  |.  F76D FC       IMUL DWORD PTR SS:[EBP-4]
0044F263  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
0044F266  |.  8D55 EC       LEA EDX,DWORD PTR SS:[EBP-14]
0044F269  |.  8B87 F4020000 MOV EAX,DWORD PTR DS:[EDI+2F4]
0044F26F  |.  E8 98F2FDFF   CALL 0042E50C
0044F274  |.  8B45 EC       MOV EAX,DWORD PTR SS:[EBP-14]
0044F277  |.  50            PUSH EAX
0044F278  |.  8D55 E8       LEA EDX,DWORD PTR SS:[EBP-18]
0044F27B  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0044F27E  |.  E8 2990FBFF   CALL 004082AC
0044F283  |.  8B55 E8       MOV EDX,DWORD PTR SS:[EBP-18]
0044F286  |.  58            POP EAX
0044F287  |.  E8 7C53FBFF   CALL 00404608
0044F28C  |.  75 18         JNZ SHORT 0044F2A6
0044F28E  |.  6A 40         PUSH 40
0044F290  |.  B9 D8F24400   MOV ECX,0044F2D8                         ;  ASCII "WELL DONE!"
0044F295  |.  BA E4F24400   MOV EDX,0044F2E4                         ;  ASCII "You found the serial, now a Keygen!"


Si je place un Break sur 0044F28C, je lance le crackme,  thomas / 123456  et op il break.

dans la fenetre en bas a droite d'olly , je recupere direct mon serial :
0013F3CC   0097208C  ASCII "13608"
0013F3D0   00972078  ASCII "123456"
0013F3D4   00972050  ASCII "thomas"


"13608".. sympa mais comment il a fait pour le generer ?  reprennons dond depuis plus haut. 


0044F226  |.  BB 01000000   MOV EBX,1
0044F22B  |>  8D55 F4       /LEA EDX,DWORD PTR SS:[EBP-C]
0044F22E  |.  8B87 F0020000 |MOV EAX,DWORD PTR DS:[EDI+2F0]
0044F234  |.  E8 D3F2FDFF   |CALL 0042E50C
0044F239  |.  8B45 F4       |MOV EAX,DWORD PTR SS:[EBP-C]          
0044F23C  |.  0FB64418 FF   |MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]  met chaque lettre du nom dans EAX
0044F241  |.  F7EB          |IMUL EBX				multiplie par EBX
0044F243  |.  0145 FC       |ADD DWORD PTR SS:[EBP-4],EAX	Ajoute la valeur en STACK
0044F246  |.  43            |INC EBX				Increment EBX
0044F247  |.  4E            |DEC ESI				Decrement ESI
0044F248  |.^ 75 E1         \JNZ SHORT 0044F22B
0044F24A  |>  8D55 F0       LEA EDX,DWORD PTR SS:[EBP-10]
0044F24D  |.  8B87 F0020000 MOV EAX,DWORD PTR DS:[EDI+2F0]
0044F253  |.  E8 B4F2FDFF   CALL 0042E50C
0044F258  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]	Prend la longueur de nom
0044F25B  |.  E8 6452FBFF   CALL 004044C4
0044F260  |.  F76D FC       IMUL DWORD PTR SS:[EBP-4]		Multiplie longueur du nom avec EBP-4
0044F263  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
0044F266  |.  8D55 EC       LEA EDX,DWORD PTR SS:[EBP-14]
0044F269  |.  8B87 F4020000 MOV EAX,DWORD PTR DS:[EDI+2F4]
0044F26F  |.  E8 98F2FDFF   CALL 0042E50C
0044F274  |.  8B45 EC       MOV EAX,DWORD PTR SS:[EBP-14]
0044F277  |.  50            PUSH EAX
0044F278  |.  8D55 E8       LEA EDX,DWORD PTR SS:[EBP-18]
0044F27B  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0044F27E  |.  E8 2990FBFF   CALL 004082AC
0044F283  |.  8B55 E8       MOV EDX,DWORD PTR SS:[EBP-18]
0044F286  |.  58            POP EAX
0044F287  |.  E8 7C53FBFF   CALL 00404608
0044F28C  |.  75 18         JNZ SHORT 0044F2A6
0044F28E  |.  6A 40         PUSH 40
0044F290  |.  B9 D8F24400   MOV ECX,0044F2D8                         ;  ASCII "WELL DONE!"
0044F295  |.  BA E4F24400   MOV EDX,0044F2E4                         ;  ASCII "You found the serial, now a Keygen!"



ce qui nous donne pour thomas  : 


t=(74x1)=74
h=(68x2)=D0
o=(6Fx3)=14D
m=(6Dx4)=1B4
a=(61x5)=1E5
s=(73x6)=2B2

ce qui nous donne : 8DC
on le multiplie par 6 (car 'thomas' = 6 lettres)= 3528
on converti en decimal = 13608
Bingo !