Eliminazione della protezione commerciale usata anche da tutti i prodotti Macromedia | ||
Data |
by "Pincopall " |
|
13/01/2002 + |
Published by Quequero | |
|
Grazie pincuzzooooooooo :) bei commentini :PP Grazie Que, dovere :P |
|
|
||
Difficoltà |
( )NewBies (X)Intermedio ( )Avanzato ( )Master |
Dunque, SalesAgent è una protezione commerciale e in questo tutorial vedremo come eliminarla del tutto da ogni software in cui sia presente, poichè è usata soprattutto dalla Macromedia che non si sa perchè ha una predilezione per questa protezione vedremo alcuni esempi relativi proprio a programmi Macromedia ovvero Dreamweaver 3 , Flash 5 e Fireworks 3, certo, lo so che la Macromedia ha fatto più di tre programmi ma ...una volta capito il meccanismo ...=) ; Bhè c'è un nuovo arrivato , Director 8, guardate l'addendum =) .
Introduzione |
Tools usati |
URL o FTP del programma |
Notizie sul programma |
Dunque, cosa fa il SalesAgent per proteggere i programmi che deve proteggere ve lo spiego dopo , per quanto riguarda le "Cavie" quì usate ecco cosa si dice di loro :
Dreamweaver 3 : Dreamweaver 3.0 si conferma il miglior Web Authoring Tool oggi in circolazione.
Fireworks 3 : La nuova versione del tool per la grafica su Web, si conferma come punto di riferimento per la realizzazione di immagini sia statiche, sia dimamiche.
Flash 5 : La nuova versione dell'editor per animazioni e file in formato Flash
Director 8 : La nuova versione del programma per realizzare applicazioni contenenti audio e video.
Essay |
Dunque eccoci quà , come primo programma da analizzare prendiamo Fireworks 3 lo installiamo e vediamo che nella cartella Macromedia\Fireworks3 ci sono ,oltre ad altri file, alcuni file che ci interessano particolarmente ovvero :
Fireworks 3.exe 200 Kb Fireworks 3.tty 7363 Kb Firewpop.tty 172 Kb
questi sono i files che ci interessano infatti ogni volta che troviamo un
.tty sappiamo di avere a che fare con SalesAgent, ma partiamo da principio
domandandoci come funzioni SalesAgent :
Vedete quel Fireworks 3.exe , bene
quando noi facciamo partire questo file , esso funziona da loader e fà in
realtà partire il fireworks 3.tty che come si può vedere è molto più
"ingombrante" , già ma ..che centra il Firewpop.tty? bene, quando noi
facciamo partire Fireworks, il programma controlla se è registrato verificando
la correttezza o l'esistenza del serial ( da voi precedentemente immesso ) che
si trova in una chiave di registro che potete facilmente riconoscere usando il
RegMon, ovvero monitorando gli accessi che il programma fà al registro di
Windows, cmq, se il seriale è esatto, il SalesAgent chiama in causa il
firewpop.tty usandolo per "farsi togliere di mezzo" ( alla fine vedrete cosa
intendo ), infatti dentro firewpop.tty c'è la routine con il decryption code
per rimuovere la protezione.
Già ma...allora nn sarebbe più facile
rinominare il firewpop.tty in .exe e lanciarlo in modo da eliminare la
protezione e finirla lì? (credo che vi stiate domandando questo, o almeno io
l'ho fatto ) ma.. ennò perchè vabbè che scopriremo che il SalesAgent è una
protezione non troppo difficle, ma mica proprio scema =) e quindi se proviamo
a far partire il nostro firewpop.exe ci viene rimproverato di nn avere i
diritti per far partire questo programma mmmm.. e allora?
BHè allora da
bravi crackers ( eggià in questo caso nn siamo reversers , se avessimo voluto
esserlo avremmo dovuto trovarci il serial esatto =) che usano lo zen ci viene
in mente una idea ovvero usare la routine di eliminazione del SalesAgent senza
aver introdotto codici et similia da nessuna parte, vediamo come fare
:
Dunque innanzitutto rinominiamo il firewpop.tty in firewpop.exe , e prima
di lanciarlo entriamo in SoftIce Ctrl+D e settiamo il seguente breakpoint :
bpx SleepEx, che effettivamente non è un breakpoint che si usa troppo
spesso, ma che in questo frangente ci tornerà mooolto utile ( leggete dopo le
note finali per magggiori chiarimenti =), comunque per chi non sapesse quello
che a grandi linee fà la funzione SleepEx, ecco subito quì la sua sintassi e
la sua funzione direttamente dall'Api reference Manual :
The SleepEx function causes the current thread to enter a wait state until one of the following occurs: · An I/O completion callback function is called · An asynchronous procedure call (APC) is queued to the thread. · The time-out interval elapses DWORD SleepEx( DWORD dwMilliseconds, // time-out interval in milliseconds BOOL bAlertable // early completion flag );
Dunque una volta settata la nostra trappola ( il bpx ) usciamo da SoftICe e avviamo il firewpop.exe apparirà una finestra in cui dirà di "star aggiornando il programma" e in quel mentre apparirà anche SoftIce , premiamo una volta F12 e arriviamo al punto di ritorno dalla chiamata a SleepEx ,precisamente quà :
:00401921 call 004017A0 :00401926 push 00000000 :00401928 push 00000000 :0040192A push 004022E0 :0040192F call 00419ACE :00401934 add esp, 0000000C :00401937 push 00000000 :00401939 push 000007D0 * Reference To: KERNEL32.SleepEx, Ord:0297h | :0040193E Call dword ptr [00423148] :00401944 call 004017A0 <-- Noi arriviamo quà :00401949 call 00401100 :0040194E mov esi, eax :00401950 cmp esi, FFFFFFFF :00401953 jne 0040196B <-- Questo salto salta normalmente facendoci :00401955 push 00000000 | saltare il ret a 401968 * Reference To: USER32.PostQuitMessage, Ord:01E0h | :00401957 Call dword ptr [004231DC] :0040195D pop edi :0040195E pop esi :0040195F xor eax, eax :00401961 pop ebx :00401962 add esp, 00001540 :00401968 ret 0010 * Referenced by a (C)onditional Jump at Address: 00401953(C) | * Reference To: USER32.PostQuitMessage, Ord:01E0h | :0040196B mov ebx, dword ptr [004231DC] <-- bhè arriviamo quà dopo il jnz * Reference To: USER32.MessageBoxA, Ord:01BEh | :00401971 mov edi, dword ptr [004231E4] :00401977 test esi, esi :00401979 jne 004019BF <-- questo salto non salta ma :0040197B lea eax, dword ptr [esp+0000054C] | sarebbe bene lo facesse infatti :00401982 push 00000FFF | si arriva alla msg box poco sotto :00401987 push eax :00401988 push 00000184 :0040198D call 004023D0 :00401992 push 00000185 :00401997 call 004023F0 :0040199C mov edx, dword ptr [esp+00001560] :004019A3 add esp, 00000010 :004019A6 lea ecx, dword ptr [esp+0000054C] :004019AD push 00010030 :004019B2 push 00433BF8 <-- pushato "Warning" il titolo della msg box :004019B7 push ecx <-- pushato l'argomento della msg box :004019B8 push edx :004019B9 call edi <-- questa è la chiamata a MessageBox :004019BB push 00000000 :004019BD call ebx
Il resto di codice per noi interessante lo vedremo dopo, soffermiamoci su
una curiosità: quando subito dopo la call SleepEx ci troviamo su quella call
4017A0 , premiamo F8 ed entriamoci, continuando a steppare arriveremo alla
chiamata di un API dal nome perlomeno sospetta, e se ci passiamo sopra con F10
ecco che apparirà la msg box di errore, eggià la api di cui stà parlando è la
DebugBreak ; quindi una volta che c siamo sopra digitiamo "a eip" e mettiamo 6
nop ( 909090909090 ) al posto dell'opcode della chiamata, vedremo così che
all'uscita da quella call il valore di eax con cui si entra nella call 401100
sarà 1 e non 0 ma qusto non è molto importante infatti all'inzio dell'altra
call si ha subito uno xor eax, eax =) , è da precisare che i lfatto che ora
eax valga 1 e non 0 non è dovuto alla chiamata in se, visto che DebugBreak non
ritorna nessun valore, quanto al fatto che ora la call 4017A0 va vanti per la
sua strada =).
Visto che so che siete curiosi di sapere meglio come
funziona la API DebugBreak e visto che so pure che siete pigri per andare a
vedere nel API reference guide, ecco a voi sintassi e spiegazione :
The DebugBreak function causes a breakpoint exception to occur in the current process so that the calling thread can signal the debugger and force it to take some action. If the process is being debugged, the search logic of a standard exception handler is used. In most cases,this causes the calling process to terminate because of an unhandled breakpoint exception. VOID DebugBreak(VOID) Parameters This function has no parameters.
Dopo questo particolare, parliamo di ciò che ci interessa, ovvero la call 401100, molto dipende infatti dal valore di eax che questa call che restituisce al suo ritorno, in quanto dopo di essa si ha quel mov esi, eax e chi viene confrontato dopo è proprio esi, il jnz all'offset 00401953 non deve saltare altrimenti si ritorna alla fine di una call che ci porta poi nel Kernel, quindi esi deve essere diverso da -1 , e ancora dopo all'indirizzo 401971 viene testato esi, ed è moolto importante che il jne 4019BF salti, altrimenti si finisce nel codice che ci fà apparire la msg box. Ora, ci sono 2 cose che possiamo fare, o andiamo a vedere dentro la call per stabilire in che modo NON far avere ad eax il valore di 0 quando si esce appunto dalla call ( il valore 0 per eax c andrebbe bene per far saltare il salto jne 40196B ma non per il salto jne 40196B ) oppure visto che stiamo operando a runtime e siamo sempre in Sice quando siamo sul salto ci battiamo un bel "r fl z" in modo da invertire il flag Z e far saltare il jnz, dunque facciamolo, saltiamo la msg box e arriviamo quà :
:004019BF call 004017A0 :004019C4 cmp esi, 00000001 <-- molto interessante :004019C7 jne 00401ABE :004019CD mov eax, dword ptr [0042BCB4] :004019D2 push 004328C4 :004019D7 add eax, 00000032 :004019DA lea ecx, dword ptr [esp+10] :004019DE push eax * Possible StringData Ref from Data Obj ->"Turnkexe%s%s" | :004019DF push 00425258 :004019E4 push ecx :004019E5 call 004196A7 :004019EA add esp, 00000010 :004019ED lea edx, dword ptr [esp+0C] :004019F1 push 00000000 :004019F3 push edx :004019F4 push 00000000 :004019F6 push 00000000 * Reference To: USER32.FindWindowExA, Ord:00D6h | :004019F8 Call dword ptr [00423224] :004019FE test eax, eax :00401A00 je 00401A4B
Già..."molto interessante" infatti il jne 00401ABE non deve saltare
altrimenti si arriva ad un ret che, come il ret di prima (non dimentichiamoci
che dobbiamo ancora tornare da una call ), ci porta appunto alla fine di una
call subito dopo la quale si ha un ret che ci porta nel Kernel e da cui nn si
cava un ragno dal buco, e soprattutto guardate quando il salto salta, quando
esi è diverso da 1 mmmm...ora, appurato il fatto che il valore di esi non
dipende dalla call che lo precede, e avendo prima visto che esi non doveva
valere ne 0 ne -1, ci sorge il dubbio che il valore giusto con il quale eax,
da cui poi seguiva il valore di esi, debba uscire dalla call 401100 sia
proprio 1, quindi proviamo o a cambiare manualmente il valore d esi portandolo
a 1 o ad invertire di nuovo il valore del flag z con un bel "r fl z" in modo
da non far saltare il jne.
Dunque tiriamo avanti con F10 fino ad un altro
punto cruciale, il je 401A00 sito all'offset 401A00, questo salto deve
saltare, infatti se non salta si arriva quà :
:00401A02 push 00000186 :00401A07 call 004023F0
e noi non vogliamo che la call 004023F0 venga eseguita, infatti guardatele dentro :
:004023F0 mov eax, dword ptr [esp+04] :004023F4 mov ecx, dword ptr [00427C08] :004023FA push 00000FFF :004023FF push 00433BF8 :00402404 push eax :00402405 push ecx * Reference To: USER32.LoadStringA, Ord:01ABh | :00402406 Call dword ptr [00423214] :0040240C ret
Come vedete viene pushato, prima della chiamata a LoadStringA, un offset da noi già visto, il 433BF8 , il quale se ben ricordate conteneva la stringa "Warning", possiamo quindi immaginare che non siano buone notizie, e se andiamo a esaminare il contenuto di eax che contiene l'argomento della finestra avremo la sicurezza che il nostro presentimento di cattive notizie era esatto =). Dunque lasciamo tranquillamente che il salto salti, infatti dopo la chiamata a FindWindowExA eax vale 0 e tutto va bene (per noi) =). Ma dove ci porterà il salto? quà :
*Referenced by a (C)onditional Jump at Address :00401A00(C) :00401A4B call 004017A0 :00401A50 call 00401AD0 :00401A55 push 00437154 :00401A5A push 00427888 :00401A5F lea eax, dword ptr [esp+00000354] * Possible StringData Ref from Data Obj ->"%s\%s" | :00401A66 push 00425250 :00401A6B push eax :00401A6C call 004196A7 ....
Non vi riporto tutto perchè bbhè...ormai il nostro lavoro è finito
=)
infatti non appena il salto ci ha portato all'offset 401A4B e non appena
eseguiamo la seconda call il fireworks ci dice di continuare ad aspettare che
stà mettendo tutto apposto, e se togliete i breakpoint (bc*) e andate in
esplora risorse vedrete come per magia il Fireworks 3.exe da 200 Kb sparire e
il Fireworks 3.tty diventare Fireworks 3.exe che funziona senza problemi
ritenendosi soddisfatto e senza più andare a cercare il fatto che voi lo
potete utilizzare solo per 30 giorni =)
Bene, Fireworks è fatto, ora però ce ne rimangono ankora 2 ....si ma...vedrete, non sarà affatto difficile perchè la protezione è paurosamente uguale!! non cambiano neanche gli offset, guardate, disassembliamo dreampop.tty, oppure dreampop.exe se lo avete già rinominato :
* Reference To: KERNEL32.SleepEx, Ord:0297h | :0040193E Call dword ptr [00423148] :00401944 call 004017A0 :00401949 call 00401100 :0040194E mov esi, eax :00401950 cmp esi, FFFFFFFF :00401953 jne 0040196B :00401955 push 00000000
NO, non sto scherzando e NO, non ho disassemblato per errore lo stesso file di prima, è tutto UGUALE,
:00401971 mov edi, dword ptr [004231E0] :00401977 test esi, esi :00401979 jne 004019BF <-- !! :0040197B lea eax, dword ptr [esp+0000054C]
:004019BF call 004017A0 :004019C4 cmp esi, 00000001 :004019C7 jne 00401ABE <-- !!!!! :004019CD mov eax, dword ptr [0042BCE4]
"Bhè ma allora se uso firewpop.exe al posto di dreampop.exe Dreamweaver 3 parte lo stesso? " vi starete domandando, vi confido che non lo so, lascio a voi lo sfizio di togliere al mondo questa curiosità, io son troppo pigro per reinstallare sia dreamweaver che fireworks per riaverli in versione demo e poi rifare tutto, non che ci voglia molto, ma stà attraversando. come vi ho detto, un periodo di pigrizia mai visto :-P
Dunque dopo aver installato Flash 5 disassembliamo flashpop.tty, cerchiamo nelle Imports la Kernel32!SleepEx e tadaaa...
* Reference To: KERNEL32.SleepEx, Ord:0297h | :0040182E Call dword ptr [00423150] :00401834 call 004016A0 Dovrebbe essere una struttura a voi familiare :00401839 call 00401120 :0040183E mov esi, eax :00401840 cmp esi, FFFFFFFF :00401843 jne 0040185B :00401845 push 00000000 * Reference To: USER32.PostQuitMessage, Ord:01E0h | :00401847 Call dword ptr [004231E0]
bhè...cambiano solo gli offset delle chiamate e dei salti, almeno rispetto a prima è un passo avanti (forse perchè flash 5 è più recente rispetto agli altri due, non mi stupirei se in Dreamweaver 4 trovassimo esattamente gli stessi offset che in Flash 5, bhè...verificheremo =), ma la struttura rimane quella :
* Referenced by a (C)onditional Jump at Address: 00401843(C) | * Reference To: USER32.PostQuitMessage, Ord:01E0h | :0040185B mov ebx, dword ptr [004231E0] * Reference To: USER32.MessageBoxA, Ord:01BEh | :00401861 mov edi, dword ptr [004231E4] :00401867 test esi, esi :00401869 jne 004018AF Tutto quà dovrebbe sembrarvi familiare ... :0040186B lea eax, dword ptr [esp+0000054C] :00401872 push 00001000 .... :004018AF call 004016A0 :004018B4 cmp esi, 00000001 :004018B7 jne 004019D6 ...praticamente dovreste sentirvi... :004018BD mov eax, dword ptr [0042E8D0] :004018C2 push 00436600 :004018C7 add eax, 00000032 :004018CA lea ecx, dword ptr [esp+10] :004018CE push eax * Possible StringData Ref from Data Obj ->"Turnkexe%s%s" | :004018CF push 004251B0 :004018D4 push ecx .... * Reference To: USER32.FindWindowExA, Ord:00D6h | :004018E8 Call dword ptr [0042322C] :004018EE test eax, eax :004018F0 je 0040193B ... a casa vostra :) :004018F2 push 00000186 :004018F7 call 00402360
Bene, mi pare che come esempi sul funzionamento e sull'eliminazione del
SalesAgent possano bastare, anche perchè se ne facevo degli altri perdevate
tutto il divertimento, ci sono ancora Macromedia Director e altri da testare,
ma dato che la struttura della protezione non mi sembra essere troppo diversa
da programma a programma o da versione a versione non credo ci sia ancora
molto da scoprire.
Per quanto riguarda il "per maggiori chiarimenti ecc.."
da me scritto sopra, eccoveli quà : perchè scegliere SleepEx quando anche io
non avevo mai usato un bpx su quell'API ? bhè, solamente per comodità, infatti
dopo aver messo un breakpoint su MessageBoxA ed esser risalito all'offset in
cui veniva chiamata, ho visto l'API SleepEx poco sopra e dopo aver visto il
funzionamento della API sopraddetta mi è sembrata una buona idea brekkarci
sopra=).
Per quanto riguarda la DebugBreak ci cui vi ho prima parlato come
curiosità, c'è da notare come, se no entriamo nella call 4017A0 e passiamo
sopra la chiamata a tale API, il programma si blocchi, mentre se passiamo
direttamente con F10 sopra la call 4017A0 non succeda niente =).
Ultimo
avvertimento và a colo i quali già si stanno fregando le mani pensando di
poter far una patch per dreampop.tty , bene, come vedete io nei Tools non ho
indicato un editor esadecimale, perchè? bhè perchè finchè i cambiamenti si
fanno a runtime da SoftIce tutto va bene ( ma dopotutto farli una volta ci
basta, perchè una volta effettuati i cambiamenti su dreamweaver.tty ecc.. mica
tornano indietro =) ) ma quando si và a patchare il file, saltano fuori dei
controlli CRC che non ho avuto voglia di controllare visto che a me
interessava olo il SalesAgent, e poi ho già il mio bel prog senza problemi
quindi... cmq, se proprio dovete fare una patch bhè, fatela direttamente del
file dreamweaver.tty trasformato in dreamweaver.exe no? , magari usate un
patchgenerator che non faccia storie se il prodotto finale è di dimensioni
maggiori del prodotto iniziale, il dreamweaver.tty è infatti più piccolo del
nuovo dreamweaver.exe di qualche centinaio di bytes.
E cmq visto che ora sapete l'impegno che i programmatori mettono dietro
queste protezioni ( in realtà non molto vabbè) , ma visto che i programmi son
belli, potreste evitare di fare i crack. Ricordatevi che reversiamo al solo
scopo di reversare. "Uè ma il disclaimer non andava più in basso ?!?" ...si
vabbè ma meglio ripetere le cose una volta di troppo che una volta di meno
=).
Bhè ora vi saluto, alla prossima eh bhè, spero vi siate diveriti =) ; vi
lascio cmq con un quesito interessante, quelli della Macromedia ce l'avranno
mica con me? naaaa
Bhè, ho notato, e devo dire con non poca contentezza, che qualcuno legge i miei tutorials a parte me :-P, ed ecco allora il perchè
di questo addendum, intanto per provare una altra cavia, ovvero Director 8 =) ,sempre Macromedia ovviamente =)
Ma dicevo del motivo, bhè ecco nel tutorial poco sopra ho detto dei vari controlli CRC che sarebbero saltati fuori
a modificare il, nel caso del Director 8, direcpop.tty, ma c'è un modo per evitarli ed anche per patchare da dead listing, cioè non a runtime
il file in questione, ovviamente dopo averlo rinominato direcpop.exe ,e questo addendum serve a svelare questo piccolo accorgimento a quelli che mi hanno scritto
e pure a quelli che non sanno cosa fare e per questo stanno ancora leggendo il tutorial =).
Bene, come avrete letto nel tutorial precedente all'inizio si mette un bpx SleepEx, e noi così facciamo e nel caso del Director arriviamo quà :
* Reference To: KERNEL32.SleepEx, Ord:0297h | :004017EE Call dword ptr [0042314C] :004017F4 E867FEFFFF call 00401660 :004017F9 E8E2F8FFFF call 004010E0 <-- Il serial è giusto ? si? eax=1 ;no? eax= 0 :004017FE 8BF0 mov esi, eax <-- Muove eax in esi :00401800 83FEFF cmp esi, FFFFFFFFv <-- Bhè vi ricordate no? confronta esi con -1 :00401803 7516 jne 0040181B <-- E se esi è diverso da -1 tutto ok =) :00401805 6A00 push 00000000 * Reference To: USER32.PostQuitMessage, Ord:01E0h | :00401807 Call dword ptr [004231E4] :0040180D pop edi :0040180E pop esi :0040180F xor eax, eax :00401811 pop ebx :00401812 add esp, 00001540 :00401818 ret 0010
Bhè, come vedete questo pezzo è uguale agli altri, il SalesAgent è sempre lui, cambiano solo gli offset, e già questo è un
miglioramento, vi ricordate Fireworks 3 e Dreamweaver 3 che abbiamo visto sopra? .
Bhè ovviamente anche tutto il resto della struttura della protezione è uguale, per cui non ve la stò a riportare, vi voglio invece
riportare alla mente il fatto che all'uscita della call 004010E0 il valore di eax, che poi verrà messo in esi, deve essere 1, se nn vi ricordate perchè andate
a ridarvi una letta qualche decina di righe fà =).
Ora, eax deve essere 1, prima del primo controllo, ovvero prima del jnz 0040181B, sito all'offset 401803, ora, visto che è sconveniente andare a cambiare la call precedente il controllo, la quale determina il valore
di eax, visto che è richiamata parecchie volte nel corso del programma e modificarla potrebbe darci non graditi effetti collaterali, cerchiamo
di far si che il valore di eax diventi 1 e che questo valore sia messo in esi, avendo a disposizione i 5 bytes che separano la call 004010E0 dal jnz .
Bhè verrebbe spontaneo fare un "mov eax,1" seguito da un "mov esi, eax", ma questo che impiegherebbe ben più di 5 bytes, facciamo allora
uno sforzo =) di ottimizzazione ed ecco il nostro nuovo codice, 5 bytes pari pari da mettere al posto dei 8BFO83FEFF :
:004017FE 33C0 xor eax, eax <-- Azzera eax ( eax=0 ) :00401800 40 inc eax <-- incrementa eax di 1 ( eax=1 ) :00401801 8BF0 mov esi, eax <-- Muove eax in esi ( esi=1 ) :00401803 7516 jne 0040181B <-- Salta come vogliamo noi
Bhè mi sembra sia facile no, è tutto scritto nei commenti =)
Bhè non ci resta che provare, andiamo nell'HexEditor che vogliamo, andiamo agli offset
dei comandi che dobbiamo cambiare e cambiamo 8BF083FEFF con 33C0408BF0; lanciamo
direcpop.exe e ....TADAA ecco che comincia il decript che ci toglie di torno SalesAgent e ci rende un eseguibile senza
restrizioni di nessun genere; certo, vedere quella scritta Trial Version nel logo di partenza e nall'About è bruttino, ma per
ovviare a questo inestetismo basta un Resource Editor ed il gioco è fatto =).
Bhè Addendum finito, spero l'abbiate gradito, la domanda oramai ricorre sempre più nella mia mente : da 1 a 10, quanto stò sul caz...erm antipatico alla Macromedia ? :-P
ByeZZ
|
Dunque come note finali vi raccomando di andarvi a studiare la routine di
verifica del seriale per vederne la validità o no ( eh bhè ovviamente =) ) e
di trovarvi un seriale ed una unlocking key validi facendo un buon lavoro da
reverser =) Ciauzzzzzz
Disclaimer Vorrei ricordare che questo software vaà
comprato e non rubato e o crakkato capito? Noi reversiamo al solo scopo informativo e di
miglioramento del linguaggio Assembly.
Un saluto alla Manu sul cui computer alieno Dreamweaver
freezava tutto constringendomi quindi ad una bella formattata in allegria :-P
Un saluto a beb0s, gipoco , c1cc10 e Ra1n ( che mi ha fatto da supplier
per tutte e 3 le cavie grazie ai 2000 CD di riviste che ha =))
Non può
mancare il saluto a tutta la UIC che ha ritrovato fissa dimora =) , alla mia
cara amata TCC che invece non l'ha ancora trovata =( e a tutti i frequentatori
di #crack-it e degli altri canali che frequento ...
And last but not least
un megasaluto a tutto lo staff di OndaQuadra ricordando a JeyOne che mi deve
un cartone di birra per avergli trovato i locali per il meeting al Bulk e bhè,
parlando di Bulk, un saluto pure a tutti i LOAckers =))
Una dedica speciale a : Bitchz, Sofist, Shy, deadCat, HoRRible, FatGirl, BestFrieNd, False, Bad[]Boy, TheDux, GyM, Horror, A-lone, pAULIN, funnybunny, FoRmAt
SalesAgent è un marchio
registrato.
Tutti i prodotti Macromedia hanno un copyright e i loro nomi,
loghi, icone ecc..sono registrati.
Non mi ritengo responsabile per
eventuali danni causati al vostro computer determinati dall'uso improprio di
questo tutorial. Questo documento è stato scritto per invogliare il
consumatore a registrare legalmente i propri programmi, e NON a fargli fare
uso dei tantissimi file crack presenti in rete, infatti tale documento aiuta a
comprendere lo sforzo immane che ogni singolo programmatore ha dovuto portare
avanti per fornire ai rispettivi consumatori i migliori prodotti
possibili.