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


ASPACK Manual Unpacking - Artur Dent's AD_CM#4





-|- A. Introduction



Bonjour a tous. au programme dujour : le cracme #4 de mr ArthurDent

on deballe PEID et ce dernier nous indique ceci : 

ASPack 2.11 -> Alexey Solodovnikov !

tiens dont ! y avait bien longtemps que je n'etais pas tombé sur du Aspack. PEiD nous predit 
une version 2.11, peu importe de maniere generale, ASPACK s'unpack quasiment a l'identique pour 
toutes ses versions, meme les plus recentes, type 2.12.



-|- B. Artur Dent's AD_CM#4


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

crackme author : Artur Dent's AD_CM#4
type : ASPACK + Name/Serial
level : 1

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


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

let's go donc pour un manual unpacking d'aspack.

Ascpack c koi donc ? : "ASPack is an advanced Win32 executable file compressor" identique a UPX 
donc à l'inverse qu'ASPACK est payant. Comment savoir si l'executable est packé par aspack..

il y a evidement l'utilisation de PEiD mais egalement tout simplement sous ollydebug, ALT + M, 
plus CTRL + B, puis rechercher "aspack" dans la section ASCII..


Encore une fois ici, a l'identique d'UPX, nous allons rechercher dans un premier temps l'OEP.

A peine chargé sous olly, il nous indique attention ceci un programme crypté ou packé..blablabla. OK.
CTRL +N puis clique droit sur ceci :

Names in AD_CM#4, item 2
 Address=0046B1CC
 Section=.aspack
 Type=Import  (Known)
 Name=kernel32.GetProcAddress

et "Toggle breakpoint on Import"



retournons a la fenetre CPU et F9 afin de lancer l'executable. Olly break kelke part dans le kernel ou 
la fonction que l'on vient de selectionné est appelé par la routine de decompression du loader

moi j'arrive ici :

7C80ADA0 >  8BFF            MOV EDI,EDI       ; kernel32.7C800000

je trace avec F8 jusqu'au retour dans le code du programme, ici :

0046A05B    8985 FC3F4400   MOV DWORD PTR SS:[EBP+443FFC],EAX        ; kernel32.VirtualAlloc


Alt + B et on enleve notre breakpoint.


Dump du crackme packé :
-----------------------

Pour unpacké du ASPACK il y a une regle a connaitre, qui marche a tous les coups. Il faut trouver où le 
programme est unpacké et il nous indiquera l'OEP. ASPACK c'est toujours ceci : 

  Hex
   61			POPAD
   7508      		JNZ quelque part
   B801000000   	MOV EAX,00000001
   C20C00 		RET
   6880xxxxxxxx		PUSH our_OEP  ;xxxxxxxx = Original Entry Point !
   C3			RET



On va donc faire une recherche en HEX pour trouver cette chaine :
 CTRL + B => 61 75 08 B8 01

et OP bingo  on arrive ici :

0046A3AA    61              POPAD
0046A3AB    75 08           JNZ SHORT 0046A3B5
0046A3AD    B8 01000000     MOV EAX,1
0046A3B2    C2 0C00         RET 0C
0046A3B5    68 00000000     PUSH 0
0046A3BA    C3              RET

on met un bpx sur :

0046A3B5    68 00000000     PUSH 0

et bingo vla notre OEP :

0046A3B5    68 F0844500     PUSH 004584F0


DUmpons maintenant tout ça. On ne ferme rien, et on lance LordPe. Dans les processus en cours, on selectionne notre executable, 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 4584F0 - 400000 = 584F0
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'abord 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 584F0
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 necessaires à 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 4.0 - 5.0

l'executable est UNPACKED ;)



On s'endort pas, c pas fini. Il faut maintenant cracker ce truc qd meme.


Reversing :
-----------


On degaine a nouveau ollydebug, et on regarde les All textes strings reference on voit un Welle don Cracker qui nous amene ici :

0045824E  |.  B8 08834500   MOV EAX,00458308                         ;  ASCII "Well done Cracker, You did it!"



ok . c bon signe .  regardons l'ensemble de la routine de calcul du serial afin de la decortiquer : 

