Zoom Icon

SalesAgent

From UIC

SalesAgent defeating + Addendum

Contents


Infos
Author: Pincopall
Email: Pincopall90@hotmail.com
Website: http://pincopall.altervista.org
Date: 13-28/01-02/2002 (dd/mm/yyyy)
Level: Luck and skills are required
Language: Italian Image:Flag_Italian.gif
Comments: Que: Grazie pincuzzooooooooo :) bei commentini :PP



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


Tools

  • SoftIce, la versione che preferite del debugger.
  • HexWorkShop
  • W32Dasm 8.93 o IDA, non è che il disassemblatore sia molto importante, anzi veramente ai fini del crack non serve proprio a niente, ci serve invece per avere una migliore visione delle cose.
  • Una API reference guide


Link e Riferimenti

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

Dunque, cosa fa il SalesAgent per proteggere i programmi che deve proteggere ve lo spiego dopo , per quanto riguarda le "Cavie" qui 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 qua , 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 fa 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 fa 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 fa la funzione SleepEx, ecco subito qui 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 qua :


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 qua
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 qua 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 fa 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 qua :

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 qua :

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? qua :

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é bhè...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 qua 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 qua : 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 qua :


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

I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.

Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevoli e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.