TopStyle 1.05
Manual unpacking e cracking vario


26/05/2000

by "AndreaGeddon"

 

 

UIC's Home Page

Published by Quequero


Qualche mio eventuale commento sul tutorial :)))

Il prossimo tutorial lo scrivo tutto qui :P

Fai progressi di simpatia ogni giorno, mi dici il trucco? :)

 
UIC's form
Home page:  www.andreageddon.8m.com
E-mail: [email protected]
IRC chan:   #crack-it  /  #crack-it2
UIC's form

Difficolt�

( )NewBies (x)Intermedio (x)Avanzato ( )Master

 

Ci occuperemo di tutti gli aspetti di cracking di questo prog:

- Manual unpacking

- Ricostruzione dell'eseguibile

- Eliminazione dei controlli anti-sice

- Eliminazione nag varie

- Eliminazione crc


TopStyle 1.05
Manual unpacking e cracking vario
Written by AndreaGeddon

Introduzione

Un editor html, almeno credo...

Tools usati

-  SoftIce

-  ADump

-  ProcDump

-  Il solito editor hexa

-  FrogSice

-  L'offset converter di Iczelion (opzionale)

URL o FTP del programma

www.bradsoft.com

Notizie sul programma 

E' packato, limite di utilizzo a 30 esecuzioni, poi ogni volta ti devi sorbire all'avvio una nag di 10 secondi pi� una nag in uscita. In pi� detecta il sice e le modifiche al codice... proprio una carogna di prog. Ma non ci spaventa.

Essay

Okkey. Per prima cosa se tenete caricato il softice e lanciate il programma, vi mander� una messagebox "l'operazione eccede i 32 bit". Che cariiiiini! Pensano che siamo dei totali allocchi. Vabb�, tentiamo di eliminare questo ostacolo. OOooppps... dopo un p� di osservazione trovate che il prog � packato, infatti non c'� corrispondenza tra gli opcode in sice e quelli sul file fisico. Quindi prima di iniziare, dobbiamo unpackarlo.

PARTE PRIMA: MANUAL UNPACKING

Praticamente faremo la stessa cosa del tutorial di Quequero su api32, ma con qualche accorgimento in pi�. Lanciate ADump, e da adesso in poi tenetelo SEMPRE aperto, non chiudetelo mai. Nella consolle di ADump battete r, vi dar� informazioni generali sullo spazio mappato. A noi ce ne interessano due in particolare:

START OFFS:    0x82C68000

MAPFSIZE:                 0xF4240   (1000000)

vuol dire che � stata mappata in memoria una porzione da 1 milione di byte a partire dall'offset 82C68000. Magari annotatevi lo start offs su carta per comodit�. Adesso dovremmo iniziare un p� a steppare. Lanciate il frogsice, e adesso il programma non vi scoccia pi�. Per� dobbiamo steppare dall'inizio del file. e quindi dobbiamo trovare l'entry point. Per quello ci serve il procdump. Lanciatelo, andate nel PE Editor, caricate il topstyle.exe, e ci sr� in un edit box il nostro entry RVA, che � 2B8001. Adesso carichiamo l'offset calculator di iczelion, caricate il topsytle.exe e inserite ell'rva il valore 2B8001. Vi dar� la corrispondenza hexa dell'offset fisico nell'eseguibile, cio� C2201. Adesso prendiamo il nostro hexeditor, andiamo all'offset C2201 e al posto del byte 60 ci mettiamo un bel CC, che � l'opcode di int 3. Adesso nel softice baster� settare un BPINT 3, e quando avviate il programma popperete sempre sull'entry point. Una volta poppati ricordatevi SEMPRE di rimettere a posto il byte, cio� dovete scrivere

e eip 60

e al posto di CC rimetterete 60, il valore originario. Adesso potete settare un bpx su questa riga, cos� potete rimettere a posto il CC nel file fisico. Adesso possiamo steppare in santa pace. Iniziate dall'entrypoint. Innanzitutto ci troviamo nella sezione TS151. Dobbiamo arrivare alla sezione .CODE. Steppate, dovreste arrivare ad un RET che vi rimanda giusto giusto alla sezione CODE. Adesso non steppate pi�. Usiamo il comando MAP32 del sice

MAP32 topstyle

e otteremo la lista delle sezioni mappate dal processo del topstyle. Eccola:

CODE         1         017F:00401000         001C3000

DATA          2        017F:005C4000        0000F000

BSS             3         017F:005D3000        00003000

idata             4        017F:005D6000         00003000

tls                 5        017F:005D9000         00001000

rdata            6         017F:005DA000        00001000

reloc            7         017F:005DB000        0001B6F4

rsrc              8         017F:005DB000        000C1000

TS151         9         017F:006B8000         00004000

rsrc              A        017F:006BC000        00001000

 

adesso dobbiamo calcolarci la lunghezza del file unpackato. Per farlo dobbiamo usare la formula che ci insegna Que:

RVA ultima sezione - image base + PE size

che per noi sarebbe:

006BC000 - 00400000 + 1000  =   2BD000

Quindi il nostro file sar� lungo 2BD000h = 2.871.296 byte. Bella compressione, considerando che l'eseguibile originale � di 789k. Adesso dobbiamo calcolarci il numero di pagine. Ogni pagina � lunga 65535 byte, cio� FFFh. Quindi per avere il numero delle pagine dobbiamo calcolare:

lunghezza file unpackato / FFFh

che diventa:

2BD000 / FFF = 2BD

sono 2BDh = 701 pagine. Adesso dobbiamo caricare le pagine in memoria, visto che non ci sono tutte. Per sapere quali sono le pagine mancanti useremo il comando PAGE del sice:

page   00400000   L    2BD

e ci verr� sputata una lista di pagine. Allora, le pagine di questo tipo

00400000 NP  000A0000

vuol dire che NON sono presenti. Le pagine tipo

00500000   00234500  P    D   A

sono presenti, e non ci interessano. Quindi scorrete mano mano la lista delle pagine e segnatevi quelle non presenti. Dovrebbero essere le seguenti:

00400000

005D4000

005D5000

da 005DA000 a 005F6000

006BA000

006BB000

006BC000

adesso useremo il comando PAGEIN, che carica le pagine fisicamente in memoria. Quindi dovrete scrivere:

PAGEIN 00400000

PAGEIN 005D4000

e cos� via per tutte le pagine. Quando avrete finito, il file eseguibile sar� l� bello pronto per essere rubato. Adesso dobbiamo mappare l'eseguibile nell'area di controllo di ADump, cio� nella porzione da 1mb che comincia all'offset 82C68000. E qui sorge un dubbio. Ma se abbiamo visto che il file � lungo 2.8 mega, come lo facciamo a mappare in una porzione di 1mb?? Battete il seguente comando:

m  00400000 L 2BD000 82C68000

che serve appunto a trasferire il file nell'area di controllo di ADump. Vi dir� "page not present". Uhmm. Non possiamo riempire una bottiglia da un litro con 2.8 litri di acqua. Allora dovremo dumpare pezzo pezzo. La mappa di ADump � di 1 milione di byte = F4240. Adesso ci dumperemo il primo mega:

m  00400000 L F4240  82C68000

oki, nessun errore. Ora uscite dal sice, andate in ADump, e diciamogli di scrivere su disco tale dump:

w  c:\topstyle.1 F4240 82C68000

avremo: "written 1000000 bytes". Oki. Un pezzo � fatto. Ora rifate la stessa cosa per gli altri due pezzi. Risteppate dall'entry, rifate il PAGEIN delle pagine mancanti, solo che stavolta la mappatura sar� diversa:

m  004F4240 L F4240  82C68000

che abbiamo fatto? Invece di dumpare il file dall'inizio, abbiamo dumpato UN mega ma a partire dal SECONDO mega. Di nuovo, in ADump battete:

w  c:\topstyle.2  F4240   82C68000

e cos� abbiamo scritto su disco il secondo milione di bytes. Il file era di 2.871.296. byte, abbiamo rubato i primi due milioni, ci restano 871.296 byte, che in hexa sono D4B80. E lo starting point sar�:  00400000 + F4240 + F4240 = 005E8480. Ripartite dall'entry, arrivate alla CODE, PAGEIN di tutte le pagine mancanti, e mappiamole:

m  005E8480 L D4B80 82C68000

e poi in ADump salviamolo su disco:

w c:\topstyle.3 D4B80 82C68000

adesso su disco ci siamo salvati i file TOPSTYLE.1, TOPSTYLE.2 e TOPSTYLE.3. Adesso li dobbiamo ricucire per formare un unico eseguibile. Basta che caricate tutti e tre file con l'HexEditor, selezionate tutti i byte ti topstyle.2, li copiate e li incollate a partire dalla fine di topstyle.1, e cos� anche con topstyle.3. Adesso copiando e incollando ci siamo creati un unico file contenente tutto. Salviamo tale file come TopStyle.exe. Adesso ancora non funziona. Infatti dobbiamo riallineare il PE. Caricate il ProcDump (ora potete chiudere ADump...), andate nel PE Editor, e caricate il TopStyle.exe appena unpackato. Andate su Sections, e poi click col destro su ogni sezione per editarla. Dovete fare in modo che i valori combacino, nel seguente modo:

prima:

VSize:  000088B6              RVA: 00001000

PSize:  00008A00            Offset:  00000400

dopo la modifica:

VSize:  000088B6              RVA: 00001000

PSize:  000088B6            Offset:  00001000

fatelo per tutte le sezioni. Quando avete finito, prima di eseguire il file fatene una copia di backup, ve lo consiglio fortemente! Eseguite il file unpackato, ed ora in base alle prove che ho fatto avete buone probabilit� che il programma parta, ma � anche possibile che il programma non parta proprio. Comunque partir� solo la prima volta, poi non pi�. Tutta sta fatica e non funziona?!?!?!?! Calma. Levate il frogsice, e avviate il programma (da adesso in poi ci riferiremo SOLO a topstyle unpackato). Il prog vi d� lo stesso errore che vi dava al softice detection. Che significa? Vuol dire che il file funziona, anche se in realt� non parte. Ci deve essere un controllo che riconosce che l'abbiamo unpackato, e quindi non parte. La cosa da fare, ora, � di steppare e sradicare tutti gli ostacoli.

ps. a quanto sentito in ML il file � packato con aspack, se trovate l'unpacker tanto meglio, ma � roba da leim :-)

PARTE SECONDA: FACCIAMO PARTIRE L'ESEGUIBILE

Iniziate a steppare (all'inizio dall'entry point, poi settatevi mano a mano i break), vi consiglio di mettere un break all'inizio della sezione CODE perch� � da l� che ci interesser� il codice. Prima per� una cosa. Riavviate il pc. Vi apparir� all'avvio la consolle del DOS. Se eseguite di nuovo topstyle, noterete che l'eseguibile � stato cancellato! Bastardo! Il programma scopre se il file � unpackato, se lo � non si avvia pi� e mette in C:\Windows il file WCDTSDEL34.bat, che si esegue all'avvio del computer e cancella sia TOPSTYLE.exe, sia il BAT stesso. Risolviamo subito la faccenda: editate il bat, e lasciate solo la prima riga @ECHO OFF, cos� la procedura batch non far� un bel niente. Adesso settate il bat in Read-Only. Fatto. Se avete fatto la copia di backup, ricopiatevi il file TopStyle.exe cos� come era appena sfornato, e ora potete ricominciare. Allora, per far partire l'exe dobbiamo eliminare il controllo del Sice e il controllo del file unpackato. Iniziate di nuovo a steppare dall'entry point, arrivate alla CODE, e da adesso in poi sar� tutto uguale: steppate sopra ogni call, e se questa vi d� il messaggio di errore o vi termina il prog, allora bisogna trovare il modo di bypassarla. Levate il FrogSice: infatti elimineremo anche il controllo anti-sice. Inziamo lo stepping, arriviamo alla linea 005C32C2, dove c'� una call, che se viene eseguita ci manda la messagebox di softice detection. Bene, risaliamo un po pi� su nel codice, e alla riga 005C326D troviamo un bel jz, che guarda caso ci fa evitare la call fatale. Trasformiamolo in JUMP, e non il sice-check � storia. Ma continua a non partire. Adesso ricominciamo lo stepping cercando la call che ci termina il programma. La troviamo alla riga 005C32E3. Proprio la riga precedente c'� un JZ, trasformiamolo in JUMP ed adesso il programma partir�.

