Multimedia Builder from v4.7 to v4.9.0.1
How to "Smanet" ;-)


18/09/2000 +
Addendum 07/07/2003

by "Pincopall"

 

 

UIC's Home Page

Published by Quequero


Ma secondo voi poppa meglio SoftIce 3, SoftIce 4.05.....

Bravo pinco, sei proprio il migliore :pp ghghghgh
Addendum: pincoide tanto che facevi l'addendum non potevi mettere il tute nel nuovo form e riformattarlo? :pppp

.......o Pamela Anderson?? ;-)
UIC's form
http://pincopall.has.it
E-mail: [email protected]
canale IRC: #crack-it #hackit99
UIC's form

Difficoltà

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

 

Bene, questa è (anzi era :-) ) una trial a tempo di cui noi troveremo il serial esatto ai fini della registrazione, ma oltre a reversare oggi smanetteremo anche un pò ;-) .


Multimedia Builder from v4.7 to v4.9.0.1

Written by Pincopall

Introduzione

Dunque, come già detto questa era una trial a scadenza 30 giorni che per ritenersi registrata aveva bisogno di un nome e di un seriale, dove quest'ultimo era fisso e non dipendeva affatto dal nome, se non veniva registrata, oltre a scadere, ogni volta che si faceva una applicazione con questo programma e la si faceva correre, ecco che la trial ci infilava sotto la stringa "Created with an unregistered version of Multimedia Builder".

Tools usati

SoftIce 4
Hex WorkShop 3.0
WDasm 8.93

URL o FTP del programma

www.maediachance.com
mmbuilder.hypermart.net

Notizie sul programma

Bueno, questo è un programma che permette di creare delle applicazioni quali ad esempio lettori di MP3 senza bisogno di saper programmare, ho già detto sopra quello che fà alle suddette applicazioni se non si ritiene registrato.

Essay

Ok boys, come on !!!

Alula, apriamo il programma e vediamo che non ci dice niente riguardo alla sua registrazione od alla sua scadenza, in quanto questo ve lo dovevate leggere nel file Readme alla fine dell'installazione, bene, allora andiamo a cercarci il nostro box di registrazione, e lo troviamo, ma và? , nel menù "Help" ovviamente sotto "about", e vediamo che nel box riservato al nostro nome c'è il nome "Unregistered" (brutto nome eh?!) ed al posto della password nostra ci sono un mukkio di asterischi che altro non crittano che la scritta "Invalid code" (..brutta anche la password vero?! ). Bene, allora mettiamo il nostro nome "Pincopall" e la nostra password "11223344", clikkiamo su ok ed ecco appare il primo messaggio di errore : " Please enter the neme exactly as it is stated in the registration e-mail you received" hmmmm allora intanto c'è qualche problema nel modo in cui ho scritto il nome, bene, allora apro WDasm e mi vado a cercare la suddetta stringa, ed ecco qui cosa mi trovo:


:004A1469 8D755C                  lea esi, dword ptr [ebp+5C]

* Possible StringData Ref from Data Obj ->"@"
                                  |
:004A146C 681CA45D00              push 005DA41C
:004A1471 8BCE                    mov ecx, esi
:004A1473 E8A6C60A00              call 0054DB1E     ------- Determina il valore di eax 
:004A1478 83F8FF                  cmp eax, FFFFFFFF ------- Confronta eax con FFFFFFFF 
:004A147B 7521                    jne 004A149E      ------- Se non è uguale non da   
:004A147D 6A00                    push 00000000             il messaggio d'errore 
:004A147F 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"Please enter the Name exactly "
                                        ->"as it is stated"
                                  |
:004A1481 68BCC05D00              push 005DC0BC
:004A1486 E828C90B00              call 0055DDB3
:004A148B 8B4C2424                mov ecx, dword ptr [esp+24]
:004A148F 64890D00000000          mov dword ptr fs:[00000000], ecx
:004A1496 5F                      pop edi
:004A1497 5E                      pop esi
:004A1498 5D                      pop ebp
:004A1499 5B                      pop ebx
:004A149A 83C420                  add esp, 00000020
:004A149D C3                      ret



* Jump at Address:
|:004A147B(C)
|
:004A149E A17CAF5E00              mov eax, dword ptr [005EAF7C]
:004A14A3 89442414                mov dword ptr [esp+14], eax 

........


