Menu

Smashing Commercial Protection I : SoftSentry 2.11

Smashing Commercial Protection I : SoftSentry 2.11
thinked & written by (R)ipLey 25/06/99
--- DISCLAIMER ---------------------------------------------------------------
io mi pento e mi dolgo con tutto il cuore perke' ho peccato
per mia kolpa, mia kolpa, mia grandissima kolpa
e suppliko la beata sempre "vergine" corte di pregare x me
il signor Giudice di non kondannarmi :)
Signor Giudice perdonali xche' non sanno quello ke fanno!!! :))
Naturalmente non mi assumo nessuna responsabilita' x cio' ke farete
con le informazioni ke daro' nel presente tut.
------------------------------------------------------------------------------
Questo Tutorial (e' il secondo che scrivo ma il primo trattava di Backdoors,
quindi tendeva + sull' hacking ) sara' (spero) il primo di una serie il cui
scopo e' quello di eliminare qualcosa che rende noiosa quella che per noi
e' una appassionante sfida.
Infatti per come la vedo io il cracking e' una sfida fra il cracker e il
programmatore ( e ke vinca il migliore :) e queste kzz di protezioni
commerciali rendono questa sfida alquanto noiosa :
il gusto sta nel cercare di capire, studiando il disassemblato, quale sega
mentale il programmatore si e' sognato per farci perdere tempo (perke' mi
sembra scontato ke primo o poi qualkuno riuscira' a uscirne vincitore)...
detto questo mi sembra inutile dire ke non c'e' assolutamente nessun gusto a
crackare 300 programmi tutti con la stessa protezione del kazzo, o no ?
(Non penso ke contarsi quanti crack si sono realizzati per poi vantarsi di
essere il nuovo +ORC sia un atteggiamento degno di stima.
CORO : lo dici solo perke' i tuoi crack li puoi contare sulle dita
di una mano!!!! :))))
)
Possibile che i programmatori non si rendano conto di quanto inutili siano
queste soluzioni preconfezionate ?!?!?!?
Principalmente penso che questa tendenza sia dovuta al rincaro della cocaina
necessaria (a kili) ai programmatori per studiare un modo creativo di giocare
con noi (o noi di giocare con loro? :).
A parte gli scherzi cmq non riesco a capire con quale coraggio i programmatori
paghino la licenza di utilizzo del softSentry che protegge i programmi in un
modo kosi' squallido ke quasi mi viene da piangere ;-(.
Penso di aver esaurito le kazzate ke volevo dire (tanto lo so ke le avete
saltate :) e possiamo kominciare kon le kose serie.
----- SKEDA INFORMATIVA ------------------------------------------------------
Nome Programma    : SoftSENTRY v2.11
Software House    : 20/20 Software
URL               : www.twenty.com
Tipo              : applica una protezione configurabile dall'utente
(programmatore) direttamente sull'eseguibile del
programma.
Segni Particolare : Troppo stronzo x essere vero :D
-----------------------------------------------------------------------------
Un bel giorno giocando al "piccolo cracker" con un programmino shareware
(Grass Hopper v1.0.5 della Santrim Software - un browser in VB6) sbagliando
a modificare un locazione di memoria ho visto apparirmi una dialog ad
avvertirmi :
"softSENTRY - Failed to run!"
o qualcosa di simile... questo nome SoftSentry mi suonava vagamente conosciuto
cosi' mi sono messo a cercare dove ne avevo letto qualcosa.
Be', sulle "Cracker's N0tes" di TORN@DO  c'e' una piccola sessione riguardante
questo ignobile programma :
Nella versione 2.007 del SoftSentry bastava cercare le due call (sempre le stesse)
che si occupano di caricare le risorse e caricare il programma e spostarle(con le
opportune modifiche di rilocazione) all'inizio del programma al posto dell'entry
point standard del softSentry... ed il gioco e' fatto!!! :)
Ora, verificato che la versione usata dal "mio" programma era leggermente diversa
ho prima trovato il modo di convertire quanto appreso dalle "Cracker's N0tes"
per a
1000
dattarlo al mio caso e poi ho scaricato dal sito della "20/20 Software" la
versione trial del loro "interessantissimo" prodotto per vedere quanto standard
fosse la loro soluzione automatica di protezione del software...
Vi diro' che una volta appreso il meccanismo vi bastera' l'HIEW  e un PEBrowse
per crackare tutti i programmi protetti da questo pacchetto ke a mio avviso e'
una vera e propria truffa...
Usare il SoftIce per crackare questa protezione sarebbe come usare un martello
pneumatico per aprire una nocciolina... una vera e propria follia!!! :).
Naturalmente la prima cosa che mi e' venuta in mente e' stata di vedere se per
proteggere la versione trial del loro ignobile programma avessero scelto di
usare il loro stesso "infallibile" sistema automatizzato...
Ebbene per la serie "La Follia Umana e' Infinita" e prodotto da "Il Modo e' Bello
Perche' e' Vario"-Production... si! hanno usato il loro sistema del kazzo.
A questo punto le cose sono due :
1. O dopo un "attento" esame hanno giudicato il loro sistema infallibile...
2. Oppure hanno una considerazione cosi' bassa dei cracker da considerarci
dei ritardati mentali che mettono breakpoint a kzz e modificano il codice
assembler delle applicazioni usando i piedi.
Probabilmente entrambe le cose!!!
--- 1. Know Your Enemy (Rage Against The Machine) ----------------------------
Prima di tutto come facciamo a riconoscere se il programma che abbiamo fra le
mani e' protetto con il SoftSentry ???
Lo possiamo capire in diversi modi :
1.Section Headers doppi
Oltre a quelli "standard" (.text , .data , .rdata etc...) ce ne saranno
altri ancora + "standard" (hehehe) come _data, _idata, _rsrc, e _reloc ma
sopratutto una sezione chiamata 20/20tm (vi dice niente?:)
2.Standard Resources
Nelle risorse troveremo una sezione "LWJDATA" e fra le Dialog una chiamata
SENTRYABORTDLG
3.Hiew - "Import Strange Data" Warning
Quando aprite l'eseguibile con l'HIEW questo ci da il suddetto warning.
4.Standard Entry Point OpCodes
L'Entry Point del programma contiene sempre le stesse istruzioni :
55            push    ebp
8BEC          mov     ebp, esp
83EC64        sub     esp, 64
53            push    ebx
56            push    esi
57            push    edi
E950000000    jmp     .xxxxxxxxx
Impossibile sbagliare :))
Non vi Basta ?!?!??!?!?!?!?!?
La protezione consiste nell'aggiunta della sezioni standard del softSENTRY che
effettuano il controllo sulla scadenza del Trial Mode e sulla lettura del
codice seriale in caso di errore termina il processo dopo averci avvertito
che dobbiamo comprare il programma altrimenti va ha caricare il programma vero
e proprio...
Ed e' questa la parte che ci interessa.
Tracciando con il SoftIce (solo la prima volta x capire il funzionamento della
protezione:) quello che avviene dopo aver premuto il tasto "Try" sulla dialog
di registrazione arriveremo ad una call che avviera' il programma.
Questa funzione si presentera' cosi (sempre!!! non si puo' sbagliare) :
56                    push    esi
57                    push    edi
8BF2                  mov     esi, edx
8B7C240C              mov     edi, [esp+0C] ; 00400000 (ImageBase?)
8B5102                mov     edx, [ecx+02] ; MagicNumber1
335106                xor     edx, [ecx+06] ; MagicNumber2
33510A                xor     edx, [ecx+0A] ; MagicNumber3
03FA                  add     edi, edx
33D2                  xor     edx, edx
loop1 :  8B4106                mov     eax, [ecx+06] ; MagicNumber2
42                    inc     edx
314497FC              xor     [edx*4+edi-04], eax
42                    inc     edx
8B410A                mov     eax, [ecx+0A] ; MagicNumber3
314497FC              xor     [edx*4+edi-04], eax
83FA14                cmp     edx, 14
7CEB                  jl      loop1
8B0E                  mov
1000
ecx, [esi]
E85F320000            call    xxxxxxxx
C70600000000          mov     dword ptr [esi], 00000000
66833DB8E1400000      cmp     word ptr [0040E1B8], 0000
740C                  jz      error1
66833DC0E1400000      cmp     word ptr [0040E1C0], 0000
7402                  jz      error1
FFD7                  call    edi
error1 :  6A00                  push    00
68xxxxxxxx            push    xxxxxxxx
68xxxxxxxx            push    xxxxxxxx
6A00                  push    00
FF15xxxxxxxx          call    [User32!MessageBoxA]
5F                    pop     edi
5E                    pop     esi
C20400                ret     0004
con le "x" ho indicato cio' che variera' fra un eseguibile ed un altro...
il resto sara' sempre uguale :)))
Il funzionamento e' piuttosto semplice e se provate a tracciarla sicuramente
non impiegherete + di 30 millisecondi x capire cosa fa'...
"decripta" (e' una parola grossa x il caso in questione ma + o - e' quello che
fa' :) le prime 40 dword del programma vero e proprio e poi lo esegue con
la "call edi".
Ora ci tocca capire da dove ricava le dword che usa per il decriptaggio.
Innanzitutto va detto che edi con l'istruzione :
mov     edi, [esp+0C]
diventa sempre 0x00400000 e questo penso sia il valore dell'imageBase dello
eseguibile in quanto era sempre lo stesso per tutti i programmi protetti con
softSENTRY che ho visto (forse per le DLL sara' diverso)
Mentre e' + interessante capire da dove vengono le 3 dword usate nello snippet :
mov     edx, [ecx+02]
xor     edx, [ecx+06]
xor     edx, [ecx+0A]
e successivamente :
mov     eax, [ecx+06]
....
mov     eax, [ecx+0A]
Per capire da dove vengono dobbiamo innanzitutto capire che cosa indica e da
dove viene il valore associato ad ecx quindi saliamo di 1 livello:
8B4DB8          mov     ecx, [ebp-48]       ;<----- da qui ricava ecx
E834000000      call    decrypt_and_run     ;la "nostra" funzione :)
con un bel breakpoint sulla memoria vediamo chi e' che ci scrive quel
valore in memoria...
ci sono solo 2 o 3 punti prima della "nostra" funzione in cui quell'area di
memoria viene modificata ma a noi interessa solo l'istruzione che ci inserisce
il valore "giusto", quello che avevamo trovato in ecx al momento del
decryptaggio...
Risalendo arriveremo a trovare un funzione del programma che ricava proprio
il valore che stavamo cercando tramite delle chiamate al kernel...
....
68xxxxxxxx      push    xxxxxxxx          ; lpType-->FindResourceA
50              push    eax               ; lpName-->FindResourceA
8B3Dxxxxxxxx    mov     edi, [Kernel32!GetModuleHandleA]
6A00            push    00                ; lpModuleName-->GetModuleHandleA
FFD7            call    edi
50              push    eax               ; hModule-->FindResourceA
FF15xxxxxxxx    call    [Kernel32!FindResourceA]
85C0            test    eax, eax
7421            jz      error1
50              push    eax               ; hResInfo-->LoadResource
6A00            push    00                ; lpModuleName-->GetModuleHandleA
FFD7            call    edi
50              push    eax               ; hModule-->LoadResource
FF15xxxxxxxx    call    [Kernel32!LoadResource]
8906            mov     [esi], eax
85C0            test    eax, eax
740F            jz      error1
50              push    eax               ; hResData-->LoackResource
FF15xxxxxxxx    call    [Kernel32!LockResource]
8BF0            mov     esi, eax          ; esi=pointer to data
85F6            test    esi, esi
7515            jnz     ok1
EB04            jmp     error2
error1: 8B742408        mov     esi, [esp+08]      ; error in
error2: BAxx
1000
xxxxxx      mov     edx, xxxxxxxx      ; loading
B9xxxxxxxx      mov     ecx, xxxxxxxx      ; resources
E827000000      call    show_message_box
ok1: 8BC6            mov     eax, esi
5F              pop     edi
5E              pop     esi
83C404          add     esp, 04
C3              ret
/= GetModuleHandle =========================================================\
|                                                                           |
|    HMODULE GetModuleHandle(                                               |
|        LPCTSTR lpModuleName      // puntatore al nome del modulo di cui   |
|                                  // vogliamo l'handle.                    |
|    );                                                                     |
|                                                                           |
|    ritorna l'handle del modulo specificato da "lpModuleName" o se         |
|    "lpModuleName" e' NULL quello del file usato x creare il processo      |
|    chiamante (questo e' il nostro caso:)                                  |
\---------------------------------------------------------------------------/
/= FindResource ============================================================\
|                                                                           |
|    HRSRC FindResource (                                                   |
|        HMODULE hModule,     // handle del modulo                          |
|        LPCTSTR lpName,      // puntatore al nome della risorsa            |
|        LPCTSTR lpType       // puntatore al nome del tipo di risorsa      |
|    );                                                                     |
|                                                                           |
|    localizza una risorsa con il nome e il tipo specificato nel modulo     |
|    specificato. (se la parte alta di lpName e' 0 la parte bassa sara'     |
|    l'identificativo intero della risorsa - questo e' in nostro caso :))   |
\---------------------------------------------------------------------------/
/= LoadResource ============================================================\
|                                                                           |
|    HGLOBAL LoadResource (                                                 |
|        HMODULE hModule,     // handle del modulo                          |
|        HRSRC   hResInfo     // handle della risorsa                       |
|    );                                                                     |
|                                                                           |
|    carica la risorsa specificata nella Global Memory.                     |
\---------------------------------------------------------------------------/
/= LockResource ============================================================\
|                                                                           |
|    LPVOID LoadResource (                                                  |
|        HGLOBAL hResData     // valore ritornato dalla LoadResource        |
|    );                                                                     |
|                                                                           |
|    bocca la risorsa specificata in memoria.                               |
|    Ritorna un puntatore al primo byte della risorsa in caso di successo,  |
|    altrimenti NULL.                                                       |
\---------------------------------------------------------------------------/
studiando un po' il codice (non ci vuole poi molto) arriveremo a capire che
non fa altro che caricare una risorsa dall'eseguibile stesso e il valore in
ecx e' l'indirizzo di memoria dove la risorsa e' stata caricata...
Ma le sorprese non sono finite perke' la risorsa in questione fa parte della
sezione "LWJDATA" che vi avevo fatto notare come caratteristica del softSENTRY
ed e' precisamente quella con ID = 1
1000
03 (67hex).
Ora mai sappiamo abbastanza di questo ignobile programma e possiamo passare
al contrattacco :))
--- 2. Kill You (Korn - Life is Peachy) ---------------------------------------
Io esporro' il mio modo di agire poi voi siete liberi di utilizzare i tools ke
+ vi piacciono :)))
Ingredienti :
1 Kg    di  PEBrowse Professional 1.2.1.0
200 g   di  HIEW 6.04
5   g   di  Ganja
1 pacco di  Camel da 10
1 pacco di  Smoking Red
1 riduzione discoteca
1 birra gelata (a DuDemon 4 me)
Gli ultimi 5 ingredienti servono a rendere il lavoro meno noioso :))
Aprite l'eseguibile col PEBrowse (e la birra anche...:) nelle risorse cercate
LWJDATA e sotto LWJDATA la risorsa con ID=103.
Chiedete gentilmente al PEBrowse se ve la puo' dumpare e se acconsente
(il caldo nuoce gravemente alla mia salute psichica) provvedete prima ad
allineare i byte (ricordate? ecx+02...ecx+06...ecx+0A... quindi spostatevi 2
byte a destra) e convertite il tutto in dword :
Ecco a voi i 3 numeri magici (li chiameremo MagicNumber1, 2 e 3 :) che vengono
usati per decryptare il codice.
Segnateli.... vi serviranno :)
Ora salutiamo il PEBrowse il quale non ci servira' + (ccccciiiiiaaaaaoooooo:))
E chiamiamo il nostro fido HIEW (arf... arf... :)
Posizioniamoci sull'entry point e...
riscriviamolo in modo ke proceda direttamente al decriptaggio ed esecuzione del
programma vero e proprio saltando a pie' pari tutto il codice del softSENTRY
BF00004000   mov     edi, 00400000
BAxxxxxxxx   mov     edx, MagicNumber1
B8yyyyyyyy   mov     eax, MagicNumber2
BBzzzzzzzz   mov     ebx, MagicNumber3
33D0         xor     edx, eax
33D3         xor     edx, ebx
03FA         add     edi, edx
33D2         xor     edx, edx
loop1 : 42           inc     edx
314497FC     xor     [edx*4+edi-04], eax
42           inc     edx
315C97FC     xor     [edx*4+edi-04], ebx
83FA14       cmp     edx, 14
7CF1         jl      loop1
FFD7         call    edi
al posto di MagicNumber1,2 e 3 (e quindi delle "x", "y" e "z") inserite i
numeri "magici" trovati con il PEBrowse e poi .....
Basta, questo e' tutto il programma funzionera' fregandosene altamente che
il trial sia terminato o meno.
Possiamo inoltre essere sicuri che il programma funzionera' come se fosse
registrato in quanto e' totalmente all'oscuro della protezione perke' aggiunta
in seguito ( questo gioca a nostro favore, no? )
--- 3. Last Exit (Perl Jam - Vitalogy) ---------------------------------------
Bibliografia : Documentazione del Visual C++ 5.0 sulle API di Windows
(quel ke e' giusto e' giusto...date a Cesare quel che e'
di Cesare:))
Questo e' tutto x ora spero ke il menu' sia stato di vostro gradimento e' che
i programmatori della softSENTRY cambino lavoro :)))))
Passiamo ai ringraziamente (sono poki non vi preokkupate:)
Thanks to :
netzus6 "Euclideo" - ke mi appoggia in tutte le kazzate ke faccio.
steFax  "stePhone" - ke mi ha copiato MonkeyInsland 3 e non funziona il
secondo cd e sto gia' godendo per quando lo uccidero di
mazzate (gggggrrr!!!).
-Neural_Noise      - perke' e' un grande e mi ha fatto spakkare dalle risate
anche se lo beccato solo un paio di volte (ciao -NN)
Kill3xx               - perke' non lo sento da un casino :(
+Malattia              - perke' mi e' simpatico ed e' sempre molto disponibile
Guybrush "Neuromante" - perke' e' l'unico ke incontro sempre su #crack-it
ZeroCool & N0bodY88   - ke' hanno pubblicato il mio primo tut sul Newbies#3
RigoR MorteM          - perke' e' una persona seria :)
pIGpEN                - ke non conosco ma ke mi piace come scrive e da quello
ke ho letto si spakka alla grande:)
kissa... magari un giorno ci faremo un Kannone
insieme :)  (appr. il secchio lo hai mai provato?)
s
8bd
aluti anche a tutto RingZer0 e #crack-it, a tutto lo staff di B.F.I. ,
quello di NewBies e di NetRunners (e a tutti gli spp in generale) ,
sia a chi mi conosce che a chi non gliene fotte niente di me.
Questo Tut e' stato possibile anche grazie al supporto musicale di :
Korn - Rage Against The Machine - Primus - The Cure - Buju Banton -
Perl Jam - Dinosaur Jr. - Exploited - Toy Dolls - CCCP - Nine Inch Nails.
Inoltre un sentitissimo FUCK a :
Bill Gates - perke' ha rotto i koglioni con la sua mania da Hitler
dell'informatica
Telekom    - perke' e' colpa loro e delle loro tariffe di mmmmerda
se non ho una connessione alla rete
(fuck fuck fuck FUUUUUUUUUUUUUUCK ):(
A Quello Stonzo ke ha tradotto Hacker=Pirata_Informatico (vergognati)
- perke' sembra che un Hacker sia un tipo con una benda su un
occhio che usa la tastiera con una mano sola perke' nell'altra
ha un uncino e occupa le sue giornate in "feroci" scorribande
nell'oceano della "Computer Science".
Vorrei fare inoltre un appello a chi ancora continua a definire Cracker
un "Hacker cattivo" il cui scopo e' quello di entrare in un sistema x poi
distruggerlo :
La volete finire o no !!!!!
Avete skassato u kaz co 'sta storia.
Un cracker studia un programma senza averne i sorgenti x farci
cio' che ritiene opportuno (e'questo il bello:)
e non gliene frega un amatissimo k...o del vostro fottutissimo sistema.
$$$$$               $$
$ $$$ $   ››         $$     $$$
$  $ $  $  $$  $$$$   $$    $   $  $     $$
$  $$   $  $$  $$  $  $$    $$$$$   $   $$
$ $ $ $   $$  $$  $  $$    $        $ $$
$$$$$    $$  $$$$   $$$$$  $$$$     $$
$$                    $$
$$                   $$
Spedite ringraziamenti, elogi, critiche costruttive a
Cannabis_Oil@hotmail.com
Per critiche non/costruttive, insulti, flames e bu......e varie a
DevNull@Hole.ass
(R)ipLey
EOF---------------------------------------------------------------------------

Top: Sicurezza su Internet - Back
Previous: InstalSHIELD 5 Script Zen Cracking - Up: Sicurezza su Internet - Next: SoftSENTRY 2.1 DLL protection

This page last updated: Friday 08 November 2002 at 3:59pm

Please send any comments on this page to Astalalista.

Labelled with ICRA

This page is powered by Copyright Button(TM).
Click here to read how this page is protected by copyright laws.

Use this button to
NOT browser button


begin banner Exchange zone

Member of BannerPower Rotation System

Home Main Portal Translate Tell A Friend Create Page Create Site Search Site Search WWW E-mail Login Insert A Link Free for All Free Dating Forum disabled-come soon Guestbook Links Vote For Us disabled-come soon Realtor Monmouth NJ | Movers NJ | Discount Window Shades | Blog Widgets | Necklace