Home
Accesso / Registrazione
 di 

Reverse engineering: come creare una patch per un programma

Patch - Reverse Engineering

Reverse Engineering, significa semplicemente analizzare un dispositivo o un software che non hai costruito, per apprendere come è stato fatto ai fini di riprodurlo o modificarlo.

Per chi non sa di cosa stiamo parlando, inizio solo con il dire che per me è un'arte che consiste nel esaminare molto attentamente un programma al fine di riprodurlo o ad esempio nel caso di programmi protetti, eliminare o scoprire come viene generato un seriale. Ovviamente il reverse engineering per quanto messo in discussione, in Europa non è considerato illegale, diventa illegale quando ad esempio noi creiamo una crack oppure troviamo il seriale e lo mettiamo a disposizione di tutti in internet, quindi fate molta attenzione a quello che fate.
Bene quello che voglio mostrarvi è un semplicissimo modo per creare una patch, il programma che andiamo a reversare è un programma di addestramento, quindi nulla di commerciale.

Quello che ci servirà sarà:
-OllyDbg: http://www.ollydbg.de/
-Hex Workshop Hex Editor: http://www.hexworkshop.com/
-CFF Explorer: http://www.ntcore.com/exsuite.php
-Un compilatore C, io uso DevC++: http://www.bloodshed.net/devcpp.html
-CM01: http://quequero.org/Crackmes

Benissimo incominciamo con la fase di patching:
Iniziamo a fare “conoscenza” con il nostro programma da reversare, una volta che lo abbiamo scaricato apriamolo e vediamo come funziona, vediamo subito che andando su help c'è il bottone per registrare il programma:

Se proviamo a inserire qualcosa a caso ci restituirà errore:

Benissimo possiamo chiudere il nostro programma, aprire OllyDbg ed andare su File-Open e selezioniamo il nostro programma. Come tutti i programmi, anch’esso usa delle API(Application programming interface),ossia un insieme di procedure e funzioni che semplificano notevolmente la vita ai programmatori nella costruzione di un programma.

Quello che noi dobbiamo andare ad analizzare è in particolare l’API: GetDlgItemText, questa funzione si occupa di prelevare i caratteri scritti nel box Name e Serial. Ne esisto di due tipi: GetDlgItemTextA e GetDlgItemTextW .

Ora quello che dobbiamo fare è inserire due interruzioni detti breakpoint a queste funzioni e per farlo selezioniamo in alto Plugin-Command line e scriviamo bp GetDlgItemTextA e premiamo invio e infine bp GetDlgItemTextW e di nuovo invio. Ora avviamo il debug con F9 e come possiamo vedere OllyDbg, in futuro abbrevio con olly, ci apre il programma e noi inseriamo nuovamente i dati nella registrazione e clicchiamo su Ok.

Come dati di registrazione ho inserito:
Name: qwer
Serial: 1234

Olly ci ha fermato qui:
75F53D74 > 8BFF MOV EDI,EDI

Da come possiamo vedere in alto, vicino alla scritta CPU, ci troviamo nel modulo user32.dll, noi dobbiamo tornare nel codice del nostro programma, premendo Alt+F9 (Excute till user code) svariate volte arriviamo qui:

Dove quelle due call saranno le funzioni che servono a generare il seriale, per ora di questo non ce ne preoccupiamo.
Una volta arrivati a questo punto eseguiamo un istruzione alla volta con F8 ed andando avanti così incontriamo la seguente istruzione:
00401243 . 74 07 JE SHORT CRACKME.0040124C
Se noi continuiamo ad andare ulteriormente avanti, ci comparirà il messaggio di errore del seriale, quindi il salto da invertire è proprio quello.
Bene a questo punto proviamo a vedere se funziona, riavviamo il tutto premendo Ctrl+F2 e una volta fatto ritorniamo al salto senza steppare dentro di esso. Basta steppare fino all’istruzione che lo precede. Una volta fatto, ci posizioniamo con il mouse sopra il salto e modifichiamo il JE(Jump short if equal (ZF=1)) in JNZ (Jump short if not zero (ZF=0)), facendo doppio clic sul salto, una volta modificato, steppiamo all’intermo e ci comparirà:

