Marinari Byngo Setup
6 ( e dico SEI ) piccioni con una fava

Data

by "Pincopall "

 

15/06/2002

UIC's Home Page

Published by Quequero


"..E ricorda il Buddha dimora nel codice di una patch o nei circuiti di un calcolatore.."

Pinco grazie per avermi ricordato dove mettere i commentuzzi :))), beh hai rovinato una famiglia di programmatori lo sai vero? Poverelli :) e la prossima volta allineami almeno gli opcode, se ce li vuoi lasciare e anche le istruzioni :PP argh :)...Prossimo tute...Via! (seconda volta che riuppo questo tute...pincuzzo e' anche l'uomo dei reup, mi rimanda un tute mediamente sei volte :P)

"...con lo stesso agio che nello spirito del karatè o nei petali di un fiore "
Dedica sulla foto di 4a fattami da mio amico Beb0s.

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

Difficoltà

(X)Idiotz ( )NewBies ( )Intermedio ( )Avanzato ( )Master

 

Dunque, questo è ovviamente un tutorial, ma più che un tutorial vuol essere una specie di avvertimento a coloro i quali producono questo tipo di demo ad alto rischio, cosa intendo? Bhè intendo dire che nn si puà sperare di proteggere la bellezza di 6 programmi con una protezione in Visual Basic 5 ! e siamo nel 2002! perchè la definisco Demo ad "alto rischio"..bhè leggete e poi ditemi se è stato facile o no trovare la pwd.


Marinari Byngo Setup
6 piccioni con una fava

Written by Pincopall

Introduzione


Come avrete capito da quello che vi ho detto sopra, questo programma è protetto da una routine in VB5, molto, troppo, facile da reversare ( ebbè si parla di VB5 ). Noi non faremo altro che andare a sfruttare un "buco" del Visual Basic, buco che non avremmo potuto usare se non grazie alla pigrizia dei programmatori =) che non si sono limitati neppure a cambiare gli offset della .dll che andremo ad esaminare, ovviamente non può che trattarsi della famigerata msvbvm50.dll, la .dll tipica di ogni programma scritto in VB5.
Ah, gli fixeremo pure un bug ( ovviamente a nostro vantaggio ) =).

Tools usati


SoftIce 4.05 -- la versione che preferite del debugger

Un editor esadecimale a piacimento...io ho usato Hex Workshop 3.11

URL o FTP del programma


MAh...io l'ho trovato su una rivista, e nell'about del programma non ci sono indirizzi web, ma se cercate su un motore di ricerca "Marinari + lotto " o qualcosa del genere, sicuramante qualkosa troverete =)

Notizie sul programma


Ma parliamo ora di cosa è questo "Marinari Byngo Setup", credo che questo tipo di programma si chiami Installer,ovvero questa è una suite di sei programmi :

Marinari Lotto Statistica
Marinari Super Enalotto
Marinari Totocalcio
Marinari Totogol
Marinari Totosei
Marinari Totip

e tale suite è protetta da questo Marinari Byngo Setup che se non riceve la chiave giusta, diversa per ogni programma ( ok la protezione è da niente, ma ora nn esageriamo =)) installa il programma da noi scelto fra i sei in trial mode, ovvero con funzioni disabilitate, tempo di scadenza ed altre cose del genere.
Come dite? perkè stò scrivendo un tutorial su una protezione idiota?
a) Per avviso ai programmatori tutti che ancora non lo sapessero, ma che cmq dubito leggeranno mai questo tute, a nn fare mai una cosa del genere con i loro prodotti, od almeno a proteggere l'installer con una protezione degnaa di questo nome.
b) Perchè ho conosciuto un GENIO che stava cercando di reversare stì prog e che per averli tutti in full version non aveva trovato soluzione migliore se non crakkare tutti e sei i programmi una volta installati ( cosa che poi non gli è riuscita dato che spesso alcune delle funzioni disabilitate non vengono proprio installate nel programma trial ), quando il tutto si poteva fare patchando, se proprio si vuole patchare, uno o 2 byte.
c) Ho passatro stamani l'esame di Chimica Organica e mi devo sfogare, la ragazza è in vacanza coi suoi, cosa meglio di reversing&mp3 ( thank you Yoda Player =) ?

Bhè direi che è ora di cominciare no?

Essay

