Laddove il ProcDump fallisce arriva Que :)
(Manual unpacking e cracking)


28-11-1999

by "Quequero"

 

 

UIC's Home Page

Published by Quequero


Checkov disse: le donne senza gli uomini appassiscono,

Bellissimo il tutorial di questo Quequero...:) scherzo, vi presento un tute che dovrebbe piacervi assai :)...ciauzzz

gli uomini senza le donne diventano matti!...Bhè aveva ragione :)
UIC's form
Home page: http://quequero.cjb.net
E-mail: [email protected]
On irc: #crack-it, #UIC
UIC's form

Difficoltà

( )NewBies (X)Intermedio ( )Avanzato ( )Master

 

Siete pronti per unpackare un programma senza il procdump? Allora viaaaaa!!!!!.


Laddove il ProcDump fallisce arriva Que :)
(Manual unpacking e cracking)
Written by Quequero
Allegato!!!

Introduzione

Unpackeremo manualmente e crackeremo un meraviglioso ed utilissimo tool

Tools usati

SoftIce qualunque versione
ADump
ProcDump
Hex-Workshop 3.01 o qualunque altro Hex-Editor
Dei foglietti di carta e la calcolatrice di wintonno...una penna...Si, il sangue va bene lo stesso :)

URL o FTP del programma

http://quequero.cjb.net sezione tools

Notizie sul programma 

Il pargolo è un piccolo ApiSpy, cioè uno di quei programmini che ti dico le api che usano gli altri programmini :) ottimo anche come monitor durante il cracking

Essay