Benissimo abbiamo registrato il programma, a questo punto passiamo alla patch vera e propria, apriamo con CFF Explorer il nostro programma.

Ritorniamo ad olly, notiamo l’indirizzo di prima da modificare:
Istruzione di prima: 00401243 74 07 JE SHORT CRACKME.0040124C
Istruzione modificata: 00401243 75 07 JNZ SHORT CRACKME.0040124C

In CFF Explorer clicchiamo su Address converter e inseriamo l’indirizzo 00401243:

A noi interessa solo File Offset, bene ora possiamo chiudere tutto, segnandoci prima il File Offset, e apriamo Hex Workshop, caricando il nostro crackme.
Subito dopo premiamo Ctrl+G e inseriamo 843 come nella figura sottostante:

Per ultima cosa modifichiamo il 74 in 75, salviamo il tutto e siamo a posto,
d’ora in poi il nostro programma accetterà qualsiasi seriale.

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di divivoma

bellissimo..

Non avevo mai visto come si "patcha" un software praticamente in diretta...voglio assolutamente fare una prova..ovviamente immagino che all'inizo sia meglio pathare programmini stupidi prima di passare a qualcosa di più complesso...tipo giochi manageriali di calcio o di conquiste del mondo :)

Ma nel momento in cui ci si accinge ad effettuare operazioni più elaborate..basta ancora l'utilizzo di Olly oppure si necessita di altro stefano?
Penso proprio di si... anche perchè con Fabrizio l'altra volta si parlava di cose simili..e m accennava a sistemi di protezione ripetuti un centinaio di volte...non so immagino ad esempio dei salti come questi fatti un 100 di volte in posti diversi della memoria..ma che alla fine portano al fatidico p.to cruciale da bypassare..già mi sembra proprio questa l'operazione che hai fatto... bypass indolore :)

ciao

ritratto di vitunskas.elvinas

Elvinas

Salve a tutti,per fare la prova mi devo scarricare CrackMe v1.0, ma on e possibile perchè mi spunta che la paggina non è disponibile, che devo fare ? GRAZIE.

ritratto di lucagiuliodori

Quando si parla di Reverse

Quando si parla di Reverse Engineering a molti viene i capelli bianchi ma come dici tu, questo non è un reato ma un "arte" con cui riuscire a capire in che modo funziona un determinato programma (o circuito aggiungerei io). Solo nel momento in cui viene copiato e usato a scopi commerciali allora si può parlare di reato ma se questo non viene fatto io parlerei di "open source" più che di reato.

Procedura interessante quella che ci hai mostrato, neanche io avevo mai visto "patchare" in diretta un programma. Interessante perchè si va proprio a modificare il programma assembler che verrà poi eseguito dal processore.

Sicuramente le tecniche di protezione dei software più sofisticati (o costosi) sono molto più difficili da raggirare ma questo potrebbe essere un buon punto di partenza per capire come funzionano le "patch" dei software.

ritratto di stefano88

Son molto contento che vi sia