PARTE TERZA: BASTA CON LA NAG DI WELCOME

Adesso il programma parte, ma all'avvio vi mostra sempre la finestra di WELCOME! Basta! Sradichiamola. Ricominciamo lo stepping. Steppate, steppate, fino alla riga 005C33A4: qui c'� la call che se eseguita vi spara la nag. Come al solito, seguiamo i salmoni (paga Que!) e risaliamo il codice. Alla linea 005C337A troviamo un JZ che ci fa saltare oltre la call alla nag. Trasformiamolo in JUMP e non avremo pi� il messaggio di welcome.

PARTE QUARTA: IL COUNTDOWN NON LO VOGLIAMO

Se lo avete fatto partire pi� di trenta volte, all'avvio del programma vi apparir� una orrida finestra con un coundown che vi tiene fermi per 10 secondi. Ricominciamo lo stepping. Steppando dall'inizio della sezione code, arrivate alla linea 005C33DC, dove c� una call che ci fa eseguire programma e countdown. Entriamoci con F8 e steppando arriviamo alla linea 00452A5D, dove c'� di nuovo una call che se eseguita spara il countdown. Etriamoci e steppiamo. Noterete che viene caricato il form principale dell'applicazione. Continuate a steppare, e dopo 4 o 5 RET tornerete alla linea 005B1CBA. Da qui steppate ancora, e troverete subito una call alla linea 005B1CD0. Se entriamo in tale call, non possiamo modificare il codice per evitare la routine che genera la nag del countdown: infatti questa routine � usata ogni volta per la visualizzazione di dialog vari. Allora steppiamo oltre la call alla linea 005B1CD0, e di nuovo incapperemo in un paio di RET. Questi ci porteranno subito alla linea 005B1D1A,e qui i fermiamo un attimo. Cosa c'� un paio di righe sopra? Ecco:

005B1D11     cmp  ebx,  1E               compare qualcosa con 30

005B1D13      jl       005B1D20           salta se � di meno

005B1D15      call    xxxxxxxx              chiama la nag per il countdown

005B1D1A     dec    dword ptr xxxxxxxx

005B1D20      pop    ebx                     saremmo arrivati qui col salto

                       ret

noi siamo appena usciti dalla call, e ci ritroviamo a 005B1D1A. Poco prima c'� stato un CMP EBX 1E. 1Eh = 30d!  E' ovvio che � quello il jump che decide se abbiamo avviato il prog pi� di 30 volte, e guarda caso ci fa saltare oltre la call da cui siamo appena usciti! Adesso prendiamo quel JL e rendiamolo incondizionato (jump), cos� salteremo la call sempre. E il countdown � eliminato.

PARTE QUINTA: ORA TOCCA AL CRC