Bene, come vedete per far saltare questa protezione basterebbe trasformare in jump incondizionato quel jne all'indirizzo 004A147B, ma perkè prenderci un tale disturbo quando abbiamo a portata di mano la soluzione?? ebbene, se vedete io ho trascritto la parte dove c'è il riferimento alla stringa "@" proprio perchè basta che nel nostro nome ci sia la @ (40h) perkè il programma non ci dia quel messaggio, ne possiamo così dedurre che il nostro nome deve essere chessò tipo una e-mail, e quindi ora scrivo nel box del nome "[email protected]" dove "gipoco.com" è un provider completamente inventato al quale ho dato il nome di un mio amico (che saluto: ciaciauzzz ;-)) e ora con questo nome vedo che non mi da più il problema del nome, anche se su di esso poi fa successivi controlli..ma ora mi devo preoccupare del fatto che se anche il nome è scritto nella maniera giusta, mi dice che la password è errata, bene, vediamo dunque di imbroccare la password o meglio di calcolarcela, allora, facciamo riferimento anche stavolta al WDasm, e vediamo che quando ci fa vedere la stringa "The reg. code is invalid", svolge queste azioni:

..........


004A158D E89E000000              call 004A1630 -----Determina il valore di eax 
:004A1592 85C0                    test eax, eax  ------ confronta eax.... 
:004A1594 7524                    jne 004A15BA          e se è zero da il messaggio 
:004A1596 50                      push eax              d'errore 
:004A1597 50                      push eax

* Possible StringData Ref from Data Obj ->"The reg. code is invalid."
                                  |
:004A1598 688CC05D00              push 005DC08C
:004A159D E811C80B00              call 0055DDB3

* Possible StringData Ref from Data Obj ->"Unregistred"
                                  |
:004A15A2 68C4A05D00              push 005DA0C4
:004A15A7 8BCE                    mov ecx, esi
:004A15A9 E8A3420B00              call 00555851

* Possible StringData Ref from Data Obj ->"Invalid Code"
                                  |
:004A15AE 687CC05D00              push 005DC07C

Bien, come vedete al messaggio di errore ci salta se eax=eax , infatti se sono diverse entra in funzione quel jne che mi fa andare il programma da un'altra parte, come vedete sopra quel test eax, eax c'è una call, e qualcosa mi dice che è proprio quella che determina il valore di eax, andiamo dunque ad esaminarla, e questa volta usiamo il SoftIce che ci torna di gran lunga meglio, mettiamo dunque un bpx su 004A158D, e dopo aver rimesso nome e codice premiamo OK, ed ecco che salta fuori il nostro bel debuggerino, entriamo dunque nella call con F8 ed ecco ciò che vediamo una pappardella di call e sottocall che non finisce più, eeeeeeh ma noi lo sappiamo cosa ci interessa davvero no? Eggià proprio quella, andiamo dunque a vederla , come dite ?? non sapete che cosa è "quella" , bene,(ma allora prima ki ha risposto?) è la fine, dobbiamo infatti vedere dove prima della fine modifica il contenuto di eax, e soprattutto perkè lo modifica, eccoci dunque alla fine, anzi, come vedete alla due fini possibili :

:004A17BA C7442418FFFFFFFF        mov [esp+18], FFFFFFFF
:004A17C2 E8013F0B00              call 005556C8

* Possible Ref to Menu: MenuID_0075, Item: "Close"
                                  |
:004A17C7 B801000000              mov eax, 00000001
:004A17CC 8B4C2410                mov ecx, dword ptr [esp+10]
:004A17D0 64890D00000000          mov dword ptr fs:[00000000], ecx
:004A17D7 83C41C                  add esp, 0000001C
:004A17DA C20800                  ret 0008



Jump at Address:004A1793(C)
|
:004A17DD E8E63E0B00              call 005556C8
:004A17E2 8D4C2404                lea ecx, dword ptr [esp+04]
:004A17E6 C644241801              mov [esp+18], 01
:004A17EB E8D83E0B00              call 005556C8
:004A17F0 8D4C2420                lea ecx, dword ptr [esp+20]
:004A17F4 C644241800              mov [esp+18], 00
:004A17F9 E8CA3E0B00              call 005556C8
:004A17FE 8D4C2424                lea ecx, dword ptr [esp+24]
:004A1802 C7442418FFFFFFFF        mov [esp+18], FFFFFFFF
:004A180A E8B93E0B00              call 005556C8
:004A180F 8B4C2410                mov ecx, dword ptr [esp+10]
:004A1813 33C0                    xor eax, eax
:004A1815 64890D00000000          mov dword ptr fs:[00000000], ecx
:004A181C 83C41C                  add esp, 0000001C
:004A181F C20800                  ret 0008