Son molto contento che vi sia piaciuto, se vi è piaciuto questo vedrete quello di sabato ;) bè comunque si ovviamente si parte sempre dalle cose più semplice, come queste, per poi passare a programmi criptati e/o compressi con qualche strano algoritmo, molto divertiti da comprendere. Diciamo che per operazioni elaborate, dipende quali sempre, Olly diciamo che è in grado di fare tutto, ma se ti trovi a lavorare con un programma a livello kernel li ti serve un debuggur a Ring0 come può esserlo Softice della Numega, comunque Olly si presta bene per reversare le applicazioni anche più complesse. Poi oltre a Olly ti servono dei tools che ti dicono con che linguaggio è stato scritto, il tipo di protezione e se il file è stato criptato oppure no e quale tipo di algoritmo implementa, tanto per citarne alcuni, io uso PEiD e RDG Packer Detector questi due programmi ti dicono le cose dette prima, poi sta a te andarla ad eliminarle eventuali protezioni, questi tools diciamo che sono degli aiuti molto precisi, ovviamente ai reverser più esperti gli basta aprire il programma in Olly e capiscono subito il file come è protetto. Grazie a dio nel reversing non esiste una sola strada per le protezioni, se no non ci sarebbe gusto ;) se non ricordo male ero io a lamentarmi dei programmatori che non hanno più fantasia e che ripetono un centinaio di volte le stesse protezioni ;)
Passando il invece al mio articolo, io ho patchato il programma invertendo il salto, quale altra cosa si poteva fare al posto di invertire il salto? Ci sono due modi una più raffinata e l’altra più grezza attendo risposte ;)

ritratto di divivoma

ah si può essere scusa.... o

ah si può essere scusa.... o forse siete entrambi sia tu che Fabrizio :)
ad ogni modo..vedo che siamo un bel gruppetto di appassionati in queste cose...intanto aspettiamo di leggere anche il tuo articolo di sabato con molta curiosità!

mmm pensandoci ..al posto del salto cosa si poteva fare...? Ci metti alla prova eh ??bravo mi piace sta cosa..na sorta di mini quiz..non si fa altro che imparare meglio ragionando su cose pratiche, si apprende 3 o 4 volte rispetto ad altri metodi :)

Cmq..io penso che forse si potrebbe cancellare proprio l'operazione di salto condizionato..senza fargli fare proprio il confronto e mettere magari un'etichetta con un goto diretto o branch incondizionato che dir si voglia...si può fare no?
mi sembra grezza questa.. ma efficacie :)

ritratto di Emanuele

La prima che mi viene in mente

La prima che mi viene in mente:

fare un XOR con la pass che vogliamo prima del salto e poi saltare in base a Z

In questo modo NON vano bene tutte le pass (e username o seriale) ma SOLO quella impostata da noi :)

Era quella raffinata o quella grezza?

ritratto di Fabrizio87

io pensavo che semplicemente

io pensavo che semplicemente modificando i ardenti del confronto rendendoli in modo che siano sempre vero tipo 1 = 1, ma secondo me in modo più pulito e di non toccare per niente il codice e creare KeyGen o un programma che di estrarre La password dal exe.
Così da non sporcare il codice.
e evitare tutte quelle sicurezze che si fanno un confronto dell'integrità del programma prima di eseguirlo è se per caso venisse modificato l'eseguibile il programma si spegne da solo.

Ma io avrei fatto diverso non avrei modificato direttamente eseguibile con CFF Ma avrei usato il programma "Code Fusion" così che mi generava una Pache più piccolo e più facile da trasportare.

Per di più per trovare il nome della finestra più veloce corrispondente nel codice è possibile usare il programma ShoWin

ma ormai è tanti anni che non faccio più queste cose

ritratto di Fabrizio87

Ho fatto alcune

Ho fatto alcune imprecisioni,
gli anni sono passati e non ho più rimesso mani da diverso tempo a questa arte.

CFF Explorer
Questo programma serve a calcolare l'offset,
È dovuta alla struttura di memorizzazione dove viene impiegato la memoria virtuale e non l'avere memoria Dell'indirizzo fisico,
che serve dopo per modificare l'istruzione nel exe

ritratto di stefano88

Emanuele è andato oltre alla

