
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.

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
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.
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 😉
Come faccio a contattarti in privato?
Ciao a tutti sono nuovo del forum, a differenza di voi non sono un esperto di informatica ma mi diletto nelle applicazioni tra motori e elettronica ( sono appassionato di simulatori auto costruiti) è per questo motivo che vorrei chiedere il vostro aiuto su come rendere un software utilizzabile senza licenza, nonostante la guida non ho le conoscenze e gli strumenti per farlo da solo. Premetto che ho cercato diverse volte di contattare l’autore del programma per informazioni dell’acquisto della licenza senza ricevere mai risposta. Dubito di poter nominare il programma in questione, ma se qualcuno di voi esperti può darmi una mano, anche in privato gliene sarei grato, ho bisogno assolutamente di quel programma per il mio progetto. Grazie
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 🙂
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?
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???
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! 😉
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.
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?!
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…. 🙂
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
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
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.
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.
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?
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
Fatto,
Grazie!
maury
http://it.emcelettronica.com/forum/lettura-micro-protetto-mc9s12xet256mag
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.
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
Sono nuovissimo del forum e non sono esperto analista come mi sembra siate voi, letto il contenuto degli articoli, ma scrivo perché ho un problema serio. Sono un dentista e al rientro dalle ferie, lunedì primo settembre ho avuto la sgradita sorpresa di essere stato visitato dai ladri che, oltre ad alcune stupidaggini hanno rubato due chiavi hardware. La prima del software ORISDENT prodotto dalla ORISLINE, programma gestionale archivio pazienti, di cui ho già ricomprato la nuova licenza; l’altro VIMPLANT, software per simulazione di interventi di implantologia, al cui data base, che è residente sul disco rigido, non posso più accedere proprio per mancanza della chiave hardware. Non posso ricomprare la licenza perché la ditta produttrice coreana non lo produce più, il concessionario italiano, di Bescia, è deceduto. Ho diversi casi in trattamento ai quali non riesco a proseguire la terapia. Non voglio violare la legge, sono software di cui ho sempre comprato le licenze, ma ho bisogno, urgente, di aggirare il blocco imposto dalla chiave hardware usb. In zona, Pescara, non conosco nessuno che mi possa aiutare, vi pregherei, se potete, di farlo voi. Grazie Lello
ma quindi si possono generare password di chiavi elettroniche su siti protetti? ma non è illegale?
Salve Antonio Farias, ho appena inoltrato la tua richiesta all’autore dell’articolo che saprà sicuramente fornirti una risposta esauriente.