Zoom Icon

Pdf password remover v.3.0

From UIC

Pdf Password Remover v.3.0

Contents


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



Introduzione

Pdf password remover serve per rimuovere le protezioni presenti nei files formato .pdf e che impediscono di stampare e/o modificare il file stesso.


Tools & Files


URL o FTP del programma


Essay

Iniziamo aprendo il nostro file che PeId per rilevare che è protetto con UPX 0.89.6-1.02; potremmo utilizzare il plugin presente in Peid per unpackarlo ma preferisco creare un loader invece che un packer.

Appena installato il programma appare un messaggio che ci avvisa della possibilità di usare il programma per 50 volte. Nella stessa cartella del programma non possiamo non notare la creazione di un file license.dat.

Aprendolo con PeId ricaviamo che il programma è scritto in Microsoft Visual C++ 6.0.

Apriamo il programma con Olly e tramite la ricerca con il plugin string reference individuiamo un paio di informazioni interessanti:

004054E4 CMP ESI, 32 ; rappresentano i nostri 50 tentanativi a disposizione
00404C16 cmp eax,14 ;rappresenta la lunghezza del nostro serial pari a 20 chars.

Se nel piazzare i primi breakpoints teniamo presente che il programma ha già predisposto un file del tipo license.dat sicuramente appena il programma parte va a leggere il file per vedere se siamo già registrati oppure no. Quale migliore API di GetPrivateProfileStringA potremmo usare per tale scopo !! Il programma brekka a 00404F8A e da qui possiamo ricavare immediatamente la struttura del nostro filettino: SECTION “VeryPDFWDR” KEY “ Regcode”


Dall’istruzione 00404C16 dove viene richiesta la lunghezza del serial pari a 20 chars altrimenti il programma si chiude c’è tutta una serie di calls e di je che ti permettono di proseguire fino a raggiungere un campanello d’allarme del tipo SETE AL.

00404C57  JE ; da convertire in JMP (da 74 ad EB)
00404C96  JE;da convertire in JMP  (da 74 ad EB)
00404CD5  JE;da convertire in JMP  (da 74 ad EB)
00404CE4  JE;da convertire in JMP  (da 74 ad EB)
00404CF3  JE;da convertire in JMP  (da 74 ad EB)
00404D09 SETE AL ; da convertire in SETNEAL (da 94 a 95)

A questo punto se immettete nel campo Registration Key il serial di 20 chars e apportate le modifiche sopra evidenziate vi trovate registrati e il file license.dat ha memorizzato il vostro serial. Vista la semplicità del file in questione mi voglio cimentare nella creazione di un loader che dovrebbe fare tutte queste le modifiche sotto evidenziate:

  1. cancellare il file license.dat (quello provvisorio creato in fase di lancio del programma) e ricrearne uno nuovo tutte le volte.
  2. Predisporre il testo del file license.dat

[VeryPDFPWDR] Used=6 RegCode=11111111111111111111

3. per permettere al programma di unpackarsi creo un loop infinito sul JUMP che mi porta all’OEP sulla sotto indicata istruzione:

004CD1A4 JUMP 0046564D ; ""E9 A4"" 84 F9 FF diventa ""EB FE"" 84 F9 FF

4. Applicare le patch in memoria viste prima, riportare il valore del OEP al suo valore corretto e ripristinare il thread. Apriamo in nostro WinAsm ed iniziamo a scrivere il nostro loader: |pdf

title loader per pdf password remover v. 3.0
comment  !
il programma elimina il file license.dat e ne crea uno nuovo.si patcha il programma dopo aver messo in standby il programma
che è  packed con upx
!
.386
.model flat,stdcall
option casemap:none
include                 windows.inc
include                 kernel32.inc
include                 user32.inc
include gdi32.inc
include ufmodapi.inc
includelib              kernel32.lib
includelib              user32.lib
includelib      gdi32.lib
.data
TargetName2 db "license.dat",0
TargetName db"winDecrypt.exe",0
WBuffer db "[VeryPDFPWDR] ",0dh,0ah
                db "Used=6",0dh,0ah
                db "Regcode=johanpadanjohanpadan",0            