Emanuele è andato oltre alla semplicità degli altri due modi che intendevo io, però non ho capito cosa vuol dire in base a Z.
Comunque sia la modalità grezza ;) era quella di noppare il salto, ossia cancellarlo, basta inserire la scritta nop che significa No Operation, o modificare l’opcode scrivendo 90, oppure la modalità raffinata era quella di lasciare il salto così come è ma cambiare l’indirizzo del salto in modo da andare direttamente al message box registrato con successo.
Mentre poi c’è anche un’altro metodo carino, leggermente più difficile che prevedere l’utilizzo di una xor, ma non so cosa intenda Emanuele, quindi aspetto a dire.
Sei per caso andato a curiosare all'interno delle due call???

ritratto di lucagiuliodori

Chiedo scusa ad Emanuele se

Chiedo scusa ad Emanuele se gli "rubo" la risposta ma da programmatore di PIC mi sento di rispondere :)

Emanuele intendeva fare un confronto fra la password e/o username che inseriamo noi e confrontarla con una statica che fissiamo noi sul codice, infatti se fai l'operazione di XOR tra due "word" (word inteso come parola di bit) diverse il risultato sarà diverso da "0", mentre se le due "word" sono uguali il risultato sarà sempre "0" (1 XOR 1 = 0; 0 XOR 0 = 0 e quindi vale per ogni bit). A tal proposito la "Z" è il flag che nei "PIC" (ma anche in altri micorcontrollori) viene settato a "1" se il risultato di determinate operazioni (come per esempio la XOR) da risultato "0". Quindi quello che diceva Emanuele è di controllare il bit "Z" per vedere se la password e/o username inseriti sono uguali o meno a quelli statici presente nel codice (Z=1 password e/o username corretti; Z=0 password e/o username NON corretti).

Giusto Emanuele?!

ritratto di Emanuele

Grazie Luca!

Esatto,
grazie Luca!

Deformazione microchippiana......

Inpostare il seriale che vogliamo DIRETTAMENTE nel programma credo sia abbastanza elegante no?

Anche se forse un bel NOP è più immediato.... :-)

ritratto di DeST

Ciao, volevo indicare a

Ciao,
volevo indicare a chiunque voglia sperimentare questo Reverse Engineering che per modificare il programma in questo caso basta usare la funzione Hex Editor di CFF Explorer e non è per forza necessario Workshop, per farlo vi basta dopo aver individuato il File Offset (843) in cff explorer in hex editor con il tasto destro "go to" inserite 843 cliccate sul 4 di 74 e poi con un clic sul 5 lo modificate, salvate il tutto! ;)

ritratto di neo51

reverse engineering

Non avevo mai sentito parlare di reverse engineering, ma dopo aver letto questo articolo ho capito di cosa si tratta.
A mio parare è una vera e propria arte, è già complessa la realizzazione di un semplice programma con seriale, appunto perchè si cerca di escogitare metodi per evitare che venga bypassata la protezione, ma è alquanto più complessa e anche difficile la realizzazione di un modello per comprendere il funzionamento di un software. L'esempio da te esposto è molto semplice, ma mette già in chiaro gli aspetti di questa disciplina in modo che chiunque voglia provare a praticarla sappia già da dove iniziare.
La parte più dolorosa è però quella legale, a volte migliaia di ingegneri lavorano mesi e mesi alla realizzazione di un gioco per PC ad esempio, che poi verrà protetto da un seriale, e magari un solo individuo dopo qualche mese riuscirà a trovare un punto debole all'interno del codice, così da vanificare il lavoro di quelle persone e diffondere la pirateria informatica.
Sotto questo punto di vista io sono completamente in disaccordo.

ritratto di stefano88

Per lucagiuliodori ed

