Il leimcrypt vediamo se è veramente tanto leim.

Data

by "AciD_LeO"

 

11/04/2001

UIC's Home Page

 


Acid ottima soluzione :P che altro dire??? La formattazione però è pessima.....arrrr

 

....

E-mail: AciD_LeO@hotmail.com
irc.azzurra.it / irc.tin.it      #crack-it
 

....

Difficoltà

( )NewBies (x)Intermedio ( )Avanzato ( )Master

 

Questo è il mio primo tute (forse l'ultimo) quindi se avete qualche lamentela da fare scrivetemi pure AciD_LeO@hotmail.com.


Il leimCrypt
Written by AciD_LeO

Introduzione

Mettiamo un pò le mani sul PE

Tools usati

SoftIce.
Icedump qualunque dumper va bene.
Un PeDitor (io ho usato PEditor).
Un editor esadecimale (Io ho usato Hiew).

URL o FTP del programma

www.uic-spippolatori.com

Notizie sul programma

Lo avviamo premiamo sul pulsante REGISTER.... e ci dice non sei registrato.

Essay

Personalmente ho individuato almeno 3 modi per risolvere questo corso:

1:Siccome il programma è criptato e non packato possiamo tentare di fare le modifiche che ci servono   direttamente sull'eseguibile criptato.

2:Facciamo finta di niente e proseguiamo in un brutale manual unpcking

3:Scriviamo un decripter generico per il LeimCript

In questo tute vi illustrerò i primi due procedimenti anche perché il terzo lo devo ancora terminare.

Si parte.

Facciamo partire il programma  e mettiamo un break point su messagebox quindi scriviamo

bpx messageboxa clikkiamo sul pulsante register e softice popperà all'interno di mfc42, premiamo F12 per entrare nella sezione code del prog e ci dovremmo trovare all'indirizzo 0040151A. Vediamo bene cosa è successo una cmp di una dword contenuta nella sezione data del programma con 1; scriviamo "e 403020" e vediamo che a quell'indirizzo c'è esattamente la dword 1.


:00401500 833D2030400001 cmp dword ptr [00403020], 00000001
:00401507 7512 jne 0040151B
:00401509 6A10 push 00000010
:0040150B 6888304000 push 00403088 |
:00401510 6874304000 push 00403074
:00401515 E848020000 Call 00401762
:0040151A C3 ret

:0040151B 6A40 push 00000040
:0040151D 6864304000 push 00403064
:00401522 6824304000 push 00403024
:00401527 E836020000 Call 00401762
:0040152C C3 ret


Bene andiamo nell'eseguibile all'offest fisico 1620 che è quello corrispondenete all'RVA 403020 e vediamo un pò  A7 AF AF AF che a rountime diventano  01 00 00 00 cerchiamo di capire come.

Se analizziamo il codice del loader vediamo che ha due diversi decripting uno per la sezione code e uno per la sezione data a noi interessa il secondo cmq eccoli entrambi.

 



Sezione CODE:



 

00407038: 8A1C08 mov bl,[eax][ecx]
0040703B: F6D3 not bl
0040703D: 80F337 xor bl,037 ;
00407040: C0C303 rol bl,003 ;
00407043: 881C08 mov [eax][ecx],bl

 



Sezione DATA:



 

00407060: 8A1C08 mov bl,[eax][ecx]
00407063: F6D3 not bl
00407065: 80F358 xor bl,058 
00407068: C0C305 rol bl,005"
0040706B: 881C08 mov [eax][ecx],bl

Questo algoritmo si inverte facilmente infatti basta invertire  l'ordine delle istruzioni e trasformare la rol in ror quindi per ottenere zero al posto dell'uno si prosegue così:



 

mov al,0h  //zero è il byte che vogliamo criptare

ror al,5     //ror al,0 è uguale a 0
xor al,58h //xor al,58h è uguale a 58h
not al       //not 58 è uguale a A7h

 



A7h che è il byte che decrittato diventerà zero corriamo all'eseguibile e sostituiamolo, tada registrato.

Si poteva notare che quelli a fianco erano anche A7h e sostituirli brutalmente ma si può ancora notare che qualunque byte ci sia all'offset fisico 1620h dell'eseguibile diverso da AFh va bene poiché la compare è in termini di diverso. Prendetevi una pausa perché si comincia con la seconda parte.



Carichiamo Icedump e partiamo. Iniziamo a steppare il loader:

Innazitutto chiamata a Getmodulehandlea per l'imagebase dell'eseguibile orignale ok.

Decripta code, decripta data , richiama loadlibrary per 3 funzioni solamante (GetVersion, GetModuleHandleA, GetstartupInfoA) e già qui c'è il primo campanelllino di allarme infatti il loader riaggiusta la IAT relativamente a 3 Thunk caricati da kernel32 bene, contituiamo e il loader azzera  puntatore ai OFT di MFC della it male.

00407114: C70300000000 mov d,[ebx],000000000 
0040711A: C7430C00000000 mov d,[ebx][0000C],000000000 
00407121: C7430800000000 mov d,[ebx][00008],000000000 

Dopo c'è il jmp eax che ci porta all' entrypoint originale ok. Un dump in questo momento significherebbe fixarsi manualmente l'OFT di MFC e siccome siamo pigri facciamo ripartire il progz e arrivati a 407114 modifichiamo EIP manualmente per farlo puntare a 407128 bene adesso siamo pronti  per il dump.

L'entry è all'indirizzo 4017D0 ok.

Scriviamo map32 per vedere come è mappato l'eseguibile in memoria:

:map32 nono 

Owner Obj Name Obj# Address Size Type 
NONO .text 0001 016F:00401000 00000B12 CODE RW 
NONO .rdata 0002 016F:00402000 00000448 CODE RW 
NONO .data 0003 016F:00403000 00000194 CODE RW 
NONO .idata 0004 016F:00404000 0000060C CODE RW 
NONO .rsrc 0005 016F:00405000 000016AC CODE RW 
NONO Geddone! 0006 016F:00407000 00003000 CODE RW 

 

Prediamo la size dell'ultima sezione 3000 sommiamola all'address sempre dell'ultima sezione 407000 e sottraiamo l'IMAGEBASE cioè 400000 avremo così 3000+407000-400000=A000 bene questa è la dimensione del nostro eseguibile scriviamo

/dump 400000 A000 c:\pippo.exe  

adesso abbiamo in pippo.exe il dump non avviatelo ancora perchè non parte.

Aprite pippo.exe con PEditor aggiustate l'entrypoint a 17D0 poi clikkate sul pulsante sections e sulla schermata che si apre tasto destro sulla prima sezione dal menu a tendina scegliere dumpfixer (RS=VS & RO=VO) in questo modo l'eseguibile parte perfetto.

Però ci manca ancora una cosa cioè aggiustare i 3 FirstThunk e patchare l'seguibile. Ok se analizziamo la import con PEditor vediamo che KERNEL32 importa GetModuleHandleA, LoadLibraryA e GetprocAddress che sono le funzioni del loader non le funzioni dell'eseguibile quelle erano (GetVersion, GetModuleHandleA, GetStartupInfoA) ok posizioniamoci sull FistThunk di Kenel32 con  l'editor esadecimale che si trova all'offset fisico 4064 dell'eseguibile dumpato perfetto sostiruiamo 81 71 00 00 con 2C 45 00 00 (0000452C) che è il puntatore a GetVersion poi sostituiamo 94 71 00 00 con 3A 45 00 00 (0000453A) che è il puntatore a GetModuleHandleA infine sostituiamo 70 71 00 00 con 4E 45 00 00 (0000454e) che è il puntatore a GetStartupInfoA ok finito adesso  patchiamo l'eseguibile all'indirizzo 3020 (ricordare  prima era 1620 questo è dovuto al riallinemanto) sostituiamo 0 con 1 finito. Adesso tutto funge alla perfezione ok. Volendo potete eliminare il loader dall'eseguibile insieme alla sezione GEDDONE! tanto a che servono + in quest'ultimo caso dovete fixare il campo imagesize dell'eseguibile se no su win nt non parte ok

 

 

-=AciD_LeO=-

Note finali

In primis un saluto a Yado e AndreGeddon  che ha fatto il crackme siete i migliori!!!!. Saluto inoltre Byte ma dove sei finito?.

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.

Capitoooooooo????? Bhè credo di si ;))))