00458176  |.  8D55 EC       LEA EDX,DWORD PTR SS:[EBP-14]
00458179  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0045817C  |.  8B80 D8020000 MOV EAX,DWORD PTR DS:[EAX+2D8]
00458182  |.  E8 05BFFCFF   CALL 0042408C
00458187  |.  837D EC 00    CMP DWORD PTR SS:[EBP-14],0
0045818B  |.  75 0A         JNZ SHORT 00458197
0045818D  |.  B8 A8824500   MOV EAX,004582A8                         ;  ASCII "Enter you name, pls."
00458192  |.  E8 4DC1FEFF   CALL 004442E4
00458197  |>  8D55 E8       LEA EDX,DWORD PTR SS:[EBP-18]
0045819A  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0045819D  |.  8B80 DC020000 MOV EAX,DWORD PTR DS:[EAX+2DC]
004581A3  |.  E8 E4BEFCFF   CALL 0042408C
004581A8  |.  837D E8 00    CMP DWORD PTR SS:[EBP-18],0
004581AC  |.  75 0A         JNZ SHORT 004581B8
004581AE  |.  B8 C8824500   MOV EAX,004582C8                         ;  ASCII "Enter the serial, pls."
004581B3  |.  E8 2CC1FEFF   CALL 004442E4
004581B8  |>  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
004581BB  |.  E8 BCB9FAFF   CALL 00403B7C
004581C0  |.  8BF8          MOV EDI,EAX
004581C2  |.  85FF          TEST EDI,EDI
004581C4  |.  7E 50         JLE SHORT 00458216
004581C6  |.  BB 01000000   MOV EBX,1
004581CB  |>  8B45 F8       /MOV EAX,DWORD PTR SS:[EBP-8]
004581CE  |.  0FB67418 FF   |MOVZX ESI,BYTE PTR DS:[EAX+EBX-1]
004581D3  |.  8BC6          |MOV EAX,ESI
004581D5  |.  B9 06000000   |MOV ECX,6
004581DA  |.  33D2          |XOR EDX,EDX
004581DC  |.  F7F1          |DIV ECX
004581DE  |.  8B55 F8       |MOV EDX,DWORD PTR SS:[EBP-8]
004581E1  |.  8BD6          |MOV EDX,ESI
004581E3  |.  C1EA 02       |SHR EDX,2
004581E6  |.  F7EA          |IMUL EDX
004581E8  |.  50            |PUSH EAX
004581E9  |.  8B45 F8       |MOV EAX,DWORD PTR SS:[EBP-8]
004581EC  |.  8BC6          |MOV EAX,ESI
004581EE  |.  B9 0A000000   |MOV ECX,0A
004581F3  |.  33D2          |XOR EDX,EDX
004581F5  |.  F7F1          |DIV ECX
004581F7  |.  5A            |POP EDX
004581F8  |.  92            |XCHG EAX,EDX
004581F9  |.  8BCA          |MOV ECX,EDX
004581FB  |.  33D2          |XOR EDX,EDX
004581FD  |.  F7F1          |DIV ECX
004581FF  |.  8D55 E4       |LEA EDX,DWORD PTR SS:[EBP-1C]
00458202  |.  E8 FDF8FAFF   |CALL 00407B04
00458207  |.  8B55 E4       |MOV EDX,DWORD PTR SS:[EBP-1C]
0045820A  |.  8D45 F4       |LEA EAX,DWORD PTR SS:[EBP-C]
0045820D  |.  E8 72B9FAFF   |CALL 00403B84
00458212  |.  43            |INC EBX
00458213  |.  4F            |DEC EDI
00458214  |.^ 75 B5         \JNZ SHORT 004581CB
00458216  |>  68 E8824500   PUSH 004582E8                            ;  ASCII "ADCM4-"
0045821B  |.  FF75 F4       PUSH DWORD PTR SS:[EBP-C]
0045821E  |.  68 F8824500   PUSH 004582F8                            ;  ASCII "-YEAH!"
00458223  |.  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
00458226  |.  BA 03000000   MOV EDX,3
0045822B  |.  E8 0CBAFAFF   CALL 00403C3C
00458230  |.  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
00458233  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00458236  |.  8B80 DC020000 MOV EAX,DWORD PTR DS:[EAX+2DC]
0045823C  |.  E8 4BBEFCFF   CALL 0042408C
00458241  |.  8B55 E0       MOV EDX,DWORD PTR SS:[EBP-20]
00458244  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
00458247  |.  E8 40BAFAFF   CALL 00403C8C
0045824C  |.  75 0A         JNZ SHORT 00458258
0045824E  |.  B8 08834500   MOV EAX,00458308                         ;  ASCII "Well done Cracker, You did it!"





bon, explication du merdier :

00458182  |.  E8 05BFFCFF   CALL 0042408C
00458187  |.  837D EC 00    CMP DWORD PTR SS:[EBP-14],0

prend la longueur du nom, et la compare à Zero, 



004581A3  |.  E8 E4BEFCFF   CALL 0042408C
004581A8  |.  837D E8 00    CMP DWORD PTR SS:[EBP-18],0

prend la longueur du serial, et la compare à zero


concernant la routine de generation du serial, en prenant l'hypothese ou je mets 'thomas' comme nom :

004581C6  |. BB 01000000    MOV EBX,1                           ;EBX=1
004581CB  |> 8B45 F8        /MOV EAX,DWORD PTR SS:[EBP-8]       ;EAX=longueur du nom (=6)
004581CE  |. 0FB67418 FF    |MOVZX ESI,BYTE PTR DS:[EAX+EBX-1]  ;ESI=Prend la premiere lettre (=t)(=74hex)
004581D3  |. 8BC6           |MOV EAX,ESI                        ;Met la valeur ESI dans EAX
004581D5  |. B9 06000000    |MOV ECX,6                          ;ECX=6
004581DA  |. 33D2           |XOR EDX,EDX                        ;EDX=0
004581DC  |. F7F1           |DIV ECX                            ;EAX=74\6
004581DE  |. 8B55 F8        |MOV EDX,DWORD PTR SS:[EBP-8]       ;EDX='thomas'
004581E1  |. 8BD6           |MOV EDX,ESI                        ;EDX=premiere lettre = t = 74hex
004581E3  |. C1EA 02        |SHR EDX,2                          ;EDX=74/(2^2)=1D
004581E6  |. F7EA           |IMUL EDX                           ;EAX=13*1D=227
004581E8  |. 50             |PUSH EAX                           ;Sauvegarde EAX
004581E9  |. 8B45 F8        |MOV EAX,DWORD PTR SS:[EBP-8]       ;EAX='thomas'
004581EC  |. 8BC6           |MOV EAX,ESI                        ;EAX=premiere lettre = t = 74hex
004581EE  |. B9 0A000000    |MOV ECX,0A                         ;ECX=0A
004581F3  |. 33D2           |XOR EDX,EDX                        ;EDX=0
004581F5  |. F7F1           |DIV ECX                            ;EAX=74\0A = 0B
004581F7  |. 5A             |POP EDX                            ;EDX=EAX pushed = 13*1D=227
004581F8  |. 92             |XCHG EAX,EDX                       ;EAX=EDX, EDX=EAX
004581F9  |. 8BCA           |MOV ECX,EDX                        ;ECX=EDX
004581FB  |. 33D2           |XOR EDX,EDX                        ;EDX=0
004581FD  |. F7F1           |DIV ECX                            ;EAX=227\0B
004581FF  |. 8D55 E4        |LEA EDX,DWORD PTR SS:[EBP-1C]
00458202  |. E8 FDF8FAFF    |CALL AD_CM#4_.00407B04             ;conversion EAX en DECIMAL = 50
00458207  |. 8B55 E4        |MOV EDX,DWORD PTR SS:[EBP-1C]      ;
0045820A  |. 8D45 F4        |LEA EAX,DWORD PTR SS:[EBP-C]
0045820D  |. E8 72B9FAFF    |CALL AD_CM#4_.00403B84
00458212  |. 43             |INC EBX                            ;
00458213  |. 4F             |DEC EDI                            ;
00458214  |.^75 B5          \JNZ SHORT AD_CM#4_.004581CB        ;LOOP pour faire toutes les lettres du nom


resumons donc encore une fois cette routine :

- chaque lettre du nom, est additionnée, pour le nom 'thomas' = 6
- il prend la premiere lettre du nom dans sa valeur HEXADECIMALE = 74
- Divise cette valeur par le nombre de lettres composants le nom = 74/6 = 13 (toujours en hexa)
- ensuite il reprend 74 qu'il divise par 2² = 1D
- multiplie 13 par 1D = 227
- Reprend a nouveau 74 et le divise par 0A = 0B
et pour terminer il divise 227 par ce 0B = 32 en HEXA et 50 EN decimale

et ce sur chaque lettre, ce qui donne pour thomas : 504444484248

mais c'est pas fini completement. En effet :

00458216  |> 68 E8824500    PUSH AD_CM#4_.004582E8              ;ASCII "ADCM4-"
0045821B  |. FF75 F4        PUSH DWORD PTR SS:[EBP-C]
0045821E  |. 68 F8824500    PUSH AD_CM#4_.004582F8              ;ASCII "-YEAH!"

de chaque coté de notre serial calculé, il rajoute ceci, ce qui donne pour notre serial calculé :

ADCM4-504444484248-YEAH!

on teste .. et bingo !



-|- C. Greetings


A toute le chan #old-school sur irc.worldnet.net, Misto, Kyler, Goda, Azerty, et tout particulierement 
a 'double atlanta' pour sa perceverance orthographique :)

retrouvez sur http://thomas.openmod.org l'ensemble de mes tutos et ezines.

a+