Visual Dialog Script 3.0
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