Dunque, come vedete nella prima fine, viene mosso in eax il valore 1, e quindi il famoso salto di cui si parlava prima salta sempre, altrimenti, nella seconda fine, si ha uno xor eax, eax che mi riazzera eax e che quindi, non facendomi saltare la funzione all'indirizzo 004A1594 mi fa andare alla beggar off, come vediamo inoltre questa seconda fine, che ci fa andare all'errore, si ha se viene fatta saltare la funzione all'indirizzo 004A1793, bene, andiamo dunque a vederci questo saltino:

:004A1785 5F                      pop edi
:004A1786 3BF5                    cmp esi, ebp
:004A1788 5E                      pop esi
:004A1789 5D                      pop ebp
:004A178A C644241803              mov [esp+18], 03
:004A178F 8D4C2400                lea ecx, dword ptr [esp]
:004A1793 7548                    jne 004A17DD
:004A1795 E82E3F0B00              call 005556C8

Bene allora, eccolo lì il nostro saltino, come potete vedere esso salta se esi è diverso da ebp, bene, ora, dato che siamo sempre nel debugger, togliamo tutti i breakpoint (bc*) e settiamone uno a 004a1785, usciamo dal SoftIce, e rifacciamo tutta la procedura di registrazione daccapo, e come clikkiamo su OK, ecco che salta fuori il SIce che ha proprio ghiacciato il programma a quell'adress, bene, ora steppiamo una volta con F10 e mettiamoci sul cmp, esaminiamo dunque esi ed ebp, dunque esi contiene il valore esadecimale F3, corrispondente a 243 decimale, mentre ebp contiene il valore 14Bh corrispondente a 331, ora: F3h non è altro che la somma dei primi tre valori del nostro codice (che deve avere forma 1-***-***) e dei valori in esadecimale della stringa "1-" che veniva aggiunta alla stringa del codice all'indirizzo 004A1731, dunque, perkè il seriale ci venga considerato valido, i primi tre asteriski devono contenere dei caratteri i cui valori esadecimali sommati tra loro più 5E (valore della somma in valore esadecimale dei caratteri "1-") dia 14B, dunque facendo una rapida sottrazione la somma in esadecimale di questi tre caratteri deve essere 14B-(meno)5E ovvero ED (237 in decimale), tavole ascii alla mano troviammo che questi tre caratteri possono essere per esempio QOM oppure PPM ed altri ancora, dunque per ora il nostro codice ha questa fisionomia 1-QOM-***, rimangono i tre ultimi asteriski ed il loro valore, sorpresa, non è altro che 331, ovvero il valore decimale della somma dei caratteri "Q","O","M","1","-".

C'è però da notare una cosa, se noi mettiamo questo serial il programma non ci darà noie per quanto riguarda la sua validità ma riporterà sempre la stringa "Created with ecc..." sia a runtime che nell'exe compilato.
Se invece noi mettiamo, al posto di QOM una stringa di 6 cifre la cui somma dei valori decimali ,unita alla somma dei valori decimali di "1-", è pari a 331 il programma non solo non dà noie per quanto riguarda il codice, ma neppure mette più la stringa =),già ma, come fare a trovarsi queste 6 cifre? Bhè, guardando nel codice che vi riporterò fra poco, noterete che il programma sottrae ad un valore esadecimale predefinito, ovvero 438CA, la somma dei valori esadecimali dei caratteri del nostro nome, e la differenza ottenuta, riportata in base dieci, è proprio la stringa i sei cifre che ci serve=).

Bene, ma vediamo se lasciamo QOM cosa succede: nonostante ora non dia più nessun messaggio di errore per quanto concerne la registrazione, quando avviamo una applicazione fatta con questo programma, eccola lì che appare la maledetta stringa "Created with ecc...." "bene" ,direte, "Andiamo a cercare la stringa col WDasm e vediamo perkè ce la scrive" ma: "Ciccia", vi dirò io, "la stringa nel WDasm nun ce la trovate, e manco nell'IDA porca troia !!" scusate lo scatto d'ira, ma quella stringa lì mi ha fatto sudare 7 camicie (tanto le lava la mamma eh eh eh) l'unico modo in cui sono riuscito a trovarla è stata facendo s 0 l fffffffff 'Created' nel SIce, allora si che è venuta fuori la stronza, così mi sono segnato dove era che era contenuta ed ho messo un bpm su quell'indirizzo (che cambiava sempre) ma, inculata, mi faceva vedere che la usava solo nel processo di creazione della finestra, e mica potevo noppare quella call che sennò mi andava tutto in crash, così ho messo un bpx hmemcpy, ovviamente dopo avere tolto tutti gli altri bp, ed ho clikkato su "run", ed il mio bravo SIce ha poppato ed allora, dopo aver premuto F12 per 7 volte ho ricercato la stringa "Created" ed ho constatato che anche stavolta tutta la stringa "Created with ecc..." era ad un altro indirizzo, poi ho messo, dopo aver tolto il bpx hmemcpy un bel bpm a quell'indirizzo, ed ecco, subito dopo aver premuto F5, SIce rifà la sua comparsa nel momento in cui nella finestra stà per apparire la stringa, e così step by step arriviamo qui:


