SalesAgent defeating
Eliminazione della protezione commerciale usata anche da tutti i prodotti Macromedia

Data

by "Pincopall "

 

13/01/2002 +
Addendum del 28/02/2002

UIC's Home Page

Published by Quequero


E' vero che come dicevano i latini "Repetita iuvant " ...

Grazie pincuzzooooooooo :) bei commentini :PP

Grazie Que, dovere :P

...ma non credo che valesse anche per gli schemi di protezione...vedere per credere =)

http://pincopall.cjb.net/
E-mail: mailto:[email protected]
Pincopall on #crack-it #hackmaniaci #tcc ecc..

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 =) .


SalesAgent Defeating
Eliminiamo una ennesima commercial protection

Written by Pincopall

Introduzione


Dunque, molti software adottano protezioni più o meno complicate basate su algoritmi di criptazione, su algoritmi di calcolo del seriale, su packer, su sistemi anticopiatuta ecc... ebbene oggi vi andrò a spiegare come eliminare una fra questi tanti tipi di protezione quale? bhè.. il SalesAgent , cos'è il SalesAgent? bhè se siete curiosi andate avanti nella lettura di questo tutorial =) buon divertimento .Ah, ma non dimentichiamo di dire cosa fà come restrizione =), bhè ci impedisce di usare li programma da lui protetto per più di trenta giorni dandoci all'inzio una spiacevole finestra con "Buy" , "Try" , "Exit" che sicuramente noterete =)

Tools usati


SoftIce 4.05 -- la versione che preferite del debugger
WinDasm 8.93 o IDA -- non è che il disassemblatore si molto importante anzi veramente ai fini del crack non serve proprio a niente, ci serve invece per avere una migliore visione delle cose
Un'API reference guide

URL o FTP del programma


http://www.macromedia.com ,questo è l'url dove potrete trovare le demo dei programmi analizzati in questo tutorial e quindi anche il SalesAgent che stà lì a proteggerli ; mentre se volete delle info solamente su SalesAgent ecco il sito di chi lo sviluppa : www.rsasecurity.com

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


Mmmmm...dopo questa delusione che ci ha dato dreamweaver, o meglio i programmatori della Macromedia che han messo a tutti lo stesso file di protezione cambiandolo si e no di una virgola, vediamo se anche Flash 5 ci tira il bidone, perchè 2 può essere una coincidenza, ma 3 comincia ad essere quasi una certezza...

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

Addendum 28-02-2002

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

Pincopall

Note finali

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 =)
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

Ciauzzzzzz


Disclaimer

Vorrei ricordare che questo software vaà comprato e non rubato e o crakkato capito?
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.

Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly.