Ottavo |
||
Data |
by "The Hellfish" |
|
10/12/2000 |
Published by Quequero |
|
|
Hell, hai fatto una buona soluzione.....La prossima volta però uso più zen e meno intuito....È solo un consiglio :) |
... e qui! |
.... |
|
.... |
Difficoltà |
(X)NewBies ( )Intermedio ( )Avanzato ( )Master |
|
Abilitiamo quello che Andreuzzo ha disabilitato!
Introduzione |
Tools usati |
URL o FTP del programma |
Notizie sul programma |
Essay |
Come diavolo si farà ad abilitare sti bottoni? Beh innanzi
tutto è buona cosa sapere da che punto attaccare il programma. Se disassembliamo il prog
troveremo all'inizio queste cosucce:
Allora, la prima delle 2 api ci servirà in seguito per
adesso guardiamo la seconda. Questa ci servirà per fare poppare il sice quando
all'apertura del programma si disabiliteranno i pulsanti. Allora iniziamo, BPX
ENABLEWINDOW, eseguiamo il prog e quando sice poppa guardiamo il codice sopra
Dunque dunque, indovinate cosa sono quei push 0... Se non
ci siete arrivati ve lo dico io, sono i flag che dicono all'api ENBLEWINDOW cosa fare
(0=disabilitato, 1=abilitato), quindi mi sembra una buona cosa cambiare quei push 0 in
push 1. In questo modo abbiamo abilitato i 3 button. Apriamo di nuovo il prog e clicchiamo
sul 1° livello, REGISTERED! Ora clicchiamo sul secondo e... UNREGISTERED! Porc! Bè
niente paura sarà un controllino stupido evitabile invertendo qualche jump, il problema
è: dov'è sto controllo?? Facciamo una cosa noi, apriamo il customizer, selezioniamo il
tasto prendiamo nota del suo handle. In sice poi scriveremo bmsg handle wm_enable,
clicchiamo sul secondo e steppa che ti steppa arriviamo qui
Osserviamo il jump condizionato a 401826: se esegue il
salto finisce su un push 0 se invece non lo esegue, il jmp che c'è dopo gli fa saltare
questo push 0. Vi ricordo che push 0 è il flag negativo, cosa ci rimane da fare quindi?
Invertiamo o noppiamo questo je!! Bene bene, ora clicchiamo sul terzo e naturalmente anche
lui farà la sua balordata: diventa grigio. Uffa! Ripetiamo il procedimento di prima per
questo pulsante (devo dirvelo che l'handle sarà diverso?) e dopo aver messo il
breakpoint, dopo aver cliccato sul bottone e dopo aver steppato arriviamo qui!
Lo schema è simile a quello precedente questa volta al
posto di avere un controllo ne abbiamo 2 se seguite il codice vi accorgerete che per il
resto è uguale a prima perciò noppiamo a 401896 e a 4018ab! E anche questo livello è
finito! Ora passiamo ai menu, e vediamo come abilitarli. Avete presente quell'api che vi o
detto che ci servirà in seguito? Vabè era EnableMenuItem. Quest'api funziona allo stesso
modo di EnableWindow quindi anche qui dovremo andare a cercare il flag che fa diventare
disabilitato il pulsante. BPX ENABLEMENUITEM, avviate il prog, premete F5 fino a quando in
basso a destra non c'è scritto OTTAVO e poi steppate fino a fuori la call. Guardate il
codice sopra:
Come potete vedere anche qui ci sono i famosi push 0.
Mettendo push 1 al primo abiliteremo sia il 5° livello che il 4°. Ora dobbiamo fare in
modo che ci registri. Se adesso andiamo a cliccare sul 4° livello e noteremo con
dispiacere che sul 3° viene scritto UNREGISTERED. Eh già un'altra piccola trappola di
Andrea, vediamo come procedere. Abbiamo 2 problemi ora: registrare il 4° ed evitare che
venga annullato il terzo. Dato che il 4° livello influisce sul 3° mettiamo un BMSG
HANDLE_TERZO_LIVELLO WM_COMMAND. Clicchiamo sul quarto, steppiamo ed arriviamo qui:
Il salto condizionato a 401a04 determina se il 4° livello
è registrato. Trascurando le condizioni di questo salto possiamo notare che se il salto
avviene, la call a 401a12 non viene eseguita. Cosa faremo noi allora? Noppiamo a 401a04!
La seconda bastardata viene attuata prima di questo salto. Guardate il push a 4019ed, qui
c'è un errore (o bagolo come lo chiama Andre :) e se si cambia in push 3f1 abbiamo
risolto i nostri problemi! Siamo finalmente arrivati al quinto e ultimo livello. Questo è
più difficile degli altri perché bisogna attaccarlo con un metodo diverso da quelli di
prima. All'inizio qui stavo diventando scemo con il solito breakpoint sull'handle ma poi
fortunatamente Andreuzzo mi ha suggerito: "parti dal presupposto che il programma
DEVE tornare al processo dell'ottavo, quindi devi trovare un modo per monitorare ogni
esecuzione del codice dell'ottavo dal break su WM_COMMAND in poi". In seguito ho
capito a cosa serviva il comando BPR in sice :). Partiamo mettendo un bmsg sull'handle
della dialog (col customizer dovete selezionare la finestrella del prog Ottavo). BMSG
HANDLE_DIALOG WM_COMMAND, clicchiamo sul quinto livello e su "Abilitami" e
vediamo cosa succede. Il debugger a questo punto finisce in mare di loop infiniti che la
MFC continua a fare, dobbiamo trovare un modo per risalire al codice. In sice esiste un
comando che ci permette di vedere le sezioni del programma, cioè map32. Scrivete MAP32
OTTAVO in sice e prendete nota degli indirizzi di inizio e di fine della parte di .TEXT vi
dico io che sarà da 401000 a 403000. Come vi dicevo prima il comando BPR (breakpoint on
memory range) ci permette di brekkare nell'intervallo di indirizzi che gli diamo perciò
noi faremo in questo modo: BPR 401000 403000 R In questo modo abbiamo un breakpoint su
ogni parte di codice che sta in quel intervallo; la R sta per READ, se non la mettete sice
prenderà il breakpoint di default in WRITE. Ricapitoliamo: settiamo il BMSG, clicchiamo
ABILITAMI nel quinto livello, settiamo il BPR e schiacciamo F5 fino a quando non siamo
qui:
Ormai il grosso è fatto, se siamo arrivati fin qui abbiamo finito. Vedete quel jmp condizionale? Trascurando, come al solito, per quali condizioni salta o meno lavoriamo un attimo di logica: vediamo una call, vogliamo che venga eseguita, il salto andrebbe oltre la call, cosa ci rimane da fare? Ovviamente invertire o noppare il jmp, niente di più semplice!
The Hellfish
Note finali |
Wow! Ed anche questa è fatta! Volevo iniziare complimentandomi con Andreone per l'ottimo crackme, che mi ha insegnato tante cose, e per le cose che si degna di insegnarmi quando lo becco su irc, grazie 1000! Un saluto al Que ed Olga, se lo strainer è davvero così cattivo chissà che programmazione ci sta dietro, grandi! Un saluto al Bieco, al quale tra l'altro devo la grafica del mio sito, un saluto a tutti i membri di #crack-it che non ho nominato e che spero non si sentano offesi ed infine un saluto a te che stai leggendo questo tutorial. Ciauzzzz.....
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. 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.