Zoom Icon

Winrar 3.71

From UIC

WinRar 3.71

Contents


Infos
Author: Johan Padan
Email: Email
Website: Home page
Date: 02/03/2008 (dd/mm/yyyy)
Level: Working brain required
Language: Italian Image:Flag_Italian.gif
Comments:



Introduzione

WinRAR è la versione a 32 bit del programma di archiviazione RAR


Tools & Files


URL o FTP del programma


Essay

Credo che su WinRar non ci sia niente da dire. Sappiamo tutti benissimo a che cosa serve. Il programma viene rilasciata in versione trial per 40 giorni successivamente il programma continua a funzionare pienamente in tutte le sue funzioni, ad eccezione di una nag screen che invita a regolarizzare l’acquisto.

Aprendolo con PeId ricaviamo che il programma è scritto in Borland C++.

Carichiamo il programma in Olly ed andiamo alla ricerca di qualche traccia tramite l’uso di “All reference text string “. Troviamo un’indicazione autoesplicativa “REMINDER “ . All’istruzione 0043FF47 troviamo la stringa che compone la DialogBoxParamA; e appena sopra

0043FF21  CMP     DWORD PTR [4CA1D0], 28 ; (sono I 40 giorni di prova del programma)

Provvediamo a noppare l’istruzione sotto evidenziata in modo che il programma non supererà mai i 40 giorni di prova.

0043FF28     JG      SHORT 0043FF33

La prima soluzione per quanto semplice rende peraltro il programma perfettamente utilizzabile.

Seconda soluzione.

Sempre ricercando all’interno delle stringhe recuperiamo informazioni quali: “regname”, “ regcode”, “registration” e “rar.ini”. All’indirizzo 0043F1A5 ho una chiamata alla call GetPrivateProfileStringA e non può che servire per recuperare tutte le informazioni viste in precedenza. Appena sopra verifichiamo delle istruzioni di questo tenore:

0043F14D CMP     BYTE PTR [4B41AC], 0
0043F154  JNZ     0043F234

Se l’area di memoria [4B41AC] è diversa da zero, il programma salta la lettura del file rar.ini, e se la salta è perché il programma risulta già registrato !! Ma chi scrive in quest’area di memoria ?

Mettiamo un breakpoint hardware on access / byte Facciamo ripartire il programma , e questo si ferma a 0043FA13

0043FA13    MOV     BYTE PTR [4B41AC], AL

Ma chi mette 1 in AL affinché il programma si possa considerare registrato è la call che troviamo all’address 0043FA0E. Entriamo steppando con F7 e ci accorgiamo che all’istruzione 004883D4 se sostituiamo al JE un NOP il programma provvede a caricare in AL il valore desiderato.

Così facendo l’istruzione successiva è un jump che ci porta fuori dalla routine senza verificare il file rarkey.

A questo punto risulto registrato ma nel menu “Informazioni su WinRar” non appare il mio nickname come user registrato.

Facciamo ripartire il programma arriviamo alla DialogBox che ci comunica che siamo registrati ma non mostra il nostro nome; mettiamo in pausa Olly, selezioniamo “execute till user code” torniamo sulla nag screen e diamo “OK”. Olly brekka e ci porta alla funzione caller:

00440DBA DialogBoxParamA ; relativa al template “ABOUT”.

Se manca una dialog box dove inserire il proprio nome è perché verrà trasmesso un file dalla software house con i dati inviati in precedenza dal cliente e che comprendono anche questo oltre alla key.

Andiamo a cercare dove legge questo file. Facciamo ripartire il programma e settiamo i breakpoint su CreateFileA e ReadFile dopo esserci aiutati con le reference string ed avendo trovato un possibile nome per il nostro file rarreg.txt.

Creiamo il file rarreg.txt, scriviamo qualsiasi cosa e lo posizioniamo all’interno della cartella di Winrar. Facendo ripartire il programma olly brekka a :

004098D9 con CreateFileA ed a
00409EF1 con ReadFile

Seguendo il flusso del programma riusciamo a capire come deve essere costruito il nostro file.

La prima riga deve essere di tipo descrittivo (qualsiasi cosa), poi troviamo all’istruzione 0040B594 un riferimento a 0A (line feed) ed all’istruzione 0040B58B un riferimento a 0D (carriage return).

Morale: nella prima riga scrivete quello che volete e nella seconda il nome con il quale volete registrarvi.

L’ultimo compitino consiste nel creare un patcher che provveda a noppare l’istruzione 004883D4 ed a creare il file.txt contenente il nostro nome di registrazione.

Vi riporto solo la patch proc creata tramite WinAsm; il sorgente completo e l’eseguibile lo trovate in allegato. |Winrap

intes db "Message",0
TargetName db "rarreg.txt",0
TargetName2 db"WinRAR.exe",0
WBuffer db "il programma è registrato a nome di: ",0dh,0ah
Sequence db 74h,14h,0B0h,1h,8Bh,95h,0E4h
WBuffer2 db 90h,90h,0B0h,1h,8Bh,95h,0E4h
PatchOffset dd 879D4h
Success db "Target patched successfully ",0
WriteError db "Error writing to target file ",0
Already db "Target already patched !",0
Version db "Incorrect  target file version ",0
ReadError db "Error reading from target file",0

patch proc hWnd:HWND
invoke CreateFile,addr TargetName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,\
FILE_ATTRIBUTE_NORMAL,NULL
mov hTarget,eax
invoke WriteFile,hTarget,addr WBuffer,27h,addr BytesWritten,NULL
invoke SetFilePointer,hTarget,27h,NULL,FILE_BEGIN
invoke WriteFile,hTarget,addr NameBuffer,50h,addr BytesWritten,NULL
invoke CreateFile,addr TargetName2,GENERIC_READ+GENERIC_WRITE,\
FILE_SHARE_READ+FILE_SHARE_WRITE,NULL,\
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
mov hTarget2,eax
invoke SetFilePointer,hTarget2,PatchOffset,NULL,FILE_BEGIN
invoke ReadFile,hTarget2,addr RBuffer,7,addr BytesRead,NULL
.if BytesRead == 7
mov eax, dword ptr [RBuffer]
        .if     eax==dword ptr [Sequence]
        invoke SetFilePointer,hTarget2,PatchOffset,NULL,FILE_BEGIN     
        invoke WriteFile,hTarget2,addr WBuffer2,2,addr BytesWritten2,NULL
                .if BytesWritten2==2
                invoke MessageBox,hWnd, addr Success,addr intes,MB_OK
                .else
                invoke MessageBox,hWnd, addr WriteError,addr intes,MB_OK
                .endif
               
        .elseif         eax==dword ptr [WBuffer2]
        invoke MessageBox,hWnd, addr Already,addr intes,MB_OK
        .else
        invoke MessageBox,hWnd, addr Version,addr intes,MB_OK
        .endif
.else
        invoke MessageBox,hWnd, addr ReadError,addr intes,MB_OK 
.endif
        invoke CloseHandle,hTarget
        invoke CloseHandle,hTarget2
       
        Ret
patch EndP


Note Finali

Un bacio a N. moglie perfetta ed impareggiabile amante!!!!!

Johan Padan


Disclaimer

I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.

Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevoli e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.