ProcError               db                      "Error starting target process. Is loader in same folder as target!",0
ReadError               db                      "Error reading from target process",0
Version                 db                      "Incorrect target file version!",0
WriteError              db                      "Error writing to target process",0
ContextError            db                      "GetThreadContext failed. Target process terminated?",0
Sequence                db                      74h,09h,5Fh,5Eh ;la sequenza che voglio modificare (solo il primo byte)
StopVA                  dd                      004CD1A4h ; è il jump che porta ad OEP
OEPBytes                db                      0E9h,0A4h ; sono i primi due bytes dell'istruzione di jump
StopCode                db                      0EBh,0FEh ; modifica dei due byte sopra indicati per creare un loop infinito
PatchVA                 dd                      00404C57h ;è l'address dove si trova la sequenza
PatchVA1                        dd                      00404C96H
PatchVA2                        dd                      00404CD5H
PatchVA3                        dd                      00404CE4H      
PatchVA4                        dd                      00404CF3H
PatchVA5                        dd                      00404D09H
PatchByte               db                      0EBh
PatchByte1              db                      0EBh
PatchByte2              db                      0EBh
PatchByte3              db                      0EBh
PatchByte4              db                      0EBh
PatchByte5              db                      0FH,95H
.data?
ThreadContext           CONTEXT                 <>
StartupInfo             STARTUPINFO             <>
ProcessInfo             PROCESS_INFORMATION     <>
StopBuffer              dw                      ?
ReadBuffer              dd                      ?
ReadBuffer1             dd                      ?
ReadBuffer2             dd                      ?
ReadBuffer3             dd                      ?
ReadBuffer4             dd                      ?
ReadBuffer5             dd                      ?
Buffer                  dd                      ?
Buffer1                 dd                      ?
Buffer2                 dd                      ?
Buffer3                 dd                      ?
Buffer4                 dd                      ?
Buffer5                 dd                      ?
hInstance       HINSTANCE       ?  
hTarget   HINSTANCE     ?
BytesWritten db   ?
hBitmap dd ?
.const
ARIcon          equ             2001
.code
start:
  invoke CreateFile,addr TargetName2,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,\
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
mov hTarget,eax
invoke WriteFile,hTarget,addr WBuffer,52,addr BytesWritten,NULL
        invoke CloseHandle,hTarget
; la prima parte si occupa di creare il file license.dat
invoke CreateProcess,addr TargetName,0,0,0,0,CREATE_SUSPENDED,0,0,\
addr StartupInfo,addr ProcessInfo
        .if eax==0
                invoke MessageBox,0,addr ProcError,0,0
        .else
                invoke ReadProcessMemory,ProcessInfo.hProcess,StopVA,addr StopBuffer,2,addr Buffer
                mov ax,word ptr [StopBuffer]
                .if ax==word ptr [OEPBytes]
                        invoke WriteProcessMemory,ProcessInfo.hProcess,StopVA,addr StopCode,2,addr Buffer
                        invoke ResumeThread,ProcessInfo.hThread
                        invoke Sleep,10
                        mov ThreadContext.ContextFlags,CONTEXT_FULL
@@:
                        invoke GetThreadContext,ProcessInfo.hThread,addr ThreadContext
                        .if eax==0
                                invoke MessageBox,0,addr ContextError,0,0
                                jmp @Error
                        .else
                                mov eax,StopVA
                                .if eax==ThreadContext.regEip
                                        invoke SuspendThread,ProcessInfo.hThread
                                        invoke ReadProcessMemory,ProcessInfo.hProcess,PatchVA,\
                                        addr ReadBuffer,4,addr Buffer
                                        mov eax,dword ptr [ReadBuffer]
                                        .if eax==dword ptr [Sequence]
                                                invoke WriteProcessMemory,ProcessInfo.hProcess,PatchVA,\
                                                addr PatchByte,1,addr Buffer
                                               
                                                invoke ReadProcessMemory,ProcessInfo.hProcess,PatchVA1,\
                                                addr ReadBuffer1,4,addr Buffer1
                                                invoke WriteProcessMemory,ProcessInfo.hProcess,PatchVA1,\
                                                addr PatchByte1,1,addr Buffer1
                                               
                                                invoke ReadProcessMemory,ProcessInfo.hProcess,PatchVA2,\
                                                addr ReadBuffer2,4,addr Buffer2
                                                invoke WriteProcessMemory,ProcessInfo.hProcess,PatchVA2,\
                                                addr PatchByte2,1,addr Buffer2
                                               
                                                invoke ReadProcessMemory,ProcessInfo.hProcess,PatchVA3,\
                                                addr ReadBuffer3,4,addr Buffer3
                                                invoke WriteProcessMemory,ProcessInfo.hProcess,PatchVA3,\
                                                addr PatchByte3,1,addr Buffer3
                                               
                                                invoke ReadProcessMemory,ProcessInfo.hProcess,PatchVA4,\
                                                addr ReadBuffer4,4,addr Buffer4
                                                invoke WriteProcessMemory,ProcessInfo.hProcess,PatchVA4,\
                                                addr PatchByte4,1,addr Buffer4
                                               
                                                invoke ReadProcessMemory,ProcessInfo.hProcess,PatchVA5,\
                                                addr ReadBuffer5,4,addr Buffer5
                                                invoke WriteProcessMemory,ProcessInfo.hProcess,PatchVA5,\
                                                addr PatchByte5,2,addr Buffer5
                                                invoke WriteProcessMemory,ProcessInfo.hProcess,StopVA,\
                                                addr OEPBytes,2,addr Buffer;ripristina OEP
                                                invoke ResumeThread,ProcessInfo.hThread
                                                jmp @Exit
                                        .else
                                                invoke MessageBox,0,addr Version,0,0
                                                jmp @Error
                                        .endif
                                .else
                                        invoke Sleep,10
                                        jmp @b
                                .endif
                        .endif
                .else
                        invoke MessageBox,0,addr Version,0,0
                .endif
@Error:
                invoke TerminateProcess,ProcessInfo.hProcess,0
        .endif
@Exit: 
        invoke ExitProcess,NULL
end start

Mettete il loader nella stessa cartella del programma e… stampate/modificate il vostro pdf a piacere.


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.