Zoom Icon

PDF EDITOR V. 1.5 build 2911

From UIC

PDF EDITOR V. 1.5 build 2911

Contents


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



Introduzione

the first and only REAL editor for PDF files


Tools & Files


URL o FTP del programma


Essay

Pdf Editor v. 1.5 è un ottimo editor facile da usare e soprattutto molto leggero rispetto alla concorrenza.

Iniziamo, come al solito, a vedere la carta d’identità del programma. Aprendolo con PeId possiamo ricavare che è scritto in Visual C++, not pached, e vengono rilevate tramite il plugin Kanal 2.90 “solamente” una quindicina di cripto signatures.

PDFEDITOR1.jpg

Un’altra buona abitudine, per non saper né leggere né scrivere, è utilizzare il plugin presente in Olly, Ida sigs (coded by diablo2002) per ricavare il maggio numero di informazioni possibili.

PDFEDITOR2.jpg

A questo punto facciamo partire i programma per vedere che tipo di informazioni lascia trapelare:

PDFEDITOR3.jpg

Prima Soluzione

Il primo approccio che voglio provare è quello di eliminare le varie nag screens, anche se non nascondo che la tentazione di costruire subito il key file è notevole.

La prima cosa che farà il programma sarà cercare il key file e se non lo trova mandare la nag screen. Cerchiamo, quindi, tramite Ultra Search la stringa “pedkey” che appare rispettivamente agli offset 00239D48,002C66BA, 002FC1D2 e 002FC5B4.

Apriamo Olly dumpiamo a 00639D48 e settiamo un hardware breakpoint on access byte.

Olly brekka a 0047A2B2 si tratta di seguire il programma (F8) per vedere i diversi avvisi di “unregistered” finchè arriviamo all’indirizzo 005AABB5 dove troviamo la call responsabile della nag screen.

Il codice è sufficientemente chiaro, si tratta di saltare le relative call tramite:


005AAB9E JE è da trasformare in JMP// (741A deve diventare EB1A)
005AABBD JE è da trasformare in JMP (742D deve diventare EB2D).

La nag screen è sistemata.

Il secondo problemino riguarda i file.pdf salvati sui quali, in cima ad ogni pagina, viene aggiunto un “Edited by….Foxit …...”

Facciamo ripartire il nostro Ultra Search ed all’offset 00239F50 recuperiamo la stringa in questione.

In Olly dumpiamo a 00639F50 e applichiamo un hardware breakpoint on access byte sul primo char della stringa. Modifichiamo un file.pdf e lo salviamo tramite “Save As”; Olly a questo punta plana all’indirizzo 0047A01C. Seguiamo il programma con F8 sino al arrivare all’indirizzo 0041C7F8 dove troviamo la call responsabile della scritta sui nostri bei file.pdf appena modificati.

Appena sopra all’indirizzo 0041C7CE troviamo il JNZ responsabile da tramutare in JMP.


0041C7CE OF diventa E9
0041C7CF 85 diventa 80
0041C7D0 7F diventa 08
0041C7D1 08 diventa 00
0041C7D2 00 diventa 00
0041C7D3 00 diventa 90

Il terzo problemino nasce quando si cerca di salvare il file senza rinominarlo, quindi usando semplicemente la funzione “Save”. Appare una messagebox che avvisa “This evaluation copy add special mark……Do you want to continue with save operation ?”

In questo caso apriamo direttamente HexWorkshop cerchiamo la stringa relativa e la adattiamo alle nostre esigenze.

PDFEDITOR4.jpg


Per bypassare i controlli che il programma effettua a run- time dobbiamo creare un loader e caricare le modifiche appena viste. Usando “diablo2002 Universal Patcher” le modifiche appaiono come sotto evidenziato.


PDFEDITOR5.jpg

Seconda Soluzione

La seconda possibilità consiste nel creare il keyfile come viene chiaramente esplicitato nella nag screen iniziale. Le informazioni in nostro possesso sono:

  1. il percorso del keyfile
  2. il relativo nome del file di inizializzazione

Le api preposte alla lettura dei files .ini sono:

GetPrivateProfileStringA

GetPrivateProfileIntA

WritePrivateProfileStringA

LoadStringA

Proviamo con la prima mettiamo i relativi breakpoint e Olly brekka immediatamente all’indirizzo 0056B590. Appena sotto possiamo vedere come dovrà essere costruita la struttura del nostro file.ini.