Allora, nella versione che ho io, essendo una versione di promozione inserita in una rivista come vi ho detto, dei sei programmi uno era in omaggio, era LottoLight, grazie =), gli altri venivano tutti installati in modo demo ( premendo sul relativo pulsante ) se il Byngo Setup non riceveva la chiave giusta, se la chiave era giusta abilitava un pulsante ("Avvia l'installazione")e premendo quest'ultimo veniva installato il programma da noi scelto..come faceva sapere quale avevamo scelto dite? Bhè lo capisce dal serial immesso, o meglio, da una parte di esso.=)
Dunque, all'inizio sembra un bel programma tosto, che promette delle belle sfide di reversing, o almeno così speravo, di fatto è in realtà una stronzata da reversare...vabbè ma cominciamo col cercare di capire quale breakpoint settare,mmm...anche se metto la chiave, che ha questa forma : XX-XXXXXX-XXXXXX , il pulsante non si abilita, ergo nn viene fuori nessuna beggar off, su cosa puntare allora? Bhè..tagliamo la testa al toro, bpx hmemcpy, la cosa sarà lunga ma almeno ci porterà ad un qualke risultato. Ok, prima di piazzare il bp scriviamo il nostro serial tralasciando ovviamente l'ultimo carattere, prima di scriverlo infatti abilitiamo il breakpoint, usciamo da SoftIce (F5) e battiamo sulla tastiera l'ultimo char del nostro seriale..TADAAA il SIce poppa..mmm ovviamente non siamo ancora da nessuna parte, per cui cominciamo con F12 finchè non vediamo apparire nella riga verde del SoftIce qualkosa che ci illumini e che sia diverso dai vari kernel32 e user32...continuiamo, eseguiamo vari ret e all'improvviso ci casca il mondo addosso...e nooooooo...msvbvm50.dll, è in vb5, niente, il sogno di una notte di reversing dovremo posticiparlo, o dovremo rifugiarci su altri prog più interessanti ( dal punto di vista del reversing si intende ), eggià perchè questo prog non fà neanche uso di altri strani .ocx o .dll, usa solo ed esclusivamente la sopra citata .dll per il check del suo serial.
Uff..delusi da stò proggy che prometteva bene ma ha mantenuto niente, per ripicca facciamo la cosa + scontata da fare quando ci si trova davanti ad un prog in VB5 che usa la msvbvm50.dll come unico conforto e che è stato codato da programmatori pigri ovvero, dopo aver tolto il bpx hmemcpy, e sempre stando dentro la msvbvm50.dll piazzare un bpx 0F00D9EB ( già..Alor rulezz =)) o comunque un bp in questa zona, uscire da Sice e finire di inserire la pwd, alla fine Sice popperà da solo :


:0F00D9EB 57         push edi
:0F00D9EC 8B7C2410   mov edi, dword ptr [esp+10] <--- Viene messo in edi il serial esatto
:0F00D9F0 8B74240C   mov esi, dword ptr [esp+0C] <--- Viene messo in esi il serial da noi inserito
:0F00D9F4 8B4C2414   mov ecx, dword ptr [esp+14]
:0F00D9F8 33C0       xor eax, eax
:0F00D9FA F3         repz                        <--- qui vengono comparate  
:0F00D9FB 66A7       cmpsw                       <--- le stringhe 
:0F00D9FD 7405       je 0F00DA04		 <--- Se sono uguali si salta 
:0F00D9FF 1BC0       sbb eax, eax

Bhè mi sembra intuitivo quasi, in edi viene spostato il serial, ma se una volta passati gli offest dei mov fate un "dd edi" o un "dd esi" vederete che ad esser mosse in edi ed in esi son solo le ultime due parti del serial giusto e di quello da noi immesso,e notate che la parte centrale del serial giusto e di quello errato sono uguali, sempre, cambia solo la ultima parte, calcolata in base alla parte iniziale ed a quella centrale del codice, Esatto avete centrato in pieno, il nome non serve a niente.
Così ad esempio se io inserisco "Pincopall" "22-324567-UICUIC" il serial esatto sarà "22-324567-VAPSXQ" oppure se inserisco "22-876783-21232" il serial esatto sarà "22-876783-ITXHYX", dove ovviamente la ultima parte di ogni serial esatto è indipendente dal nome e da ogni altra cosa tranne che dalla parte iniziale e da quella centrale del serial immesso. Già...sarebbe carino farci un keygen studiandosi la routine di generazione del serial, e forse lo farò quando mi sarà passato lo sconforto :P, anzi pensateci voi và =).
Avete però bisogno di sapere una altra cosa, nessuno dei serial sopra inseriti funziona..."Oh Pincopall e che ci tiri i bidoni!? " ..nono, abbiate un secondino di pazienza,una volta che avrete inserito i serial che avete scovato,vedrete abilitarsi il pulsante "Avvio Installazione", ma non accadrà niente alla pressione di questo,se nonchè il Sice ripoppa, e vediamo questa volta, che a essere confrontate sono le prima parti del serial.
La prima parte del nostro serial viene confrontata con valori fissi, 01, 02, 03 ecc..bhè vediamo che succede invertendo il flag del salto all'offset 0F00D9FD se la prima parte è 03, ed il serial immesso da noi ha la ultima parte ricavata già usado lo 03, mmm..installa MArinari Totocalcio, e se invece la prima parte fosse "04"? ovvio...verrà installato Marinari Totogol, e così via..eccerto che i seriali da noi immessi prima nn funzionavano, avevamo messo kome prima cifra 22!, e il prog al massimo arriva fino a 06...ok, questa era l'ultima cosa da sapere sul serial.

