* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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