Salve a tutti raga, scaricate ed installate questo magnifico programmino....avviatelo e vedrete un brutto nag con scritto UNREGISTERED....non ci piace, poi viene una messagebox che ci avvisa che il programma non è registrato e poi troviamo anche un pulsante "register".....come se non bastasse non possiamo salvare nel log più di venti chiamate......e che kazzo, non ci potevano mette pure qualche funzione che ti faceva esplodere il pc se avviavi il pc troppe volte? :)...hehe non disperate, siamo qui per porre rimedio a questi problemi, il programma è il paziente malato e noi siamo i chirurghi con manie da jack lo squaratore......Apis32.....TREMAAAAAAA :)!!!!!!!
Basta cazzate, iniziamo......Il programma è packato e questo lo si nota soprattutto perchè se settiamo un breakpoint quello non dura neanche un microsecondo...se poi disassembliamo il programma, bhè ancora peggio. Aprite quindi procdump e facendo finta che non esiste il GetTyp provate tutte le combinazioni dei packer...vedrete che il file viene unpackato da "petite < 1.3", bene, avviate il file.....dho! Non parte....mmmm sta cosa non ci piace....io che sono un tipo che non pensa ma agisce (un po' come una capra) ho detto: "Okkei ti unpacko a mano" ricordandomi solo ora che era possibile far funzionare il file del procdump solo dopo alcune modifiche...oki, andiamo avanti.
Aprite adump da un prompt di dos e premete "R", dovreste avere qualcosa di simile:
 
:r
Internal variables:
-------------------
STARTOFFS: 0x8423F000   <---Questo ci interessa parecchio
ENDOFFS: 0x84333240
LIMIT: 0xF4240 (1000000 )
CUROFFS: 0x8423F000
MAPFN: C:\WINDOWS\TEMP\ADump.log
MAPFSIZE: 0xF4240
ANFILTER: A..Z,a..z,0..9
:
(mi raccomando non chiudete il programma...il caro adump non fa altro che mappare in memoria un file di un mega e 0x8423F000 è l'offset di inizio di questo file...ci servirà dopo per dumpare i dati dell'apispy...aprite l'hex workshop ed andate all'entrypoint del programma (D400h) sostituite il primo byte con CCh (è l'opcode di Int3), salvate il tutte ed uscite.....aprite sice (ctrl+d) mettete un breakpoint sull'interrupt 3 (bpint 3) e chiudete sice, avviate adesso apisspy e appena sice poppa scrivete: e eip 66
in questo modo rimettete il byte originale al suo posto visto che prima l'avevamo cambiato in CC, fatto ciò avrete davanti due push ed una chiamata:
:0041A000 CC                       int 03 <----Questo l'abbiamo settato prima
:0041A001 9C                       pushfd
:0041A002 60                       pushad
:0041A003 E8CA000000  call 0041A0D2 <----Questa è la chiamata che dobbiamo esaminare
:0041A008 0300 add eax,  dword ptr [eax]
                                        
entrate nella call con F8 e date vita ad un estenuante step finchè non arriverete qua
:004055C0 55                          push ebp <----Questo è l'entry point originale, ma l'indirizzo dell'entry lo trovate in eax (1A000h)
:004055C1 8BEC                    mov ebp, esp
:004055C3 6AFF                     push FFFFFFFF
:004055C5 6810804000       push 00408010
:004055CA 6818544000       push 00405418
:004055CF 64A100000000  mov eax, dword ptr fs:[00000000]
:004055D5 50                          push eax
 
adesso potremmo iniziare il dump visto che siamo arrivati all'entrypoint originale cioè quello del programma non packato...ma come faccio a dirlo? In genere i packer arrivano ad un jmp eax e quello significa stanno per arrivare all'entry originale, in questo caso però non possiamo basarci su questo "trick" però possiamo notare due cose:
1) Scorrendo il listato in sice vediamo molte api che sicuramente non servono al packer
2) Guardando la barra verde in basso a sice scopriamo che siamo passati dalla sezione .madmat alla .text
capito ora? La sezione che ci interessa è sempre la .text o la .CODE, a questo punto iniziamo il dumping, per prima cosa dobbiamo controllare che tutte le pagine da dumpare sono in memoria e dobbiamo anche sapere quanti byte dobbiamo dumpare......arrivati qui scrivete in sice: task
ed avremo la lista di tutte le applicazioni attive, la nostra è ovviamente api32, quindi scrivete: map32 apis32
ed avrete una lista completa di tutte le sezioni:
 
Owner      Obj Name  Obj#        Address                                   Size
Apis32    .text              0001       015F:00401000 Offset:      0000F000
Apis32    .idata             0002       0167:00410000 Offset:     00001000
Apis32    .rsrc              0003       0167:00411000 Offset:     00009000
Apis32   .madmat        0004       015F:0041A000 Offset:    0000D268
 
per prima cosa calcoliamoci il numero di bytes da dumpare, quindi fate cosi: Rva ultima sez - imagesize +1000
in sice diventa: ? 41A000-400000+1000 = 1B000
1000 è la lunghezza del PE, quindi il nostro file UNPACKATO sarà lungo 1B000h bytes, adesso vediamo quante pagine di memoria occupa tutto il programma e sopratutto vediamo quante pagine non sono in memoria, aprite la calcolatrice di windows e, sapendo che ogni pagina di memoria occupa 4095bytes cioè FFFh scriviamo: lunghezza programma / FFF
1B000/FFF = 1B....il programma occupa 27 pagine di memoria, quindi vediamo se sono tutte presenti, per questo useremo la funzione "page" partendo dall'indirizzo 400000:
page 400000 L 1b
bene, bene, se la pagina è presente vedrete qualcosa di simile: 00400000    023a9000   P    A  U  R  Private
se invece è assente vedrete: 00400000   NP  023a9000
scorrete tutta la lista e scoprirete che molte pagine non sono presenti, la prima è 400000, segnatevi tutte quelle assenti su un foglietto e poi scrivete: pagein 400000
pagein 418000
pageun 419000
pagein 41A000
ripeterete tutto questo per tutte quante le pagine assenti....fatto ciò avremo il programma bello e pronto da dumpare, per farlo dobbiamo trasferire tutti i suoi byte dalla memoria al file mappatoci da adump, in questo modo:                                     m address1 L address2
che per noi diventa: m 400000 L 1B000 8423F000 <---Questo è l'offset che ho evidenziato poco sopra
bene, adesso andiamo in adump (se l'avete chiuso so' cavoli vostri, dovete riniziare :) alla riga di comando scrivete:
w c:\unpacked.exe 1B000 8423F000
che significa: scrivi nel file "unpacked.exe" 1B000 bytes che trovi all'offset 8423F000......adesso abbiamo il file unpackato ma non lo runnate che non funziona, per prima cosa dobbiamo rimettere a posto l'entry originale, quindi aprite procdump, pe editor, unpacked.exe....bhè l'entry sta a posto è quello giusto cioè 1A000, ma dobbiamo comunque riallineare il file, quindi clickate su sections e editate ogni section ponendo la Psize uguale alla Vsize e l'Offset uguale all'RVA, se in pratica avete questo:
Vsize: 00001000     RVA: 00001000
Psize: 00000940     Offset: 00002567
 
dovete trasformarlo in questo:
Vsize: 00001000     RVA: 00001000
Psize: 00001000     Offset: 00001000
 
se avete fatto bene il lavoro per tutte le sezioni ed avete premuto F5 per aggiornare il desktop vedrete allora riapparire l'icona originale ed il file funzionerà a meraviglia (le sue dimensioni devo essere: 110.592 bytes)
 
La prima parte è terminata, adesso possiamo crackare il programma...se avessi tempo vi farei trovare il seriale ma non posso, vado di fretta...
 
Per prima cosa premete il pulsante register ed inserite un nick ed un numero....mettete un bp su getdlgitemtexta (bpx getdlgitemtexta) e poi premete invio....appena entrati premte F11 e non fermatevi lì, steppate per 16 volte con F12 ed arriverete qui:
 
:0040174A                           push 00409038
:0040174F                           push 0040D1E0
:00401754                          Call lstrcatA
:0040175A                          push 00409328
:0040175F                          push 0040D1E0
:00401764                          Call lstrcatA
:0040176A                          call 004046A0
:0040176F A374CE4000 mov [40xxxx], eax <-----Perdonatemi le xxx ma non me lo ricordo quale era l'indirizzo
:00401774  EB01               jmp 00401777
 
dopo la chiamata a 4046A0 viene mosso nel buffer il valore riportato da eax (il solito leim 1 se è esatto e 0 se non lo è), a questo punto proviamo ad alterare il valore di eax e mettiamoci 1, subito dopo c'è un piccolo trick SMC che decide se saltare alla beggar off oppure no, eccolo:
:00401774 EB01       jmp 00401777
:00401777 B80AC07402  mov eax, 0274000A
:0040177B EB2C jmp 004017A9
 
ora ve lo spiego: quel jump vorrebbe saltare all'indirizzo 401777 che come vedete non è rappresentato ma ovviamente c'è :), il programma allora salta effettivamente a quell'indirizzo scindendo l'opcode B80AC07402 in:
B8
0AC0
7402
solo che B8 dal significato nullo viene saltato e 0AC0 e 7402 diventano:
:00401774 EB01    jmp 00401777
:00401776 B8        BYTE B8 <---Questo byte viene ignorato dal jump
:00401777 0AC0  or al, al <---Al = 0
:00401779 7402   je 0040177D <---Beggar Off
:0040177B EB2C jmp 004017A9
                             