Per lucagiuliodori ed emanuale:
Si è vero non avevo preso in considerazione i flag dei micro, è per questo che non capivo cosa volesse dire in base a Z, scusate ;)
Per quanto riguarda quello che avete detto, diciamo che si è no è elegante, nel senso che è un processo molto laborioso e complesso quello che dice Emanuele e dovresti comunque sia sempre sapere l’ algoritmo usato, il motivo è semplice, se il programma è serio le password all’interno vengono giustamente offuscate e/o nascoste, durante l’esecuzione, non le trovi scritte in qualche registro. Nel crackme che ho proposto ad esempio inserisci non so come
Name: lucagiuliodori
Serial: emanuale
Bene ora ti esegui tutto il programmino fino a quando non arrivi alla fine dove vengono comparati i due registri con un test o cmp (non mi ricordo) , in quei due registri ci sono il seriale tuo e il seriale vero, potresti ad esempio scrivere un programma che in tempo reale scrive su un determinato registro lo stesso valore dell’altro, capisci che come procedimento è molto lungo ed è meglio optare per la via breve (NOP o modica del salto) oppure calcolare e trovare l’algoritmo che genera il seriale, un’ ultimo appunto, se hai notato in Olly puoi modificare durante l’esecuzione del programma il famoso flag Z dei Jump, quando invece vai a fare la patch vera e propria con Hex Workshop, non esiste la possibilità di andare a scrivere sul flag 0 o 1.
Per DeST:
Si è giusto quello che dici, ho voluto usare Workshop solo per fare vedere un altro programma in più.

Per neo51:
Sono contento che ti sia piaciuto, comunque riguardo la parte di illegalità o legalità che sia, il reversing non illegale se lo fai per tè, diventa illegale quando tu vai a mettere serial number, crack, chiavi per decriptare, codici sorgenti sprotetti e quant’ altro online.

ritratto di telegiangi61

Non vorrei sembrare troppo vecchio

ma alla fine degli anni '80 (anzi, proprio nell'88) ricordo di aver passato intere notti a fare reverse engineering di programmi per lo ZX Spectrum 48K caricati da cassetta stereo4!

Allora le tecniche erano quelle della forza bruta, con solo un assembler/disassembler che ti faceva vedere passo passo il caricamento dei moduli del programma ed in genere l'unica cosa che si faceva per sbloccarli ( a parte qualche programma che chiedeva dei seriali, il problema principale era di aggirare i sistemi anti copiatura) era mettere una bella serie di NOP da far digerire al mitico processore ZX-80A a 3.5 Mhz.

Condivido l'idea che il Reverse Engineering e' un'arte, il cui scopo (quello onesto) e' capire come e' stato fatto qualcosa, o meglio, come il programmatore ha concepito quel programma.

Da quelle esperienze ho tratto molte tecniche di programmazione che misi successivamente a frutto nel campo lavorativo, imparando che niente o quasi e' impossibile, devi solo aver tempo, concentrazione e pazienza per capire cosa fare.

Una cosa che ricordo con piacere e' che spesso all'interno del codice assembler dei videogiochi ci trovavi intere lettere o pensieri dedicati alle proprie ragazze, lettere d'amore, di odio etc, tutto in Ascii da leggere mano mano con il disassemblatore.

Non so se anche a Stefano88 e' mai capitato durante le sue immersioni nei programmi oggetto del suo reverse engineering.

ritratto di slovati

problema con il crack