:004B2F67 50                      push eax
:004B2F68 8BCE                    mov ecx, esi
:004B2F6A E821FBFFFF              call 004B2A90
:004B2F6F 8B00                    mov eax, dword ptr [eax]
:004B2F71 8B542444                mov edx, dword ptr [esp+44]
:004B2F75 6A25                    push 00000025
:004B2F77 53                      push ebx
:004B2F78 8B48F8                  mov ecx, dword ptr [eax-08]
:004B2F7B C684249400000004        mov byte ptr [esp+00000094], 04
:004B2F83 51                      push ecx
:004B2F84 50                      push eax
:004B2F85 8D4C2454                lea ecx, dword ptr [esp+54]
:004B2F89 FF5268                  call [edx+68] 

Ora, vediamo che dopo la chiamata all'indirizzo 004B2F68, in eax viene spostata la stringa dell'errore, che poi, con quel push eax e con la chiamata seguente viene definitivamente messa nella finestra, se premiamo F8 su quella call ci entriamo e la esaminiamo nel pezzo che ci interessa:

:004B2AD8 BB01000000              mov ebx, 00000001
:004B2ADD 3970F8                  cmp dword ptr [eax-08], esi
:004B2AE0 7E4F                    jle 004B2B31

 Jump at Address:004B2B2F(C)
|
:004B2AE2 8B0D7CAF5E00            mov ecx, dword ptr [005EAF7C]
:004B2AE8 894C240C                mov dword ptr [esp+0C], ecx
:004B2AEC 8A0406                  mov al, byte ptr [esi+eax]
:004B2AEF 8D4C240C                lea ecx, dword ptr [esp+0C]
:004B2AF3 2AC3                    sub al, bl
:004B2AF5 C644241C03              mov [esp+1C], 03
:004B2AFA 50                      push eax
:004B2AFB E8D8AD0900              call 0054D8D8
:004B2B00 8D54240C                lea edx, dword ptr [esp+0C]
:004B2B04 8D4C2408                lea ecx, dword ptr [esp+08]
:004B2B08 52                      push edx
:004B2B09 E8D22F0A00              call 00555AE0
:004B2B0E 43                      inc ebx
:004B2B0F 83FB05                  cmp ebx, 00000005
:004B2B12 7E05                    jle 004B2B19

* Possible Ref to Menu: MenuID_0075, Item: "Close"
                                  |
:004B2B14 BB01000000              mov ebx, 00000001

 Jump at Address:004B2B12(C)
|
:004B2B19 8D4C240C                lea ecx, dword ptr [esp+0C]
:004B2B1D C644241C02              mov [esp+1C], 02
:004B2B22 E8A12B0A00              call 005556C8
:004B2B27 8B442428                mov eax, dword ptr [esp+28]
:004B2B2B 46                      inc esi
:004B2B2C 3B70F8                  cmp esi, dword ptr [eax-08] ---quando sono uguali 
:004B2B2F 7CB1                    jl 004B2AE2                    finisce il ciclo 

 Jump at Address:004B2AE0(C)
|
:004B2B31 8D4C2408                lea ecx, dword ptr [esp+08]
:004B2B35 E8FB300A00              call 00555C35   --qui la stringa viene ribaltata 
:004B2B3A 8B742424                mov esi, dword ptr [esp+24] 
:004B2B3E 8D442408                lea eax, dword ptr [esp+08]
:004B2B42 50                      push eax 

Bene, questa è la parte che ci interessa in quanto nel ciclo che va dall'indirizzo 004B2AE2 all'indirizzo 004B2B2F e che finisce quando esi = al contenuto di eax-08 che è 39, la stringa che era stata pushata all'indirizzo 004B2E5B e che era senza senso, viene modificata in modo da farla diventare la stringa "redliuB aidemitluM fo noiserv deretsigernu htiw detaerC" che viene poi capovolta dalla call all'indirizzo 004B2B35 che la fa diventare : indovinate un po' che stringa!?!, bene, dunque la soluzione sta nel non far pushare la prima stringa senza senso nello stack "E come si fa ? ", direte voi, guardate un po' cosa c'è prima di quel push:

:004B2E41    cmp dword ptr [esi+00000390], 000438CA   -- vi ho parlato 
                                                         sopra di come viene usata 438CA

:004B2E4B    je 004B2FDC
:004B2E51    mov edx, dword ptr [005EAF7C]
:004B2E57    mov dword ptr [esp+10], edx

* Possible StringData Ref from Data Obj ->"!thhqjwE$fjfhqnunxQ%gq#rtjuui{!fhvjuulkjspx$mu"
                                        ->"kz$ifvdiwD""
                                  |
:004B2E5B    push 005E10D4
:004B2E60    lea ecx, dword ptr [esp+14]
:004B2E64    mov byte ptr [esp+00000090], 02 

Eggià, proprio quel bel je lì che se salta mi evita che venga fuori la maledetta stringa, dunque ci resta solo da aprire il nostro editor esadecimale e sostituire quel 0F848B010000 con un bel 0F85B010000 di modo che salti sempre, ora come vedrete la stringa non compare più.

Come dite? Ah la protezione a tempo? Bhè quella se ne è andata una volta messo il codice giusto, al contrario di quella stringa zoccola qui sopra, cmq se non vi fidate, queste sono le cosucce da cambiare: all'indirizzo 0041B5A3 al posto di 7D06 (un jge) mettere un 9090 (nop); all'indirizzo 004FA6F2 al posto di 7D12 (un jge) mettere un 9090 (nop); all'indirizzo 00508EDD al posto di 7D0F (un jge) mettere un 9090 (che sara??).

Bueno,ci vediamo, se volete dirmi che sono un genio, o sevolete darmi del coglione, ma soprattutto se volete rispondere alla domanda che ho posto prima dove il titolo, la mia e-mail la conoscete, alla prossima.



Addendum 07/07/2003

Rieccoci quà per un addendum a quasi 3 anni dall'aver trattato per la prima volta il Multimedia Builder, ma perchè riaprire questo capitolo? Bhè...perchè è uscita una versiona nuova del nostro programma che ha qualcosa di diverso dalle precedenti, mi riferisco alla versione 4.9.0.1, e ringrazio _Jalouse_ per avermelo detto =).
Questa nuova versione richiede infatti 2 seriali, uno per essere registrata e togliere dalle applicazioni che si creano quella fastidiosa barra gialla di cui abbiamo parlato tempo addietro, e un altro seriale per permetterci di caricare gli mp3, cosa che nelle versioni precedenti si poteva fare tranquillamente senza dover pagare qualcosa in più.
In questa versione infatti se non si inserisce il secondo serial, anche se noi creiamo una applicazione partendo dal Template del lettore MP3 succederanno 2 cose:

1) Facendo "Run" il programma il lettore MP3 da noi creato partirà tranquillamente, ma, quando caricheremo un .mp3, ci apparirà una dialog che ci informerà che per ora possiamo aprire l'mp3, ma che la Thomson Multimedia, proprietaria delle "Mp3 patents", vuole più soldi se si vuole continuare ad aprire gli mp3 anche una volta che il programma da noi fatto con il MMB viene reso a se stante tramite il "Compile". Bhè la msg box in questione la si può far scomparire per sempre tranquillamente, basta smarcare la casella "Don't show this message again" :-P si ma ciò non toglie che, una volta compilato il nostro lettore MP3, noi non potremo aprire i formati .mpg, .mp1, .mp2 e .mp3, infatti...

2) Una volta compilato il nostro lettore mp3, quando lo apriamo e clikkiamo su open per ascoltare una canzone, vediamo che i "Supported song Types" sono .ogg, .wma, .asf e non più .ogg, .wma, .asf, .mpg, .mp1, .mp2 e .mp3 come nel lettore MP3 prima che venisse compilato =/

Argh..dobbiamo trovare un rimedio...in altre parole, si reversa anche oggi =)