Se avete apportato le modifiche all'exe, vi dovrebbe apparire oltre alla nag in uscita, una messagebox che dice "Errore di ridondanza dei cicli". Grazie! Cos� sappiamo per certo che � un CRC check. Qui ho avuto alcune stranezze, perch� la messagebox si errato crc appariva a volte si, a volte no... boh... ad un certo punto si � messa ad apparire sempre, allora ho deciso di eliminarla. Settiamo il break su MessageBoxA. Uscite da USER e vi ritroverete alla riga 00452CE2 del processo di topstyle. Allora, contiunate a steppare fino a venire fuori da questa routine. Dovreste riapparire alla riga 005B6124. Se avete steppato parecchio in topstyle, queste righe non vi risulteranno nuove. Comunque, ancora non possiamo fare niente per evitare il CRC, quindi dobbiamo di nuovosteppare i prossimi ret, e tornare alla linea 005B6764. Qui si inizia a ragionare. Ci sono vari jump nelle vicinanze della call che esegue la messagebox del crc. Se provate a districarvi finirete in altre call che vi sparano sempre la messagebox. Lasciate questi jump, risdalite nel codice fino a trovare alla linea

005B671C      JZ       005B676B

che salta TUTTA la parte delle call a messagebox vari. Trasformiamolo in jump. Riavviamo... adesso ho eseguito il programma varie volte, fatto le pi� disparate prove, ma non appare pi� la messagebox di errato CRC.

NOTA: Ogni tanto appariva anche un'altra messagebox, col messaggio "Dati Non Validi". Eseguendo e rieseguendo il programma, non mi � apparsa pi� neanche questa... probabilmente era parente alla precedente messagebox del crc errato... boh... se la ritrovo far� un update.

PARTE SESTA: LA NAG IN USCITA

Occupiamoci di quella fastidiosa nag che appare all'uscita del programma. Vado a rieseguire... niente. Ho rieseguito parecchie volte il programma, ho fatto parecchie operazioni diverse, ho chiuso il programma in molti modi diversi, ma di quella nag che diceva "evaluation version" non c'� pi� neanche l'ombra. E' sparita completamente. Prima di modificare il controllo del CRC mi appariva... allora quella modifica mi ha eliminato tre problemi con un colpo solo!! Per� mi sembra un p� strano... fatto sta che adesso non c'� pi� la nag. Rimane solo la scritta EVALUATION sulla title bar, ma di quella non mi frega niente.

 

Sembra quindi che il nostro lavoro si sia concluso in anticipo. Beh, comunque l'aspetto pi� interessante di questo tutorial � il manual unpacking, tutto qui. Se per caso ritrovo quella stupida nag o qualche altro casino far� un update.

Ciauz

AndreaGeddon

UPDATE !!!!!!!!!!!!

Proprio quando mi stavo per decidere a uppare il tute negli ultimi controlli del programma ho trovato degli accessi casuali alla nag e al CRC error. Praticamente cambiando spesso i tre pulsanti quadrati a lato (site report, site links, edit), dopo un p� compare la nag, e a volte compare la messagebox di CRC error. Allora, breakando su messageboxa, quando beccate il crc, iniziate come sempre a steppare tutti i ret fino a tornare fuori dal codice. Uscendo ed uscendo dovreste arrivare alla riga 005B279A, che � la call incriminata. Ora da qui non si pu� fare niente. Entrate quindi nella call, adesso non ricordo le righe perch� non le ho aotate, ma dovreste arrivare alla linea

005B2226  JGE  005B2232

se questo salto non viene eseguito, state a posto. Se lo eseguite, steppate nel codice e finirete in queste altre righe

005B224D   CALL       --> errore crc e chiusura programma

005B2526    CALL       ---> nag evaluation

se noppate quel JGE incapperete in

005B222D   JUMP     005B26FF

e salterete tutti i controlli. Adesso dovremmo aver finito.

AndreaGeddon

 

                                                                                         Note finali

Un saluto a tutta la ML, a ppinker che mi ha dato delle buone dritte per il Krypton2 :-) Ciauuuz

Disclaimer

Queste informazioni sono solo a scopo puramente didattico.

UIC's page of reverse engineering, scegli dove andare:
Home   Anonimato   Assembly    CrackMe   ContactMe   Forum   Iscrizione
Lezioni    Links   Linux   NewBies   News   Playstation
Tools   Tutorial   Search   UIC Faq
UIC