Ottimo argomento, il reverse engineering. Ricordo che tanti anni fa ebbi un problema con il compilatore PLM della Intel per il micro 80186 (oggi penso che quasi più nessuno si ricordi del PLM, ma io ho avuto la "fortuna" di usarlo anche sull'8051, sigh). Bene, il problema era che il compilatore assemblava male un particolare tipo di routine di risposta all'interrupt, che si poteva scrivere direttamente in PLM. Il problema, se non ricordo male, era su un mancato bilanciamento tra PUSH e POP, per cui dopo un pò la memoria si corrompeva. Probabilmente Intel aveva già fissato questo problema, ma allora non c'era Internet, e le informazioni non giravano con la velocità di oggi. Individuato il problema, decidemmo che la soluzione più semplice era "patchare" direttamente il .HEX prodotto dalla linea di compilazione. Brutale come metodo, però funzionava. Quindi un pò di reverse l'ho fatto anche io.
L'articolo è molto interessante, però secondo me c'è un problema con il programmino usato per mettere alla prova i "neo-cracker", cioè crackme. Se infatti si inserisce, come suggerito dall'autore, "qwer" e "1234" tutto funziona come descritto. Se invece si inserisce "1" e poi ancora "1", anche con la patch applicata, il programmino si comporta diversamente: viene prima mostrata la dialog di registrazione non avvenuta, poi, chiusa questa, compare la dialog corretta di crack eseguito con successo. E' un baco?

ritratto di Sem

Informazione!

Salve a tutti!

vorrei sapere se la mia intuizione e esatta oppure ho sbagliato a cercare ???

io so esattamente quale file dipende dalla registrazione del seriale di questo software e ntdll.

quello che non riesco a capire su quale PUSCH dovrei modificare ???

le uniche cose che ho notato di diverso sono le scritte al lato destro sono quelle che ti indicano dove modificare ???

Infatti mi restituisce= PUSCH ntdll 7755F6AC ASCII"FALSE"
e laltro e = PUSCH ntdll 775ECACC ASCII "ValidateforRelease"

se non vi e disturbo vi allego la mia immagine di Olly
Link: http://img812.imageshack.us/img812/2434/testch.png

Software tester:Ashampoo WinOptimizer 8

Grazie per chi mi rispondera con una informazione dettagliata x dbg un progamma.

ritratto di MauryMi70

Micro motorola mc9s12xet256mag

Ciao a tutti, non so se sono nel forum giusto.. Avrei un problema da risolvere! Ho la necessità di leggere una micro Motorola mc9s12xet256mag. è protetto da password però so che ci sono delle aziende in grado di sezionare una parte del micro per leggerlo. Qualche d'uno conosce una di queste aziende? 
Un saluto e grazie.

Maury

ritratto di Emanuele

Leggere firmware da microcontrollore protetto

Salve MauryMi70,
ti suggerisco di aprire un argomento nuovo nel Forum
http://it.emcelettronica.com/forum

In modo che la discussione (interessante) possa svilupparsi senza finire OT

ritratto di Turmax

MC9S12XET256MAG

Fatto,
Grazie!

maury

ritratto di diffi

reverse e crypt

Ciao,
volevo capire una cosa: con il reverse engineering c'è possibilita di capire che formula di criptazione usa un campo di un file Access?
Mi spiego, io ho questo file con campi criptati e non cripati (sono migliaia di records).
Conosco un bel po di corrispondenze tra le parole criptate e le parole corrispondenti non criptate, solo che non riesco a tirar fuori l'algoritmo con cui vengono criptate, e quindi non riesco a "tradurre" quelle che non conosco...

Sono un po' criptico ? :)

Vabe se qualcuno è interessato ad aiutarmi, mi faccia sapere che gli mando il file..

ritratto di Alessandrobeat

richiesta info

Ciao ,
ho seguito la tua interessantissima guida con molta attenzione, pero' mi sono fermato quasi subito perchè nel programma scaricato olly non ho trovato la funzione Plugin-Command line. Mi sono perso qualcosa, dove sbaglio?
Grazie mille per la tua guida sei un grande!
ciao

ritratto di giovannifurby

salve, bella guida :D io ho

salve, bella guida :D io ho un pò di giochi vecchi, che richiedono il seriale, ad esempio per giocare online, però è richiesto solo il cd key, e non il nome, come faccio? vorrei anche capire come si procede in questo caso, non voglio la pappa pronta :D ancora complimenti :D

ritratto di Ciro99

Azzerare il tempo

Ciao,
non ho trovato argomenti di riferimento nel forum, per cui mi accodo a questa discussione nella speranza che qualcuno mi risponda.
Ho un programma che ho la possibilità di usare solo un tot numero di volte, dopo di che scade il tempo di utilizzo.
Come si può fare ad azzerare il tempo?

grazie

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 19 utenti e 85 visitatori collegati.

Ultimi Commenti