|
quequero.org UIC
Forum
|
View
previous topic :: View
next topic |
Author |
Message |
koala223223 Newbie
Joined: 08
Oct 2004 Posts: 37
|
Posted: Thu Oct 13, 2005
3:34 pm Post subject:
Da pdf a word passando per olly :) |
|
|
|
Ciao a tutti ... rieccomi
dopo diverso tempo a chiedere aiuto.
Ho un problema
con un programma (decisamente stupido) che mi sta facendo
scervellare: pdf2word 1.6 -
h**p://www.verypdf.com/pdf2word/index.html
Il nome
dice tutto!
La trial ha 2 limitazioni (100 esecuzioni
max e 5 pagine a conversione).
Beh ... sono arrivato a
capre il punto chiave cioè che il prog crea un file in
windows\system32 chiamato pdf2word.dat.
Ho analizzato
3 casistiche:
1- Versione Try - Il file contiene il
numero di volte che il prog è stato lanciato (cancellandolo il
contatore torna a 0 cioè mancano 100 esecuzioni)
2-
Fake serial - Il file viene compilato con caratteri strani
(tramite routine calcolata di volta in volta) ed il prog si
accorge che l'accopiata e.mail + serial non sono corretti.
3 - Right serial - Non ci sono ancora arrivato ma a
quanto pare viene comunque controllato tali file.
Non
capisco dove posso dire ad Olly che il file è ok anche se non
lo è...
Anime pie rispondete eheheh
| |
Back to
top |
|
|
Death_Reaver Newbie
Joined: 24
Feb 2005 Posts: 50 Location: Hell
|
Posted: Thu Oct 13, 2005
6:16 pm Post subject:
|
|
|
|
Non ti complicare la vita!
concentrati sul seriale da immetere: è facilissimo craccarlo!
Si tratta di noppare un jmp
Consiglio:
cerca tra le stringhe
§-Death_Reaver-§ _________________ The Reaver is
waiting... | |
Back to
top |
|
|
Lonely Wolf Guru
Joined: 19
Sep 2002 Posts: 515 Location: Manicomio
|
Posted: Fri Oct 14, 2005
8:19 am Post subject:
|
|
|
|
personalmente ho ancora
poca dimestichezza con olly, tuttavia se vuoi provare a
smanettare con il file in questione, proprio poichè "lavora"
con un file potresti provare a tenere d'occhio l' API
CreateFileA..ci sarà un punto nel prog in cui con tale
chiamata apre il file dat in questione, boh leggerà un valore
e lo riscriverà..io a suo tempo in una situazione simile o
noppai l'inc oppure gli feci aggiungere 0, mo non mi ricordo
esattamente anche se cmq era un file ini quello che si leggeva
con la GetPrivateProfileString. Dai un'occhiata a un API
reference per i param della CreateFile. Occhio che semetti un
BP su CreateFile avrai molte "occorenze"..se possibile prova
un conditional BP. Oppure una soluzione "alternativa"
potrebbe essere quello di usare un API Monitor che loggandoti
appunto ogni call (quasi tutte ma sicuramente CreateFile) con
i relativi param può aiutarti sensibilmente nell'identificare
ilpunto (leggi offset) dove tale chiamata viene effettuata, in
passato l'ho usato con successo. In passato si usava ApiSpy, o
se no cerca il rohitab API monitor.
Per il
serial...beh non conosco il tuo programma ma sicuramente sto
serial lo SCRIVERAI da qualche parte e verrà altrettanto LETTO
:twisted: | |
Back to
top |
|
|
koala223223 Newbie
Joined: 08
Oct 2004 Posts: 37
|
Posted: Fri Oct 14, 2005
10:00 am Post
subject: |
|
|
|
Grazie ragazzi per le
risposte ...
x Death_Reaver: ok è vero potrei noppare
i jump tuttavia il prog ti dice di essere registrato ma al
successivo riavvio controlla di nuovo il file e ti richiede
email e serial (proprio perchè il contenuto del file non è
corretto).
x Lonely Wolf: ok ora controllo le Api però
vorrei aggiungere questo ... ho notato che ad un certo
punto scrive in memoria 512 "X" poi converte tutte queste "X"
con 2 blocchi identici di altri caratteri dalla "H" in poi + o
- seguendo l'ASCII, legge il seriale e lo scrive all'altezza
della "L" nel 2° blocco. Controlla il tutto (ed è qui che non
capisco come lo controlla) e poi scrive il file.
Avete
altri suggerimenti ? | |
Back to
top |
|
|
Lonely Wolf Guru
Joined: 19
Sep 2002 Posts: 515 Location: Manicomio
|
Posted: Fri Oct 14, 2005
10:07 am Post
subject: |
|
|
|
beh se è come dici tu,
l'inizializzazione di un' array (?) in memoria di 512 byte a
"X" pare interessante...soprattutto il resto..potrebbe essere
una maschera che usa l'algo non so, come potrebbe essere
tutt'altra cosa :D
hai un solo modo per capire cosa
cazzo succede e come: leggi il disassemblato :P La
soluzione è scritta davanti a te ^_^ | |
Back to
top |
|
|
Zero_G Moderator
Joined: 20 May
2004 Posts: 1084 Location: The Dark Side of the
Moon
|
Posted: Fri Oct 14, 2005
11:59 am Post
subject: |
|
|
|
koala, quel programma non è
difficile da reversare!
innazitutto caricalo nel debugger tanto packer non ce
ne sono, dopodiché lancialo e ti apparirà la finestra di
registrazione; da dentro Olly ti fai dare la lista dei moduli
caricati (la 'E' in alto) e da lì fai "View Names" su
USER32.DLL, quindi dalla lista metti un breakpoint su
MessageBox ed inserisci email e chiave a caso.
toh,
ecco Olly! ovviamente
non sei dentro il programma ma nella DLL stessa, poco prima
dell'effettiva visualizzazione del messaggio d'errore, quindi
fai qualche step fino al RETN per rientrare nell'eseguibile
principale e ti troverai a 00429F7B, subito dopo la call a
MessageBox.
sali un po' più in alto e troverai il
classico schema GetDlgItemText [00429EF6] -> CALL
checkserial() [0042F926] -> Good/Bad Boy jump [00429F30]
la routine di controllo è la seguente (a destra c'è lo
pseudo-C ):
Code: |
00429720 >/$ SUB
ESP,30
; ESP = ESP - 30h
00429723 |. PUSH EBP
; Procedure Init 00429724
|. PUSH ESI 00429725
|. MOV ESI,SS:[ESP+3C]
00429729 |. PUSH EDI
0042972A |. MOV
AL,DS:[ESI]
; AL = serial(0) 0042972C
|. MOV CL,DS:[ESI+1]
; CL = serial(1)
0042972F |. MOV
DL,DS:[ESI+E]
; DL = serial(14) 00429732
|. MOV SS:[ESP+18],AL
; VAR1 = AL
00429736 |. XOR
AL,AL
; AL = 0
00429738 |. MOV
SS:[ESP+30],CL
; VAR2 = CL 0042973C |. MOV
CL,DS:[ESI+F]
; CL = serial(15) 0042973F
|. MOV SS:[ESP+19],AL
; VAR3 = AL
00429743 |. MOV
SS:[ESP+31],AL
; VAR4 = AL 00429747 |. MOV
SS:[ESP+25],AL
; VAR5 = AL 0042974B |.
MOV SS:[ESP+D],AL
; VAR6 = AL 0042974F
|. MOV AL,DS:[ESI+2]
; AL = serial(2)
00429752 |. CMP AL,24
00429754 |. MOV
SS:[ESP+24],DL
; VAR7 = AL 00429758 |. MOV
SS:[ESP+C],CL
; VAR8 = CL 0042975C
|. JNZ SHORT <EXIT>
; if (AL !=
24h) EXIT 0042975E |. MOV
EDI,DS:[<&MSVCRT.atoi>] ;
msvcrt.atoi 00429764 |. LEA
EDX,SS:[ESP+C]
; EDX = [VAR8] 00429768 |.
PUSH EDX
; /s
00429769 |. CALL EDI
; \EAX = atoi(EDX) 0042976B
|. MOV EBP,EAX
;
EBP = EAX 0042976D |. LEA
EAX,SS:[ESP+1C]
; EAX = [VAR9] 00429771 |.
PUSH EAX 00429772 |.
CALL EDI
; EAX =
atoi (EAX) 00429774 |. ADD
EBP,EAX
; EBP = EBP + EAX;
00429776 |. ADD
ESP,8
; ESP = ESP + 8
00429779 |. CMP
EBP,0A
; if (EBP != 10)
0042977C |. JNZ SHORT
<EXIT>
; goto EXIT 0042977E |.
LEA ECX,SS:[ESP+24]
; ECX = VAR7
00429782 |. PUSH ECX
00429783 |. CALL EDI
; EAX = atoi(ECX) 00429785
|. LEA EDX,SS:[ESP+34]
; EDX = [VAR10]
00429789 |. MOV
EBP,EAX
; EBP = EAX 0042978B
|. PUSH EDX 0042978C
|. CALL EDI
; EAX = atoi(EDX) 0042978E
|. ADD EBP,EAX
;
EBP = EBP + EAX 00429790 |. ADD
ESP,8
; ESP = ESP + 8
00429793 |. CMP
EBP,0A
; if (EBP != 10)
00429796 |. JNZ SHORT
<EXIT>
; goto EXIT 00429798 |.
CMP BYTE PTR DS:[ESI+3],24
; if (serial(3) != 24h) 0042979C
|. JNZ SHORT <EXIT>
; goto
EXIT 0042979E |. MOV
CL,DS:[ESI+5]
; CL = serial(5) 004297A1 |.
XOR EAX,EAX
; EAX = 0
004297A3 |. CMP
CL,23
; if (CL == 46h)
004297A6 |. POP EDI
004297A7 |. POP ESI
004297A8 |. POP EBP
004297A9 |. SETE AL
; EAX = 1 004297AC
|. ADD ESP,30
;
ESP = ESP + 30h 004297AF |. RETN
004297B0 >|> POP EDI
004297B1 |. POP ESI
004297B2 |. XOR
EAX,EAX 004297B4 |. POP
EBP 004297B5 |. ADD
ESP,30 004297B8 \.
RETN | quindi,
se il seriale è giusto setta EAX = 1, dopodiché rientra ed il
programma si comporta di conseguenza; la domanda sorge
spontanea: dove agire? all'interno di questa funzione oppure
cambiando solo il salto condizionale dopo la CALL
dall'esterno?
bene, ti già hai notato che il seriale
viene codificato all'interno del file "pdf2word.dat" dentro la
cartella di Windows e questo è sintomo che quando lo rilanci
lui lo ricontrollerà per vedere se è giusto (la stessa cosa la
poteva fare scrivendo un valore nel registro, ma tanto ormai
va di moda riempirti System32 di robaccia... ).
se metti un breakpoint sulle varie API
per accedere ai file (CreateFile, OpenFile, ReadFile, ecc...)
ti dovrai districare in una serie di chiamate che il sistema
cmq fa all'avvio di un programma (cache, profilo personale,
...), ma nonostante questo lo trovi abbastanza bene il punto
in cui viene ricontrollato il seriale (è a 00429B4B) e una
volta arrivato lì ti accorgerai che il programmatore è stato
pigro perché ha usato la stessa funzione chiamata dalla
maschera di registrazione (infatti accetta solo un parametro e
restituisce 1 o 0)!
ora che lo
sai, puoi fare una cosa più semplice per vedere le altre
chiamate a quella funzione: vai alla prima riga (00429720, lo
vedi dai NOP di padding poco più sopra) e con il destro fai
"Find References to Selected Command"; da lì vedi che ci sono
almeno altri 3 posti da cui viene invocata.
cosa ti
suggerisce questo? cosa devi modificare, i JNZ dentro o il
primo JE che abbiamo trovato?
dici
la prima? ... la accendiamo?
ok,
dobbiamo modificare la funzione che sta alla radice del
problema facendo sì che restituisca sempre 1 indipendentemente
dalla correttezza del seriale, quindi sempre da dentro Olly
dobbiamo capire cosa si può cambiare, e possibilmente il meno
possibile!
innanzitutto assicuriamoci di andare
direttamente alla chiusura della funzione "a buon fine", cioè
dal primo JNZ dirottiamo subito verso 0042975C trasformandolo
in un JMP, dopodiché, invece di fargli azzerare EAX e poi
eventualemente settarlo a 1 con il SETE, lo mettiamo noi a 1
ed ammazziamo il SETE!
ti
ricordo che settare EAX a 1 equivale all'istruzione "MOV EAX,
1", il cui opcode è "B801000000" (5 bytes), quindi devi
trovare il punto dove c'è posto per questo inserimento senza
corrompere le istruzioni successive; se guardi gli indirizzi
004297A1 e 004297A3, vedrai che le istruzioni corrispondenti
("XOR EAX, EAX" e "CMP CL, 23") occupano proprio 5 bytes,
quindi non vedo posto migliore dove fare la nostra modifica.
clicca due volte su 004297A1, scrivi "MOV EAX, 1" e
Olly provvederà a sovrascrivere gli opcodes necessari. bene,
l'ultima cosa è impedire l'azione del SETE, quindi un
trasformiamolo in un bel NOP.
e con
soli 3 colpi della nostra Reversing-Magnum, lasciamo
il fetente stramazzare al suolo...
ah,
dimenticavo... se hai voglia puoi anche dare un'occhiata alla
validazione del seriale, perché a quanto ho potuto vedere si
basa su controlli fissi nelle varie posizioni, quindi non
dovrebbe essere difficile trovare proprio il seriale giusto;
te lo lascio come compito a casa!
-=[Zero_G]=- _________________ "To see a World in a grain of Sand,
Hold Infinity in palm of your Hand." | |
Back to
top |
|
|
peppeviruz Newbie
Joined: 27
Oct 2002 Posts: 100
|
Posted: Fri Oct 14, 2005
6:49 pm Post subject:
|
|
|
|
io veramente ho solo
modificato un salto!!!
Code: |
004394B4 . E8
8706FFFF CALL
00429B40 004394B9 85C0
TEST EAX,EAX
004394BB
. 74 1A
JE SHORT
004394D7 modifica in jmp!!
004394BD . C705 B4B74600
0000>MOV DWORD PTR DS:[46B7B4],0
004394C7 . 8B4D 20
MOV
ECX,SS:[EBP+20] 004394CA .
51
PUSH ECX 004394CB
. 6A 00
PUSH 0 004394CD
. E8 AE0CFFFF
CALL 0042A180 004394D2
. A3 B4B74600
MOV DS:[46B7B4],EAX
004394D7 > 8B55 20
MOV
EDX,SS:[EBP+20] 004394DA .
52
PUSH EDX
; /hWnd 004394DB
. FF15 80974400
CALL DS:[<&USER32.GetMenu>]
; \GetMenu 004394E1
. 8B0D B4B74600
MOV ECX,DS:[46B7B4]
004394E7 . 85C9
TEST
ECX,ECX 004394E9 . 74
0D
JE SHORT 004394F8 004394EB
. 57
PUSH EDI
; /Flags
004394EC . 68 13800000
PUSH 8013
; |ItemID = 8013 (32787.)
004394F1 . 50
PUSH
EAX
; |hMenu 004394F2 . FF15
9C974400 CALL
DS:[<&USER32.EnableMenuItem>] ;
\EnableMenuItem 004394F8 >
8BCD
MOV ECX,EBP 004394FA
. E8 51FBFFFF
CALL 00439050 004394FF
. FF15 D8964400
CALL
DS:[<&MSVCRT.__p___argc>]
; msvcrt.__p___argc 00439505
. 8B00
MOV EAX,DS:[EAX]
00439507 . 894424 2C
MOV
SS:[ESP+2C],EAX 0043950B .
FF15 D4964400 CALL
DS:[<&MSVCRT.__p___argv>]
; msvcrt.__p___argv 00439511
. 8B4C24 2C
MOV ECX,SS:[ESP+2C]
00439515 . 8B00
MOV
EAX,DS:[EAX] 00439517
. 3BCF
CMP ECX,EDI
|
e il programma è registrato!!!
ciao!! | |
Back to
top |
|
|
koala223223 Newbie
Joined: 08
Oct 2004 Posts: 37
|
Posted: Sat Oct 15, 2005
10:33 am Post
subject: |
|
|
|
Ciao Zero, ok ho provato ma
c'è un piccolissimo problema ho messo il bp su MessageBoxA in
View Names in User32 ma alla pressione di OK sul prog olly mi
dice ... No response from injected code : In order to perform
... olly has injected a short piece of code ... no respons
within 5 sec ...ecc
E' un problema di impostazioni di
olly?
Ciao ora continuo ... | |
Back to
top |
|
|
koala223223 Newbie
Joined: 08
Oct 2004 Posts: 37
|
Posted: Sat Oct 15, 2005
10:48 am Post
subject: |
|
|
|
Peppeviruz sei stato un pò
frettoloso
E' vero modificando il JE con JNE il prog ti
dice essere registrato, ma non crea il file pdf2word.dat
Se avessi provato a lanciare il programma ed a
convertire un file, diciamo di 10 pagine, avresti notato che
il programma effettua la conversione, ma al termine (dove ti
dice Conversione finita, premi ok) il file temp che viene
creato dal prog viene cancellato e non ti salva nessun rtf.
Per di più se prima di premere ok alla fine della
conversione ti vai a copiare il tmp e lo rinomini in rtf il
file è corrotto.
C U | |
Back to
top |
|
|
peppeviruz Newbie
Joined: 27
Oct 2002 Posts: 100
|
Posted: Sat Oct 15, 2005
11:33 am Post
subject: |
|
|
|
raga, avete ragione, in
realtà non ho modificato il salto, ma ho xorato eax per se
stesso, cossi chè il valorer sia =0, quindi non
Code: |
004394B9
85C0
TEST EAX,EAX
004394BB
. 74 1A
JE SHORT
004394D7 modifica in jmp!!
|
ma
Code: |
004394B9
85C0
TEST EAX,EAX --------->>
diventa: Xor eax, eax
004394BB
. 74 1A
JE SHORT
004394D7
|
e il salto rimane invariato!!
P.S.: anche se non crea il file .dat in
windows\system32, il progrz funge alla grande, testalo
adesso!!! Ciao, e scusa se mi sono confuso, il patch
wiever che mi sono fatto in vb, salta un byte, quindi pensavo
che la modifica si riferisse al je, confrontando i bytes mod.
tra original e patched!!! Ciao!!! | |
Back to
top |
|
|
SiLENT Newbie
Joined: 30
Dec 2003 Posts: 40
|
Posted: Sat Oct 15, 2005
1:00 pm Post subject:
|
|
|
|
In effetti la generazione
del seriale è molto semplice, ve la riassumo nel modo più
conciso possibile: Deve essere della forma
ab$$x#xxxxxxxxcd con a,b,c,d interi tali che:
a+d=10 b+c=10 . le x sono caratteri
irrilevanti
quindi una roba tipo 83$$s#blablabl72
andrebbe tranquillamente bene...
Saluti
SiL | |
Back to
top |
|
|
Ox87k Advanced
Joined: 29
Feb 2004 Posts: 401
|
Posted: Sat Oct 15, 2005
1:21 pm Post subject:
|
|
|
|
alla fine era + semplice
risolvere l'algo per ottenere un serial valido ke patchare il
programma!!! | |
Back to
top |
|
|
koala223223 Newbie
Joined: 08
Oct 2004 Posts: 37
|
Posted: Sat Oct 15, 2005
1:54 pm Post subject:
|
|
|
|
Grazie a tutti quanti per
il vostro aiuto!
Per Silent: potresti dirmi a che
indirizzo hai trovato l'algo? | |
Back to
top |
|
|
Ox87k Advanced
Joined: 29
Feb 2004 Posts: 401
|
Posted: Sat Oct 15, 2005
2:11 pm Post subject:
|
|
|
|
guarda il post di zero_g,
il mega tutorial li c'è tutta la procedura | |
Back to
top |
|
|
Zero_G Moderator
Joined: 20 May
2004 Posts: 1084 Location: The Dark Side of the
Moon
|
Posted: Sat Oct 15, 2005
4:39 pm Post subject:
|
|
|
|
koala223223
wrote: |
Per Silent: potresti dirmi a che
indirizzo hai trovato l'algo? | koala, che te l'ho scritto a
fare tutto il procedimento passo passo?
peppeviruz
wrote: |
raga, avete ragione, in realtà non ho
modificato il salto, ma ho xorato eax per se stesso,
cossi chè il valorer sia =0 | se metti EAX = 0, quando esce da quella
procedura è come se restituisse 0, ma il seriale lo considera
giusto solo se ottiene un valore diverso da 0.
Silent, ho
guardato velocemente l'algo perché ero di fretta, cmq anch'io
avevo notato quei $ nei check, quindi mi sembra che il seriale
buono abbia quella forma che dici te.
-=[Zero_G]=- _________________ "To see a World in a grain of Sand,
Hold Infinity in palm of your Hand." | |
Back to
top |
|
|
koala223223 Newbie
Joined: 08
Oct 2004 Posts: 37
|
Posted: Sat Oct 15, 2005
5:02 pm Post subject:
|
|
|
|
Ragazzi avete ragione la
mega spiegazione di Zero (come al solito impeccabile! )
contiene tutte le info ... scusate il rincog*****mento!
Però
Olly seguendo le info di Zero continua a spararmi
No
response from injected code! In order to perform ... olly
has injected a short piece of code ... no respons within 5 sec
...ecc
E' un problema di impostazioni di
olly? | |
Back to
top |
|
|
Zero_G Moderator
Joined: 20 May
2004 Posts: 1084 Location: The Dark Side of the
Moon
|
Posted: Sat Oct 15, 2005
5:20 pm Post subject:
|
|
|
|
ci sta che tu non abbia
settato degli ignore sulle eccezioni intercettate dal
debugger; sennò prova a scaricare OllyDbg da qui, è già
configurato e con i plugins: http://zerog.altervista.org/tools.htm#3
-=[Zero_G]=- _________________ "To see a World in a grain of Sand,
Hold Infinity in palm of your Hand." | |
Back to
top |
|
|
acme Newbie
Joined: 22
Jan 2005 Posts: 6
|
Posted: Sun Oct 16, 2005
7:39 pm Post subject:
|
|
|
|
Quote: |
cmq anch'io avevo notato quei $ nei
check, quindi mi sembra che il seriale buono abbia
quella forma che dici te. |
confermo, il seriale dovrebbe avere
propio questa forma... | |
Back to
top |
|
|
koala223223 Newbie
Joined: 08
Oct 2004 Posts: 37
|
Posted: Mon Oct 17, 2005
8:15 am Post subject:
|
|
|
|
Zero, ho scaricato il tuo
aggiornatissimo file di Olly ma nulla da fare continua a darmi
lo stesso problema ...
Grazie
ancora a tutti | |
Back to
top |
|
|
koala223223 Newbie
Joined: 08
Oct 2004 Posts: 37
|
Posted: Mon Oct 17, 2005
10:47 am Post
subject: |
|
|
|
Zero_G wrote: |
... innanzitutto assicuriamoci di
andare direttamente alla chiusura della funzione "a buon
fine", cioè dal primo JNZ dirottiamo subito verso
0042975C trasformandolo in un JMP ...
|
Non
capisco ... a quale "primo JNZ" da converitre in JMP ti
riferisci cioè di che indirizzo parli? | |
Back to
top |
|
|
|
Watch
this topic for replies |
You can post new topics in this forum You
can reply to topics in this forum You can edit your
posts in this forum You can delete your posts in this
forum You can vote in polls in this forum You
can moderate
this forum |
|