Vediamo ora il bug di cui vi ho accennato poco sopra: se io voglio installare il numero 2, ovvero Super Enalotto, ovviamente, da quello che sappiamo sul serial, la prima cifra di quest'ultimo dovrà essere "02", in realtà non è così, se mettiamo "02" il programma installa il Lotto Light, ovvero il programma che si installa già completo senza serial, e che dovrebbe partire con un "01" , cosa che infatti fà=), ergo il problema è che risulta impossibile, se non tramite la modifica a runtime che andremo a fare, installare il Marinari SuperEnalotto.
Dunque via, mettiamo un serial esatto che inizi con 02, e ovviamente mettiamo sempre il vecchio bpx 0F00D9EB che questa volta ci servirà per beccare il momento in cui il programma controlla quale sia il valore della prima parte del seriale. Così, dopo aver premuto quattro volte F5, ci arriviamo, continuiamo a steppare con F10 ed a fargli eseguire tutti i jmp che deve senza modificare niente, il serial infatti è giusto=), noi dobbiamo solo andare a modificare la stringa che verrà pushata prima di una qualche call in cui è contenuto il nome del file da far partire ( sarà intuitivamente o setup.exe o qualkosa di simile ) ed ovviamente dir e sottodir in cui è contenuto questo file.
Dopo poco arriveremo quì, guardate, dopo aver in un secondo tempo disassemblato il file, cosa viene pushato prima della call __vbastrcat:

* Reference To: MSVBVM50.__vbaFreeObjList, Ord:0000h
                                  |
:0040816D FF1514D24000       Call dword ptr [0040D214]
:00408173 83C40C             add esp, 0000000C
:00408176 0FBF850CFEFFFF     movsx eax, word ptr [ebp+FFFFFE0C]
:0040817D 85C0               test eax, eax
:0040817F 7447               je 004081C8  <--- questo salto non salta
:00408181 C745FC20000000     mov [ebp-04], 00000020
:00408188 8B4DD8             mov ecx, dword ptr [ebp-28]
:0040818B 51                 push ecx

* Possible StringData Ref from Code Obj ->"Demo\Lotto Statistica\Setup.exe"
                                  |
:0040818C 685C6B4000         push 00406B5C  -- Bhè si vede cosa viene pushato no?=) 

* Reference To: MSVBVM50.__vbaStrCat, Ord:0000h
                                  |
:00408191 FF1520D24000       Call dword ptr [0040D220]
:00408197 8985B4FEFFFF       mov dword ptr [ebp+FFFFFEB4], eax

Ovviamente è quella la stringa da cambiare a runtime, certo la si potrebbe anche cambiare usando un editor esadecimale, ma dopo non riuscireste a reinstallare Lotto Light no? , ergo la si cambia a runtime, arrivando sopra quel push, facendo un "dd 406B5C" e cambiando i byte rappresentanti la stringa L.o.t.t.o. .S.t.a.t.i.s.t.i.c.a. con S.u.p.e.r. .E.n.a.l.o.t.t.o. ed ovviamente avvicinando la parte del .\.S.e.t.u.p...e.x.e. di un byte.
A questo punto togliete il breakpoint e verrà avviata la installazione del Marinari Super Enalotto =).