OTTIMA NOTIZIA: il primo serial viene calcolato nello stesso modo che nelle precedenti versioni e per arrivare alla routine di check si fanno le stesse operazioni che abbiamo visto qualche tempo fa e che potete trovare qualche riga sopra.
Veniamo invece alla novità, il serial per poter utilizzare gli mp3, mmmh vediamo che qua, anche se mettiamo un serial errato non ci da message box di errore o simili, e ci accorgiamo se il seriale da noi inserito era esatto o no solo dopo aver compilato il lettore MP3.
Bhè potremmo provare con un bpx Getwindowtexta, in fondo, il contenuto dell'edit box "Mp3 Serial" lo leggerà, e qualcosa ci farà, ok questo è un metodo...ma, se lo utilizziamo, ci rendiamo presto conto che la faccenda diventa lunga, intanto la getwindowtexta viene richiamata 3 volte dopo il click del pulsante OK, e questo è ovvio, il serial nel 3° box lo legge per terzo =), per cui si fa presto ad arrivare alla getwindowtexta che ci interessa, basta premere 3 volte F5 dal SoftIce, ma anche in questo caso ci ritroviamo in un giungla di call...ufff...vediamo se si può fare più velocemente =)).
Si..si può fare prima =) come? continuate a leggere =).
Dunque, qual'è la differenza più lampante tra un lettore MP3 compilato avendo messo il MP3 serial esatto e quello compilato avendone messo uno ad cazzum? Bhè, che al posto della stringa "Supported song types (*.ogg, *.wma, *.asf)", c'è la stringa "Supported song types (*.mpg, *.mp1, *.mp2, *.mp3, *.ogg, *.wma, *.asf)", bene, e vi sembra roba da poco? =) proviamo a cercare queste stringhe nel disassemblato, ed eccole qua

 
:00401B3B    jne 00401B81
:00401B3D    call 00612196
:00401B42    mov eax, dword ptr [eax+04]
:00401B45    mov cl, byte ptr [eax+00000154]
:00401B4B    test cl, cl
:00401B4D    je 00401B68

* Possible Reference to String "Supported song types (*.mpg;*.mp1;*.mp2;*.mp3;*.ogg;*.wma;*."
                                  |
:00401B4F    push 000088CD
:00401B54    lea ecx, dword ptr [esp+18]
:00401B58    call 005F9611

* Possible StringData Ref from Data Obj ->"*.mp3"
                                  |
:00401B5D    push 006A93B8
:00401B62    lea ecx, dword ptr [esp+1C]
:00401B66    jmp 00401B8A

* Referenced by a Jump at Address:
|:00401B4D(C)

* Possible Ref to Menu: MenuID_0105, Item: "CBK_TimeSec   Audio,CD"
                                  |

* Possible Reference to String Resource ID=35027: "Supported song types (*.ogg;*.wma;*.asf)"
                                  |
:00401B68   push 000088D3
:00401B6D   lea ecx, dword ptr [esp+18]
:00401B71   call 005F9611

* Possible StringData Ref from Data Obj ->"*.ogg"
                                  |
:00401B76   push 006A93B0
:00401B7B   lea ecx, dword ptr [esp+1C]
:00401B7F   jmp 00401B8A


LE vedete? ok =) bene, vedete che il programma, mette nel lettore MP3 che si sta compilando la stringa "Supported song types (*.ogg;*.wma;*.asf)" solo se in cl c'è 0, ed in cl ci va quello che è contentuto in edi+00000154, no, nn fatevi inutili illusioni, invertendo quel je dopo il "test cl,cl" non si arriva a niente, proviamo invece a vedere se abbiamo un po' di fortuna, e cerchiamo nel listato "edi+00000154", nel caso non lo trovassimo dovremmo sciropparci tutto il percorso dopo la GetWindowtexta, e invece...TADAAAA:


:00427588      call 004273E0
:0042758D      mov ecx, dword ptr [esp+2C]
:00427591      add esp, 00000020
:00427594      cmp bl, byte ptr [ecx]
:00427596      jne 004275A6
:00427598      cmp al, byte ptr [ecx+03]
:0042759B      jne 004275A6
:0042759D      mov byte ptr [edi+00000154], 01 --- Eccolo =)
:004275A4      jmp 004275AD

* Referenced by a (C)onditional Jump at Addresses:
|:00427596(C), :0042759B(C)
|
:004275A6      mov byte ptr [edi+00000154], 00 --- E pure qua!


* Referenced by a (C)onditional Jump at Address:
|:004275A4(U)
|
:004275AD      lea ecx, dword ptr [esp+0C]
:004275B1      call 005F900E
:004275B6      lea ecx, dword ptr [esp+14]
:004275BA      mov [esp+2C], 01
:004275BF      call 005F900E


