* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Tutto cio' che viene qui descritto viene pubblicato solo per fini *
* didattici, il testo si rivolge quindi ai programmatori che intendono *
* proteggere in modo piu' sicuro i loro programmi. Io NON mi assumo quindi *
* alcuna responsabilita' per un uso illegale delle conoscenze qui acquisite *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
07/04/1999
Ciao, e' la prima volta che scrivo un tutorial e quindi potro' essere scorretto in alcuni
punti, portate pazienza e inviate gli insulti alla mia e-mail.
Benissimo, il tutorial si divide in 3 parti, nella prima trasformeremo la versione Demo di
Visual Dialog Script 3.0 in versione registrata e perfettamente funzionante, nella seconda
creeremo un decompilatore per gli eseguibili ottenuti, nella terza crackeremo un programma
scritto in Visual Dialog Script 3.0 (VDS da ora in poi).
==============================================================================
Target:
Visual Dialog Script 3.0 URL www.dialogscript.com
VSetup URL www.dialogscript.com
==============================================================================
Tools adoperati:
SOFTICE (poco e non indispensabile)
W32DASM (Per la prima parte)
PROCDUMP (Indispensabile)
RESTORATOR (o un resource editor/extractor)
ULTRAEDIT 5.0 (io di solito uso hiew ma in questo caso UE e' piu' comodo)
Un compilatore C (Pcc /BC 3.x/ Djgpp/ ecc..)
==============================================================================
Parte prima: Crackiamo VDS
Per prima cosa ci si procura il target scaricandolo da www.dialogscript.com si lancia il
programma, si va' a vedere se c'e' l'opzione per inserire il codice di registrazione,
mhhh! non c'e' nessuna opzione, ma come nella versione 2.5 lo lanciavi sotto softice,
un bel bpx getdlgitemtexta e ti trovavi il codice in chiaro con un bel d eax va be'
se ne saranno accorti che era troppo semplice, a questo punto si apre con il w32dasm,
e ops il codice non ha senso, gli diamo un occhiata con l'exeditor, troviamo una bella
scritta "compressed by petite", la moda di packare i file ha colpito anche quelli della
SADE, lanciamo il procdump, selezioniamo Unpack, petite2, e il nostro target vds.exe,
appena parte premiamo OK e lo salviamo con nome vdsdumped.exe (o come diavolo volete voi),
a questo punto apriamo vdsdumped con il w32dasm e vediamo un codice comprensibile con le sue
belle string reference, si scorrono e tadah!!!!!! fiato alle trombe, un riferimento ad una
famigerata VDS.KEY
"\Tools\*.lnk"
"\ul0 "
"\ul1 "
"\VarFileInfo\Translation"
"\VDS.HLP"
"\VDS.KEY" <--------- Troppo scontato come nome
"\VDSPREFS.DAT" se la chiamavano gocha.dll
"] [" avrei perso un paio di minuti in piu'
"] []"
ci clicchiamo sopra per vedere dove e' usata e piombiamo qui':
* Referenced by a CALL at Addresses:
|:0047C5F1 , :0047D596 , :0047F8A8 , :00495F7C <--Oh! oh! non mi dire :-)
|
:0048072C 55 push ebp
:0048072D 8BEC mov ebp, esp
:0048072F 81C494FDFFFF add esp, FFFFFD94
:00480735 53 push ebx
:00480736 56 push esi
:00480737 57 push edi
:00480738 33DB xor ebx, ebx
:0048073A 899D98FDFFFF mov dword ptr [ebp+FFFFFD98], ebx
:00480740 899D94FDFFFF mov dword ptr [ebp+FFFFFD94], ebx
:00480746 899DE8FEFFFF mov dword ptr [ebp+FFFFFEE8], ebx
:0048074C 8BD9 mov ebx, ecx
:0048074E 8BF2 mov esi, edx
:00480750 33C0 xor eax, eax
:00480752 55 push ebp
:00480753 68DD094800 push 004809DD
:00480758 64FF30 push dword ptr fs:[eax]
:0048075B 648920 mov dword ptr fs:[eax], esp
:0048075E 8D9598FDFFFF lea edx, dword ptr [ebp+FFFFFD98]
:00480764 B80A000000 mov eax, 0000000A
:00480769 E826DBFBFF call 0043E294
:0048076E 8B8D98FDFFFF mov ecx, dword ptr [ebp+FFFFFD98]
:00480774 8BC3 mov eax, ebx
:00480776 BAF4094800 mov edx, 004809F4
:0048077B E8C030F8FF call 00403840
:00480780 8D85E8FEFFFF lea eax, dword ptr [ebp+FFFFFEE8]
* Possible StringData Ref from Data Obj ->"\VDS.KEY" <-- la famigerata key
|
:00480786 B9000A4800 mov ecx, 00480A00
:0048078B 8B1594B74900 mov edx, dword ptr [0049B794]
:00480791 E8AA30F8FF call 00403840
Non ci tocchera mica creare un keymaker, noi cracker pigri odiamo queste cose, vediamo
le routine che chiamano la key
la prima si presenta cosi':
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047C582(C)
|
:0047C584 008D4000558B add byte ptr [ebp+8B550040], cl
:0047C58A EC in al, dx
* Possible StringData Ref from Data Obj ->"Version "
|
:0047C5A0 BA30C64700 mov edx, 0047C630
:0047C5A5 8D45FC lea eax, dword ptr [ebp-04]
:0047C5A8 E86771F8FF call 00403714
:0047C5AD 8D45FC lea eax, dword ptr [ebp-04]
* Possible StringData Ref from Data Obj ->"3.0"
|
:0047C5B0 8B15F8A14900 mov edx, dword ptr [0049A1F8]
[OMISSIS]
:0047C5EC A188B74900 mov eax, dword ptr [0049B788]
:0047C5F1 E836410000 call 0048072C <-- Eccola!
:0047C5F6 8B55FC mov edx, dword ptr [ebp-04]
:0047C5F9 8B83C8010000 mov eax, dword ptr [ebx+000001C8]
:0047C5FF E87C90F9FF call 00415680
:0047C604 33C0 xor eax, eax
:0047C606 5A pop edx
:0047C607 59 pop ecx
:0047C608 59 pop ecx
:0047C609 648910 mov dword ptr fs:[eax], edx
* Possible StringData Ref from Data Obj ->"_^[Y]"
|
:0047C60C 6821C64700 push 0047C621
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047C61F(U)
|
:0047C611 8D45FC lea eax, dword ptr [ebp-04]
:0047C614 E86770F8FF call 00403680
:0047C619 C3 ret
E' seguita da un ret e preceduta da version e 3.0, ummhh, sara' per l'about dei registrati.
L'altra routine che la chiama e' invece la seguente:
:0047D57F C7808C00000058004800 mov dword ptr [ebx+0000008C], 00480058
:0047D589 8D8D9CFEFFFF lea ecx, dword ptr [ebp+FFFFFE9C]
:0047D58F BA01000000 mov edx, 00000001
:0047D594 8BC3 mov eax, ebx
:0047D596 E891310000 call 0048072C <-- Ecco la call incriminata
:0047D59B 8B859CFEFFFF mov eax, dword ptr [ebp+FFFFFE9C]
* Possible StringData Ref from Data Obj ->"Y"
|
:0047D5A1 BA68D84700 mov edx, 0047D868
:0047D5A6 E85963F8FF call 00403904
:0047D5AB 744D je 0047D5FA <-- Ed ecco un bel salto condizionale
:0047D5AD 8D9598FEFFFF lea edx, dword ptr [ebp+FFFFFE98]
:0047D5B3 8BC3 mov eax, ebx
:0047D5B5 E89680F9FF call 00415650
Allora sono dei fessacchiotti alla SADE, hanno studiato mesi un nuovo sistema di
protezione, avranno consumato kilogrammi di cocaina per studiare come rigirare i
dati nel keyfile e poi LO CONTROLLANO CON 2 JE ed un JNE!!!!!!!!!!!!!!!!!!!!!!!!!!!
Be', cosa fare lo sapete, se non lo sapete siete veramente dei lamer e potete fare richiesta
di assunzione alla SADE vi prendono di sicuro.
Saro' buono, e visto che questo e' un tutorial a livello basso per beginner e vi svelero'
l'arcano, la Call 00403904 viene usata da molte latr routine del programma per confronti
vari, e quindi non e' modificabile, quindi non ci resta che modificare i salti condizionali
seguenti ai punti dove la Call viene usata per comparare la chiave, quindi in questo caso:
:0047D5AB 744D je 0047D5FA
Va cambiato in:
:0047D5AB 754D jne 0047D5FA
Tradotto in parole semplici"Se avete la chiave giusta siete cattivi ragazzi altrimenti se la
chiave non esiste bravi godetevi il nostro bel prg".
Quindi modificate anche:
:0047F8BA 742D je 0047F8E9
In:
:0047F8BA 752D jne 0047F8E9
E pure:
:00495F8E 7524 jne 00495FB4
In:
:00495F8E 7424 je 00495FB4
Per sapere la posizione nel file di queste locazioni, guardate nella riga in fondo di W32Dasm e
troverete un scritta cosi:
@Offset 009558Eh InFile: Vdsdump.exe
Aprite Vdsdump.exe con Hiew o con UltraEdit, andate alla posizione indicata (9558E) e li
troverete il vostro 75 da modificare in 74 o viceversa negli altri casi.
Adesso rinominate il file Vdsdump.exe in Vds.exe e sostituitelo all'originale.
A questo punto il VDS e' perfettamente funzionante, non ha ritardi alla partenza e genera
dei bellissimi .exe dai vostri script, l'unica pecca e' l'about dove rimane la bruttissima
scritta "UNREGISTERED DEMO" be' aprite vds.exe con l'exeditor e cambiate questa in "Crack by
TiN_MaN" non usate altri nomi o il prog non funzionera', anzi pieghera' il monitor e inviera'
via e-mail dei virus testuali ai vostri amici su Internet.
Certo sarebbe interessante cercare di capire come vengono messi i dati nel keyfile, ma non se
lo meritano proprio quelli della SADE tanto lavoro, eppure il VDS funziona veramente bene, genera
eseguibili di pochi kbyte, e la dll di runtime e' di soli 300 kbyte, e ci si possono fare di
bei programmini, Bah!
Non e' detto che comunque ci ritorni a studiare sopra, semmai faro' una seconda puntata.
Fine prima parte
==========================================================================
Seconda parte: Decompiliamo gli eseguibili
Dopo aver crackato VDS, ho installato il loro programma di complemento VSetup, un programma
per fare le installazioni dei vostri programmi scritti in VDS, carino, non ha niente da
invidiare ai vari InstallShield come grafica, e' semplice da configurare, e supporta diverse
lingue (a proposito io ho aggiunto l'Italiano se a qualcuno interessa mi richieda il file
italiano.vsl) anche questa e' una versione demo, che richiede quardate un po' il SERIALE, ma
non esultiamo troppo, il programma e' stato scritto con VDS, quindi W32DASM o IDA non ci
possono aiutare, e softice neanche, visto che non usa le chiamate dirette alle API ma passa
per la vdsrun30.dll come si fa' direte voi ?
Io a questo punto mi sono incarognito e ho detto "anche VSetup deve cadere!" ed ho iniziato
a progettare di scrivermi un decompilatore per gli eseguibili di VDS, per prima cosa ho preso
il decompilatore per la vecchia versione di VDS la 2.5 scritto da Supra dei Phrozen Crow e
ho cercato di disassemblarlo, ho perso una mezza giornata, lo aveva compresso con WWPACK+Xpack+
alcune modifiche manuali, comunque con TR del buon Liu TaoTao e e CUP386 sono riuscito a tirar
fuori un codice decompresso, bene, non avevo voglia di seguire tutto l'ASM di quel programma
per il momento e' ho iniziato a decompilare la vdsrun30.dll, mhh! una sola funzione esportata
'RunScript' questo al momento non mi ha aiutato, decido di traccaire un programma scritto in
VDS, creiamo Decomp1.dsc (i sorgenti di VDS si chiamano .dsc) lo compiliamo, il programma e'
una semplice form con un bel bottone "pippo" che premuto fa' apparire una dialog con "Hai
premuto Pippo!" (che fantasia) di nome decomp1.exe, apriamo l'exe con l'exeditor, per prima
cosa si nota che la scritta "Hai premuto Pippo!" non appare nell'eseguibila, ho pensato subito
che VDS comprimesse le risorse per occupare nemo spazio, allora reboot carica Softice, inizio
a tracciare lavorando di F8 e F10 cercando in memoria la stringa "hai premuto pippo!" ad un
certo punto vedo:
Kernel32!LoadResource
E poco dopo
Kernel32!FindResource
Da li' entro nella dll, e la ricerca in memoria della stringa "hai premuto Pippo!" diventa
positiva, Arghh! mi viene un forte sospetto, stoppo softice ed il mio programmino decomp1.exe,
apro il RESTORATOR e con esso carico decomp1.exe trovo una bella risorsa di nome SCRIPT nei
TEXT, la salvo in un file di nome SCRIPT.TXT e vado a dargli un'occhiata, vi riporto qui' sotto
il contenuto, e di seguito il file sorgente di decomp1.txt
SCRIPT.TXT
¼ùîö¢αÉùÉÉæ
╝╖┐┤▒╣α╜«╗┐¼╗╘▓¢ëα╝ùƒöæÖ╘╙╧╘╨╘╬╠╨╘╧╩╨
╝╖┐┤▒╣α┐╝╝╘╛½¼¼▒▓╘ÉùÉÉæ╘╦╚╘╚╩╘╘╘ÉùÉÉæ
╝╖┐┤▒╣α┐╝╝╘│╗▓½╘║ùö¢╘┌▒É¢Æ╘┌¡ƒè¢╘╙╘┌╗êùîä┐┤¼╒¿
╝╖┐┤▒╣α¡╕▒⌐
╞╗èöææÉ
ëƒùîα¢è¢Æî
Öæîæα└¢è¢Æî╪╫
╞ÉùÉÉæ╛½¼¼▒▓
ùÆÜæα╕ƒùαÉÄ¢ôïîæα░ùÉÉæ
Öæîæα¢èöææÉ
╞╜öæì¢
¢êùî
Decomp1.dsc
Title pippo
DIALOG CREATE,New Dialog,-1,0,240,160
DIALOG ADD,BUTTON,pippo,58,86,,,pippo
DIALOG ADD,MENU,File,&Open,&Save,-,&Exit|ALT+X
DIALOG SHOW
:Evloop
wait event
goto @event()
:pippoBUTTON
info Hai premuto Pippo
goto evloop
:Close
exit
DIAVOLO sono uguali, do' un'occhiata ai 2 file con ultraedit unsando l'opzione tile vertical e
passandoli tutti e 2 sull visualizzazione in HEX, i primi caratteri di
script.txt sono: AC 97 8C 94 9B E0
Di decomp1.dsc sono: 54 69 74 6C 65 20
Non notate niente ? -----------------------
Somma esadecimale: 100 100 100 100 100 100
Sono proprio dei babbi alla SADE, bastava una piccola crittazione a caratteri variabili con una
tabella, ed avrei perso almeno delle buone ore a decriptarla, no comment, praticamente fanno
100h-xxh per criptare e 100h-xxh per decriptare di sicuro hanno studiato mesi i sorgenti
dell RSA prima di arrivare a questa conclusione.
Ecco di seguito il sorgente C di un programmino per rimettere in chiaro il file SCRIPT.TXT
salvato da RESTORATOR il programma e' completamente commentato cosi' anche chi non conosce
il C puo' capire quanto bello sia questo linguaggio invece del solito Pascal (T3X questa non
era per te' o si? :-) )
==============================================================================
#include
#include
main(void) { //Inizio di main()
FILE *fp, *fp2; //Puntatori ai file
int c; //Variabile di buffer
if(!(fp=fopen("script.txt","rb"))) { //Apre il file
printf("\nImpossibilie aprire il file SCRIPT.TXT\n\n"); //Se non ci riesce avverte
exit(1); //e termima il prg con Error level 1
}
if(!(fp2=fopen("tinman.dsc","wb"))) {
printf("\nImpossibilie creare il file TINMAN.TXT\n\n");
exit(1);
}
while((c=fgetc(fp)) != EOF) { //Legge un carattere dal file SCRIPT.TXT e lo mette in c
//Inizio routine di decriptazione
if(c>224) fputc(c, fp2); //Se c e' maggiore di E0h la scrive senza modificarla
else if(c == 13) fputc('\n',fp2); //Se c e' uguale a 0Dh mette un ritorno a capo
else if(c<32) fputc(c, fp2); //Se c e' minore di 20h la scrive senza modificarla
else fputc((256-c),fp2); //Altrimenti sottrae c da 100h e la scrive
} //Fine routine di decriptazione
fclose(fp); //Chiude il file SCRIPT.TXT
fclose(fp2); //Chiude il file TINMAN.DSC
printf("\n\n\t FINITO \n\n"); //Scrive FINITO
return(0); //Ed esce
} //Fine di main()
=============================================================================
Il nostro decompilatore e' finito e perfettamente funzionante.
Certo avrei potuto estrarre la resource dal file PE, ma i tute sul PE di Kill3xx non sono
ancora usciti tutti, e come ho detto prima quelli della SADE non se lo meritano tanto lavoro,
un buon resource editor ed il lavor e' fatto.
=============================================================================
Parte terza: Finalmente crackiamo VSetup
Allora per prima cosa osserviamo VSetup, e ritroviamo la solita scritta "Compressed by Petite",
solita procedura apriamo procdump, selezioniamo Unpack, petite2, e il file VSetup.exe, apriamo
il file dumpato da procdump con restorator e salviamo il solito file SCRIPT.TXT, lo passiamo
nel nostro bel decompilatore (e decriptatore che forse e' piu' giusto) lo apriamo e vediamo
che confronta all'inizio il risultato della routine serial con OK, cerchiamo allora la
label :serial (hanno molta fantasia quelli della SADE) eccola qui' sotto:
:serial
%A = @regread(LOCAL,SOFTWARE\SADE\Vsetup,User) #Cerca il nome nel registry
IF @NULL(%A)
%A = Unregistered user
REGISTRY WRITE,LOCAL,Software\SADE\Vsetup,User,%A
END
%B = @pos(a,%A)
%C = @pos(e,%A)
%D = @pos(i,%A)
%E = @pos(o,%A)
%F = @pos(u,%A)
%B = @sum(%B,%C,%D,%E,%F)
%C = @fmul(%B,5) #Se lo rigira un po'
%F = @regread(LOCAL,SOFTWARE\SADE\Vsetup,Key) #Cerca la key di VDS oh no!
%C = @sum(%C,%F) #Noi non l'abbiamo
%D = @sum(%C,%B)
%E = @LEN(%A)
%A = @fmul(%D,%E)
%C = @fmul(%E,%C)
%D = @Fmul(%B,%C)
%A = %A-%C-%D
%B = @regread(LOCAL,SOFTWARE\SADE\Vsetup,Licence)
LIST create,1
list add,1,%B
IF @match(1,%A) #Confronta il risultato con la key di VDS
%A = OK #Se giusto ritorna OK
ELSE
%A = #Altrimenti bad guy stringa nulla paga e poi lo usi
END
LIST CLOSE,1
EXIT
Come si fa' ?????????????
Noi non abbiamo la key!!!!!!!!
Tranquilli il buon TiN_MaN vi viene in aiuto, fate questa poderosa modifica al codice e
ricompilate il sorgente.
IF @match(1,%A) #Confronta il risultato con la key di VDS
%A = OK #Se giusto ritorna OK
ELSE
%A = OK #Se sbagliato ritorna sempre OK :-)
END
Ecco a voi VSetup perfettamente registrato e funzionante.
========================================================================
Ecco il mio primo tutorial e' finito, ho scritto per 2 ore, ho ascoltato 3 CD:
AMERICA-Hystory (Greatest hits) (che contiene appunto la mitica "Tinman" :-) )
Supertramp-The best of Supertramp
Meat Loaf-THe hell on the hill
Un ringraziamento doveroso a:
Ringzer0 per il loro bellissimo sito
KIll3xx Per l'incoraggiamento a fare questo lavoro e per i tute sul PE (e per il disclaimer)
Tutto il canale Crack-it per la simpatia e la competenza
Frog_s_print per avermi iniziato al Reverse E.
A Fravia per il suo sito un Must!
A Iczelion per il corso di w32asm
Alla SADE per essere cosi' babbi
A Sir Clive Sinclair per lo ZX81
ALla M$ per aver fatti il W98 Beta 3 che e' molto piu' stabile del definitivo.
TiN_MaN
mailto:tinman@thepentagon.com