[PDF Editor]

SN=47806

Modules=1

Users=10

Licensee=JohanPadan

ExpireDate=2050/12/31

Sign=JohanPadan

LicenseDate=2007/06/16

CDKey=140

Se scorriamo la routine all’indirizzo 0056B4A0 si possono notare i nomi di diversi programmi della casa di software e i relativi nomi dei key file. A buon intenditore…..

Si notano inoltre due chiamate ravvicinate a GetPrivateProfileStringA con due diverse sezioni una [ PDF Editor] e l’altra [Foxit License] dove la prima rappresenta la struttura del keyfile temporaneo mentre l’altra del keyfile definitivo.

Per quanto riguarda le date trovo nella ricerca delle stringhe all’indirizzo 0056BA84 il formato della data in notazione anglosassone "%04d/%02d/%02d" che equivale ad aaa/mm/gg. Per gli altri campi non trovo vincoli particolari se non dettati dalla capienza del buffer di destinazione.

Devo dire, ex-post ovviamente, che il verificare il formato della data mi ha portato nella sezione giusta del programma. Il filo conduttore è stato partire dalla chiamata a GetPrivateProfileStringA e dirottare il programma fino a portarlo alla chiamata GetLocalTime dove avrebbe dovuto verificare la mia data di scadenza con la data del sistema. L’obiettivo è stato quello di preparare un keyfile temporaneo con una expire date a lunghissima scadenza e farlo accettare al programma.

In verità avevo provato anche a preparare un keyfile definitivo ma mi sono perso nei meandri dei controlli .

Si parte da 0056B5BA dove il programma recupera il keyfile temporaneo ed effettua il jmp in quanto la sezione successiva tratta il key file definitivo. Il programma provvede a leggere tutti i dati del keyfile fino all’istruzione 056B6AE.


0056B6AE JE deve diventare JMP // 740D diventa EB0D

In effetti un salto verso la stringa “Unregistered” sembra una pazzia ma in realtà non dobbiamo dimenticarci che la qualifica “Registered” spetta esclusivamente al keyfile definitvo.


0056B6D4 JNZ divena JMP // 0F85ED010000 diventa E9EE01000090
0056B8DB JE diventa JMP // 740B diventa EB0B

Il senso dei jmp sopra evidenziati è permettermi di entrare direttamente in un’altra routine e avvicinarmi sempre più all’obiettivo finale.

Fino a 0056B9E4 il programma recupera i dati del keyfile posizionati precedentemente in variabili locali.


0056B9E4 JNZ diventa JMP // 750D diventa EB0D
0056B9FC JE diventa NOP // 0F84E7000000 diventa 909090909090

Il senso della noppata a 0056B9FC è che mi permette di arrivare a RegOpenKeyExA ed a RegQueryValueExA dove viene registrato il mio serial.


0056BA3B JNZ diventa JMP // 7518 diventa EB18

Finalmente dopo la chiamata a GetLocalTime; all’indirizzo 0056BA9B c’è un compare tra la mia data di scadenza 31/12/2050 e la data del sistema.


0056BAA6 JL diventa JMP // 7C36 diventa EB36

Ho scelto di saltare perché successivamente il programma rilegge tutti i dati del keyfile e quindi non poteva che essere la strada giusta. All’istruzione 0056BC1A il programma effettua un compare tra la mia license date e la data 01/12/2004. Il programma non accetta license date antecedenti al 01/12/2004.


0056BC25 JLE diventa JMP // OF8E8CFCFFFF diventa E98DFCFFFF90

L’ultimo jmp in effetti è superfluo però così facendo il programma funzionerà anche dopo il 31/12/2050 .

Riepilogo per comodità le patch da applicare:

PDFEDITOR6.jpg

A questo punto i controlli sono finiti, lasciate fluire il programma fino all’address 005B231F dove vi appare la maschera di congratulations.

PDFEDITOR7.jpg

Creiamo il nostro patcher ed abbiamo terminato.

Nella prima soluzione ho applicato un loader mentre nella seconda ho creato un patcher (sempre usando Diabloo2002); la scelta dipende da diversi fattori ma è legata fondamentalmente a quando viene eseguito il controllo di integrità sul programma rispetto alle nostre modifiche.


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.