Multimedia Builder from v4.7 to v4.9.0.1 |
| |
18/09/2000 + |
by "Pincopall" |
|
|
Published by Quequero | |
Ma secondo voi poppa meglio SoftIce 3, SoftIce 4.05..... |
Bravo pinco, sei proprio il migliore :pp
ghghghgh |
.......o Pamela Anderson?? ;-) |
UIC's form |
|
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ò ;-) .
Introduzione |
Tools usati |
URL o FTP del programma |
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.
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
* 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
(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 =)
P.s.: Che bello il vecchio foooooooooooorm!! ;-P Grrrr NdQue :P
|
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.
|
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 |