Pdf password remover v.3.0
From UIC
Pdf Password Remover v.3.0
Contents |
| Infos | |
|---|---|
| Author: | Johan Padan |
| Email: | |
| Website: | Home page |
| Date: | 14/06/2008 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| 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:
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.
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:
- cancellare il file license.dat (quello provvisorio creato in fase di lancio del programma) e ricrearne uno nuovo tutte le volte.
- 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:
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
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!!!!!
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.