Best viewed with old m$-do$ EditoR... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Tutto cio' che viene qui descritto viene pubblicato solo per fini * * didattici, il testo si rivolge quindi ai programmatori che intendono * * proteggere in modo piu' sicuro i loro programmi. Io NON mi assumo quindi * * alcuna responsabilita' per un uso illegale delle conoscenze qui acquisite * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Ciao a tutti :) in questo piccolo tutorial cerchero' di spiegarvi come e' possibile evitare la protezione di un eseguibile "criptato"... (altri dicono "compresso" oppure "packato" ... vabbe'... io intendo dire la stessa cosa :) Il programma di cui parlero' e' il Winamp 2.03 che potete trovare facilmente sia sui CD allegati a riviste informatiche o che potete scaricare da: http://www.winamp.com Vi serviranno anche alcuni tools per poter attuare questo lavoro di "reverse engineering"... allora: 1) Softice x windoz... 2) Window disassembler 32 bit (puo' anche non essere necessario...) 3) ProcDump della UCF (ah... un saluto a +xOANON :) 4) Hiew (oppure il vostro hex editor preferito...) 5) Infine un cervello in buone condizioni... ;) E magari anche un po' di musica :) io sto ascoltando: Something in the World Today - Rancid Quella che non sei - Ligabue L'uomo tigre - Gli amici di Roland Leggero - Ligabue Another Brick in the Wall - Pink Floid Urlando contro il Cielo - Ligabue Jeeg Robot D'acciaio - Gli amici di Roland Parola di Roland - Gli amici di Roland Goldrake - Gli amici di Roland Anarchy in the UK - Sex Pistol Q-letto - Ratti delle Sabine Vabbe'... basta sparar cazzate.. cominciamo a lavorare... :) Pigliate il Wdasm e ditegli di disassemblare il file "Winamp.exe"... vedrete che dopo alcuni secondi il Wdasm si blocca... fate CTRL+ALT+DEL e killate il Task... Cosa e' successo ??? Allora... praticamente il Wdasm ha cercato di fare il suo lavoro... ma ha beccato un .exe criptato/packato che l'ha mandato nella merda... Sigh... :( e adesso ??? Beh... spendiamo un paio di parole sugli eseguibili criptati... Spesso i programmatori dopo aver creato il loro bel gioiellino decidono di proteggerlo da eventuali "intrusioni" oppure di comprimerlo in modo tale da ridurne le dimensioni... Per far cio' proteggono il programma con un determinato criptatore e quindi inseriscono nelle prime istruzioni (o in Dll separate) una procedura di decriptazione che ricrea in memoria il file oggetto originario, in modo tale da poterlo eseguire normalmente... Risulta quindi inutile il disassemblatore dato che ci troviamo di fronte ad un programma che quando NON e' in run-time risulta incomprensibile... Il problema puo' cominciare a essere superato con l'utilizzo dei debuggers... infatti questi ultimi operano direttamente sull'immagine in memoria dell'.exe Bene... riavviate Win mettendo in memoria il Sice e caricate il Winamp... Clikkate sull'iconcina in basso a destra... vi apparira' una form con cinque pagine... scegliete la terza (quella con scritto "Shareware") ed entrateci premete su "Enter registration info"... Inserite due dati a caso... Io metto come nome "Along3x" e come serial number "80980". Noterete che il bottone "OK" risulta disabled... Cio' significa che quando c'e' l'Evento OnChange dell'Editbox viene subito controllata la corrispondenza tra serial e nome e nel caso il SN e' corretto viene attivato il pulsante OK in modo tale da completare la registrazione... Quindi ora scrivete il serial number senza l'ultima cifra (cioe' "8098") ed entrate nel Softice premendo CTRL+D. Ora dovete settare un breakpoint all'esecuzione della lettura delle stringhe inserite mediante la chiamata alle DLL di Windows... n.b. per far cio' e' necessario che nel file winice.dat abbiate attivato: EXP=c:\windows\system\kernel32.dll EXP=c:\windows\system\user32.dll Le funzioni che leggono le stringhe sono normalmente: GetWindowText (a 16 bit) GetWindowTexta GetWindowTextw (mi pare che questa sia per NT ?) GetDlgItemText (a 16 bit) GetDlgItemTexta GetDlgItemTextw (mi pare che questa sia per NT ?) In questo caso quella utilizzata e' la quinta cioe' GetDlgItemTexta (per scoprirlo basta provarle tutte... semplice no??? ih ih :) A al massimo provate solo Getwindowtexta o GetDlgItemTexta... solitamente serve una di queste due :) Settate quindi il breakpoint impostando nel Sice: "BPX GETDLGITEMTEXTA" Premete F5 per tornare a windoz... andate nell'editbox e inserite dopo "8098" lo "0" finale ! Il sice "poppera'" in primo piano indicandovi che il bpx e' stato eseguito :) Nella finestra del codice noterete che vi trovate all'inizio della funzione GetDlgItemTextA... Premete subito F11 per poter tornare nella routine principale del Winamp dove vedrete queste istruzioni: (F11 serve per uscire ad esempio da una funzione di una Dll richiamata da una Call) USER32.GetDlgItemTextA :0041C7EC FF15D4864400 Call dword ptr [004486D4] * Lettura del nome :0041C7F2 53 push ebx :0041C7F3 53 push ebx :0041C7F4 688C040000 push 0000048C :0041C7F9 FF7508 push [ebp+08] USER32.GetDlgItemInt :0041C7FC FF1560874400 Call dword ptr [00448760] * Lettura del SN :0041C802 8BF0 mov esi, eax * SN salvato in Esi :0041C804 8D4580 lea eax, dword ptr [ebp-80] :0041C807 50 push eax * Passaggio del nome come parametro :0041C808 E87A650000 call 004*2D87 * Generazione SN corretto :0041C80D 83C404 add esp, 00000004 :0041C810 3BC6 cmp eax, esi * Confronto tra i due SN :0041C812 7509 jne 0041C81D * Jump se il SN e' errato :( :0041C814 385D80 cmp byte ptr [ebp-80], bl ecc. ecc... Praticamente le due istruzioni fondamentali sono la Call a 004*2D87 e il Cmp eax,esi (attenzione l'asterisco in 004*2D87 e' "voluto", non e' quindi un errore di battitura :) Alla Call viene passato il nome inserito, in base al quale viene generato il codice corretto... Il codice corretto e quello inserito verrano poi confrontati nel CMP e se non coincidono viene eseguito il jmp... Si puo' quindi tranquillamente steppare lungo queste istruzioni e se da bravi reverse engineer guardassimo nei registri (il comando in Sice e' "R") vedremmo che in 0041C810 vi e' nel registro esi il valore esadecimale 13C54 che tradotto in decimale corrisponde al nostro caro "80980" e cosa ci sara' in eax ??? Ovviamente il sn corretto !!! che in hex e' 135**** !!! (ovviamente non vi do questo SN in esadecimale perche' sarebbe come darvi un codice illegale... quindi ricordatevi che noi facciamo reverse engineering solo a fini educativi, i programmi se li volete registrare ve li dovete pagare... Oltretutto il Winamp e' talmente bello che meriterebbe proprio di essere registrato :) "Piratarlo" sarebbe un atto illegale !) comunque sono cazzi vostri... io vi ricordo che non mi assumo nessuna responsabilita'... Abbiamo quindi compreso come funziona la protezione di questo programma... Bisogna ora riuscire a CAPIRE come modificare l'exe... Ci viene quindi in aiuto il ProcDump... (questo e' sicuramente il tool piu' utile che ho mai visto nella mia breve carriera di reverse engineer... :) (Ricordo che il winamp e' stato protetto con l'uso del Petite :) Proseguiamo... Eseguite il ProcDump e premete il pulsante "Unpack" scegliete come Unpacker il Petite... e quindi come file da aprire "winamp.exe" Attendete alcuni secondi in modo tale da caricare completamente l'exe in memoria, quindi clickate su Ok nella finestra di dialogo che e' comparsa... Indicate ora dove volete salvare l'eseguibile decriptato e chiamatelo: "~winamp.exe" per distinguerlo dall'altro... Potete a questo punto uscire dal ProcDump... e chiudere il Winamp (a me si chiude da solo... probabilmente anche a voi :p Il nuovo eseguibile generato e' praticamente dato dall'immagine in memoria del winamp in esecuzione... infatti il programma pur essento "packato" quando e' su disco deve assolutamente tornare in forma "normale" durante l'esecuzione per far si' che il povero processore possa eseguire un codice macchina comprensibile... Il file ~winamp.exe puo' quindi ora essere tranquillamente aperto anche con il wdasm che non dara' piu' alcun problema nel disassemblarlo... Se vi sentite ancora piu' bravi guardate il disassemblato direttamente con l'hiew... cosi' non dovete neanche perdere tempo a disassemblarlo con il W32dasm :p Dopo aver fatto cio' ci si puo' spostare alla locazione 0041C808 per poter studiare con calma il codice della nostra cara "vittima" Entrate ora nella call di generazione del SN corretto... (potrete anche notare che essa viene richiamata quattro volte durante l'esecuzione del programma) inoltre bisogna sottolineare che essa ritorna in eax il SN esatto :) cio' potrebbe essere utile ai fini della creazione di un keygenerator (io sfortunatamente non sono ancora capace sigh... :) Nota: un altro punto in cui probabilmente verra' richiamata questa funzione sara' quando ad esempio noi entriamo nella terza "Tabpage" dell'about del Winamp e il programma deve decidere se farci vedere la stringa "Shareware Version" oppure "Registered to..." Capito ??? Osserviamo ora le ultime righe di questa funzione prima del RET :004*2E70 8BC6 mov eax, esi :004*2E72 B964000000 mov ecx, 00000064 :004*2E77 6BC003 imul eax, 00000003 :004*2E7A 99 cdq :004*2E7B 83E203 and edx, 00000003 :004*2E7E 03C2 add eax, edx :004*2E80 C1F802 sar eax, 02 :004*2E83 99 cdq :004*2E84 F7F9 idiv ecx :004*2E86 8D0417 lea eax, dword ptr [edi+edx] :004*2E89 5F pop edi :004*2E8A 5E pop esi :004*2E8B 5B pop ebx :004*2E8C 8BE5 mov esp, ebp :004*2E8E 5D pop ebp :004*2E8F C3 ret Risulta ora molto chiaro come l'ultima operazione sul registo eax avviene in :004*2E86 quindi sarebbe possibile ad esempio assegnare in quel punto ad EAX il valore 1 in modo tale da far si' che per qualunque User il Sn corretto sia sempre 1 :) Cio' non e' pero' possibile, infatti abbiamo a nostra disposizione solo 3bytes ma l'istruzione "MOV EAX,1" ne occupa 5 e quella abbreviata "XOR EAX,EAX", "INC AL" ne occupa 4... risulta quindi necessario usare semplicemente un XOR EAX,EAX (in hex "33 C0") che rende quindi lo zero un SN universale... (il byte residuo verra' poi riempito con un NOP=90).. Possiamo quindi posizionarci nel wdasm sopra all'istruzione LEA EAX, DWORD... in modo tale da poter leggere il file offset dell'istruzione... cioe' la posizione (ottenuta sequenzialmente in hex a partire da 0) dell'istruzione all'interno del file exe. (per i soliti motivi il file offset non ve lo dico :) A questo punto si puo' entrare nell'Hiew, premere F5 e posizionarsi al file offset corretto :) quindi sostituire a "8D 04 17" il nuovo codice "33 C0 90" Avviando ora il Winamp e andando nella finestra di registrazione si potra' vedere che inserendo uno User qualsiasi e come Codice 0 sara' possibile registrare il programma (n.b. anche una stringa nulla come codice consente la pressione del tasto Ok ma non porta alla registrazione del programma :) Sicuramente era anche possibile far si' che il SN diventasse sempre 1.. basta cercare qche istruzione inutile dove inserire i bytes necessari... (attenti comunque a non far casini con jmps e calls...) vi lascio quindi questo piccolo lavoretto come esercizio :) Puff.... pant... finalmente ho concluso questa guida :) spero che tutti i programmatori che l'hanno letta abbiano capito qualcosa in piu' sulla protezione dei programmi :) Ricordo comunque a tutti di distribuire sempre i sorgenti o almeno di distribuire progs freeware :) Ognuno e' comunque libero di fare le sue scelte. Se volete sentire un po' di cazzate scrivete a: aLoNg3x albatro@freemail.it Ok... Ciauz a tutti :p Un grazie a: +Malattia e +Kill3xx (che rispondono sempre alle mie e-mails...) e anche a +xOANON (che mi ha insegnato per primo questa nobile arte) Un mega-saluto a: Tutto il gruppo Ringzer0, tutti quelli di Softpj, tutti i Dislessici (soprattutto a PornoIvo che e' l'unico che conosco :) e anche alla Orda delle Badlands, agli amici del chan #crack-it su IrcNet :) a GreenPeace, e infine ai Lag-Wagon !!! (il miglior gruppo musicale della Terra ;) e (stavo per dimenticarli...) anche ai Punkreas. Un mega-FUCK a: innanzitutto al sIsTeMa, poi alla McDonald's, alla Nestle', a tutti i truzzi italiani e a tutti i simboli del capitalismo occidentale... (dimenticavo... un bel fuck anche agli Offspring, perche' cazzo non siete restati alla Epitaph ??? vaffan(_|_) aLoNg3x. member of Ringzer0 (http://ringzer0.cjb.net) EOF