E guardate che bello, se un jump condizionato salta in edi+00000154 viene messo 0 e dal lettore MP3 compilato sarà impossibile ascoltare mp3, se non salta in edi+00000154 viene messo 1 e dal nostro lettore mp3 potremmo ascoltare quello che vogliamo alla faccia della Thomson Multimedia =)
Ok allora, vediamo da cosa dipende il fatto che in edi+154 ci vada 01 o 00, dipende da quei due compare poco sopra, mettendo un breakpoint su quegli offset, dopo aver messo il nostro dummy mp3 serial ed aver premuto OK, il SoftIce popperà, ma non sapremo cosa starà confrontado il programma, si certo bytes che derivano dal nostro serial, ma in che modo? andiamolo a vedere, e a capire.
Andando a ritroso nel codice, vediamo che al codice soprastante ci si arriva da


* Referenced by a CALL at Addresses:
|:00427777   , :004BF8D3   
|

* Possible Reference to Dialog: DialogID_00FF 
                                  |
:00427400 6AFF                    push FFFFFFFF

ed effettivamente, alla call 427400 all'indirizzo 4BF8D3 ci si arriva anche utilizzando il bpx Getwindowtexta ma dopo un iter ben più lungo, comunque, vediamo che il codice da anailzzare comincia all'offset 427400, un punto assai lontano dai compare a cui vogliamo arrivare, in effetti tutto il codice che si trova all'offset 427400 e seguenti, lavora si sul dummy serial da noi inserito, ma alla fine non serve a niente se non a farci capire che il serial deve essere di almeno 10 caratteri, non so se sia stato messo dai programmatori per depistare eventuali curiosi =) o se alla fine, il fatto che non serva a una emerita cippa, sia solo un errore, comunque, il tutto è a nostro favore, visto che noi siamo si dei curiosi, ma siamo curiosi che non si lasciano depistare dalla jungle di call che si trova tra 427400 e il nostro obiettivo =)).
Quindi, dopo aver analizzato il codice e aver visto che non serve a niente se non a capire il minimo numero di caratteri da cui può essere fatto il serial, arriviamo alla prima cosa interessante =), all'indirizzo 427555, ovvero qui:


:00427555       mov eax, dword ptr [esp+2C] --- Mette in eax, i primi 6 char del serial
:00427559       mov cl, byte ptr [eax+04]   --- Mette in cl il 5° char...
:0042755C       mov dl, byte ptr [eax+01]   --- ed in dl il 2°.
:0042755F       movsx eax, cl               --- Poi ne mette uno in eax...
:00427562       movsx ecx, dl               --- ed uno, il 2°, in ecx
:00427565       lea eax, dword ptr [eax+2*eax] --- Sposta in eax, 3*eax...
:00427568       add eax, ecx                --- e gli aggiunge ecx
:0042756A       push eax
:0042756B       call 004273E0               --- Ecco cosa fa in questa call :


:004273E0 mov eax, dword ptr [esp+04] --- Mette in eax, [ecx+eax*3] :004273E4 mov ecx, 0000000A --- Ed in ecx mette 10 :004273E9 cdq :004273EA idiv ecx --- La divisione per ecx, porta in eax il quoziente... :004273EC mov eax, edx --- ..ed in edx il resto, che viene spostato in eax... :004273EE add eax, 00000030 --- ..e a cui viene aggiunto 30h :004273F1 ret

:00427570 mov bl, al --- Il risultato lo mette in bl :00427572 mov eax, dword ptr [esp+30] --- Di nuovo in eax i primi 6 char :00427576 mov cl, byte ptr [eax+03] --- Mette in cl il 4° char... :00427579 mov dl, byte ptr [eax+01] --- ed in dl il 2°. :0042757C movsx eax, cl --- Già, è lo stesso ciclo di prima =) :0042757F movsx ecx, dl :00427582 lea eax, dword ptr [eax+2*eax] :00427585 add eax, ecx :00427587 push eax :00427588 call 004273E0 --- Questa call la conosciamo =) :0042758D mov ecx, dword ptr [esp+2C] --- Mette in ecx gli ultimi 4 char del serial :00427591 add esp, 00000020 :00427594 cmp bl, byte ptr [ecx] --- Confronta bl con il 7° char :00427596 jne 004275A6 --- Se non è uguale son dolori! :00427598 cmp al, byte ptr [ecx+03] --- Confronta al con il 10° char :0042759B jne 004275A6 --- Pure qua se non è uguale son dolori! :0042759D mov byte ptr [edi+00000154], 01 --- Tutto OK! =) :004275A4 jmp 004275AD * Referenced by a (C)onditional Jump at Addresses: |:00427596(C), :0042759B(C) | :004275A6 mov byte ptr [edi+00000154], 00 --- Ahi Ahi Ahi