noi non dobbiamo far altro che cambiare non quel byte ma l'sitruzione sopra, cioè, prendete "mov [40xxxx], eax" e cambiatelo in "mov eax, 1".....quindi aprite l'exe ed andate nel programma a cercare questi bytes: A374CE4000EB01, ce ne sono due nel programma e cambiateli in: B801000000EB01 (lo stesso identico trick lo ritrovate a 401F39, cambiatelo sennò il programma non si cracka)...Avremmo potuto cambiare direttamente i byte del trick ma non mi andava :).....e non rompete che il tute lo sto a fare io :)....uscite da sice e.....track...programm registrato..riavviatelo e riavrete (ovviamente) la scrittina registered....chiudete il tutto e mettete un break su RegOpenKeyExA...clickate sul programma e steppate cpn F5 finchè non vedrete apparire il loghetto conl'ape ancora senza scritte....appena arrivate a questo punto cancellate i bp, premete F11 ed arrivate qui:
:00404815 03EA add ebp, edx
:00404817 41 inc ecx
:00404818 4E dec esi
:00404819 75DA jne 004047F5
:0040481B 33C0 xor eax, eax
:0040481D 5F pop edi
:0040481E 85ED test ebp, ebp
:00404820 5E pop esi
:00404821 5D pop ebp
:00404822 0F94C0 setz al <---Azzera AL se il flag Z è attivato
 
dovete solo cambiare quel setz al in "mov al, 1 nop"..ecco l'opcode: B00190..sostituitelo al nel file ed il programma sarò finalmente crackato. ciauzzzzzzzzzzzzzz.........Ah, non dimenticatevi dopo il crack di clickare su register, inserire il vostro nick ed un qualunque numero più lungo di 16 cifre
 

                      Quequero

Note finali

Grazie tantissime a Neural_noise che mi ha insegnato molto sul manual unpacking, kill3xx e tutt quanti gli altri...scusate ma ho una fretta boia.......ciauzzzzzzzzzzzzz

Disclaimer

Qui inserirete con questo carattere il vostro piccolo disclaimer, non è obbligatorio però è meglio per voi se c'è. Dovete scrivere qualcosa di simile a: vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo documento è stato scritto per invogliare il consumatore a registrare legalmente i propri programmi, e non a fargli fare uso dei tantissimi file crack presenti in rete, infatti tale documento aiuta a comprendere lo sforzo immane che ogni singolo programmatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.
Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly.
Capitoooooooo????? Bhè credo di si ;)))) 

 
UIC's page of reverse engineering, scegli dove andare:

Home   Anonimato   Assembly    ContactMe  CrackMe   Links   
NewBies   News   Forum   Lezioni  
Tools   Tutorial 

UIC