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