Bhè mi sembra di aver commentato il codice abbastanza da farvi capire come si svolge il tutto, il 5° char viene moltiplicato per 3 e gli viene sommato il 2° carattere, il tutto viene diviso per 10, ed al resto di tale divisione viene sommato 30h, il carattere ASCII corrispondente a questo risultato deve essere il 7° carattere, stessa cosa per la seconda condizione che il nostro Mp3 serial deve rispettare solo che qua, ad esser moltiplicato per 3 e poi sommato è il 4° char e non il 5°, ed il corrispondente ASCII del risultato deve essere uguale al 10° char e non al 7°.
Quindi, volendo farci un keygenerator, basta inserire i primi 6 caratteri a piacere e dal keygen farci calcolare gli altri 4, anzi, gli altri 2, visto che l'ottavo ed il nono carattere possono essere a piacere =), e visto che nell'altro mio tut avete pure i sorgenti del keygenerator per il primo seriale, potete facilissimamente completare l'opera =).
Un esempio? Immaginiamo di volere come prime cifre 123456 (che fantasia!) il carattere ASCII "2" corrisponde a 32h ed il "5" a 35h, quindi,


 (35h*3)+32h = D1h

che diviso Ah, mi da 14h resto 9, e 9+30h= 39h, che in ASCII è "9", il 7° char deve essere 9, poi,

 (34h*3)+32h = CEh

che diviso Ah, mi da 14h resto 6, e 6+30h= 36h, che in ASCII è "6", il 10° char deve essere 6 =)

Già, vedo che state per dire quello che sto per dire io, il nome da noi inserito non c'entra niente con il secondo serial, ne di conseguenza c'entra il primo serial, quindi un serial che si attenga alle condizioni che abbiamo sopra visto è valido per tutti i nomi e per tutte le copie di Multimedia Builder =) inoltre il serial non da problemi in fatto di lunghezza, deve esser più di dieci caratteri, tutto lì =) quindi potrebbe essere 1234569aa6MariaTiAmo o 1234569aa6ThomsonMultimediaVaffanculo o qualcosa del genere (ovviamente gli "aa" sono a caso) =)
Bhè, anche l'addendum è finito, spero l'abbiate gradito,

CiauzZZZZZZZzZZZZZZZzZZZZZZZz

Pincopall

P.s.: Che bello il vecchio foooooooooooorm!! ;-P Grrrr NdQue :P

Note finali

Allora: ....spettate che tiro fuori la lista.....ah eccoci, un saluto a tutti quelli della ML, del canale #crack-it ed in particolare a _ph0b0s_ e GuZura, e del canale #hackit99 (su www.ecn.org) ed in particolare a GiPOCO ed al suo amico Vampire (non ti conosco ma sei davvero un grande) cui ho fatto prendere la scimmia del cracking/reversing ;-)

Ma soprattutto, e ora son cose serie, dedico questo tute al grande GLAUCO, che non era nè un cracker, nè un reverser, nè niente del genere, ma che era il mio più grande amico e che mi è stato portato via da una malattia incurabile a soli 18 anni, pochi giorni fa, forse non nè avrete mai sentito parlare, ma era un atleta, il miglior saltatore in lungo di tutti quelli sotto i vent'anni, e doveva andare alle Olimpiadi del 2004, ed invece.....bhè mi piace pensare che ora lassù stia saltando come non mai e stia dando una lezione a tutti gli altri angeli. Arrivederci Glauco, non ti scorderò mai.

Note finali Addendum

Un saluto a _Jalouse_ che mi ha chiesto se gli facevo questo Addendum, lo so, è in italiano, spero che il traduttore ti funzioni bene =).
Un saluto a tutti quelli che ho re-incontrato o incontrato per la prima volta all'Hackmeeting 2003, Quequero (Ah no! lui non c'era ghghgh, arigrrrrr NdQue), Andreageddon (Ah no! neppure lui c'era ihihhi), _d3im0s_, ded, Ntoskrnl, +Malattia, LittleJohn, JeyOne, E4zy, Mayhem, vecna, Xentec, Syscalo, Ritz, albe, Nobody88, Gipoco, Ciccio e tutto il LOA =), Zicky e tutto lo Spinhacker 404 e chi mi sono dimenticato =), ciauuuu

Disclaimer

Vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial.Mi ritengo invece responsabile (e quindi destinatario chessò, del 30%?) se utilizzando questo programma, ed anche se non utilizzandolo fate 6 al SuperEnalotto o tredici al Totocalcio ;-))). 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.