Bene, ora possiamo installare tutto, certo però che ogni volta che vogliamo installare uno di stì prog ci tocca vedere il serial esatto da SoftIce....vediamo come far allora per fargli accettare qualunque serial, ovviamente mantenendo sempre la prima parte del serial alla "vecchia maniera" =).
Naaa..mica vorrete patchare la msvbvm50.dll, troppo alta la probabilità che i bytes che andremo a patchare vengano utilizzati in altro modo da altri programmi, meglio andare sul sicuro e patchare direttamente il Setup.exe..vediamo come...
Supponiamo di aver inserito un serial sbagliato, il salto seguente il confronto dei serial non salterà ed eax, che risulterebbe zero se il serial fosse esatto, subirà due cambiamenti:


:0F00D9FF 1BC0       sbb eax, eax
:0F00DA01 83D8FF     sbb eax, FFFFFFFF
* Referenced by a (C)onditional Jump at Address:
|:0F00D9FD(C)
|
:0F00DA04 5F         pop edi
:0F00DA05 5E         pop esi
:0F00DA06 C20C00     ret 000C

Istruzioni che ci porterebbero ad avere un eax=FFFFFFFF, anche il salto successivo alla call a cui ci riporta il ret 000C non salta, ma di quello poco ci importa, arriviamo ad un nuovo ret ed ecco che piombiamo nel codice di setup.exe alla fine di una chiamata __vbastrcmp, se avete letto il mio tutorial su Engenius 4.0.1 vi ricorderete che ho menzionato dei metodi ritenuti QUASI universali per trovare il luogo di comparazione dei due seriali nei programmi scritti in Visual Basic sempre che questi usassero solo, per "proteggersi", msvbvm50.dll o msvbvm60.dll, e vi ho in quella occasione accennato al trucco del bpx __vbastrcat per i prog scritti in VB6, bene, il bpx __vbastrcmp è uno dei "trucchi" per i prog scritti in VB5, certo è che si deve anche vedere quale sia la call __vbastrcmp che serve a noi, comunque, ecco dove si arriva:


* Reference To: MSVBVM50.__vbaStrCmp, Ord:0000h
                                  |
:0040BD4E FF1594D24000            Call dword ptr [0040D294]
:0040BD54 F7D8                    neg eax      --- mmm modifica ancora
:0040BD56 1BC0                    sbb eax, eax --- eax, se eax fosse 0
:0040BD58 F7D8                    neg eax      --- queste operazioni non
:0040BD5A F7D8                    neg eax      --- avrebbero conseguenze ..
:0040BD5C 668945B0                mov word ptr [ebp-50], ax
:0040BD60 8D4DD4                  lea ecx, dword ptr [ebp-2C]

* Reference To: MSVBVM50.__vbaFreeStr, Ord:0000h
                                  |
:0040BD63 FF1598D34000            Call dword ptr [0040D398]
:0040BD69 0FBF55B0                movsx edx, word ptr [ebp-50]
:0040BD6D 85D2                    test edx, edx          --- e se eax prima era 0 
:0040BD6F 7412                    je 0040BD83            --- questo salta, altrimenti 
:0040BD71 C745FC0B000000          mov [ebp-04], 0000000B --- si continua
:0040BD78 66C70534C040000000      mov word ptr [0040C034], 0000
:0040BD81 EB10                    jmp 0040BD93           --- e si finisce male 

Dunque se si finisce bene o male dipende dal valore di eax, se è zero è tutto ok, sennò no, bene, se il serial è sbagliato arriviamo con un eax diverso da 0 in setup.exe, unica soluzione è quindi il cambiare il primo "neg eax" in un "xor eax,eax" e quindi cambiamo l'opcode da F7D8 in 33C0 , è per quello che ho lasciato in vista gli opcode =).
Bene, abbiamo finito, trovato il seriale, trovato e rimediato a un bug grosso kome una casa e trovato il modo di evitare di inserire ogni volta un serial diverso, che vi devo dire se non ...alla prossimaaa ed Evitate di fare i prog in VB5 se non volete che un Pincopall-ino qualunque ve li reversi :PPPP
Ciauzzz

Pincopall

Note finali

Bhè nelle note finali non inveirò ancora di + su chi ha codato il Byngo Setup, almeno i prog che vengono installati sono bellini, se funzionano? Bhè...spero di si, vedremo=)) o la prossima volta reverso loro ( i programmatori :PP).
Un saluto in primis al GENIO di cui ho parlato nell'intro con un amichevole "Pirla hai visto com'era difficile? " :P.
Bhè ovviamente un saluto a tutta la UIC ed a tutti i suoi members contando di vederne la maggior parte all'hackmeeting 2002 a BO.

Ciauzzzzzz


Disclaimer

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