Zoom Icon

DownloadExpress

From UIC

Download Express

Contents


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


Introduzione

Un programma indispensabile per ottimizzare i download da Internet. Supporta il resuming e il mirroring, una particolare tecnologia che permette di scaricare diverse parti di uno stesso file da più server contemporaneamente, in modo da ridurre i tempi di attesa.


Tools & Files



URL o FTP del programma


Essay

Apriamo il programma con PeId per vedere con che cosa avremo a che fare.

ASPack 2.12b -> Alexey Solodovnikov [Overlay]

La prima cosa da fare è eliminare aspack. Apriamo Olly e settiamo nella sezione debugging options, SFX come sotto indicato:

downloadexpress1.jpg

In questo modo Olly apre il programma e comincia il tracing fino ad ottenere l’OEP all’indirizzo 00461328. Con Olly dumpiamo il programma (Plugins\OllyDump\Dump debugged process) e deselezioniamo l’opzione Rebuild Import. Facciamo partire ImpRec ed in sequenza IAT Auto Search, GetImports. Show Invalid non segnala niente di strano, per cui possiamo fissare con “Fix Dump”. Il nuovo file.exe funziona!!

Facciamo ripartire PeId per vedere con che linguaggio è scritto, ed otteniamo le sotto indicate informazioni:

Borland Delphi 4.0 - 5.0

E tramite il plugin Krypto Analyzer di PeId:

downloadexpress2.jpg

La vedo dura !!

Comincio piazzando un bpx alla call GetDlgItem TextA e Olly brekka all’indirizzo 0043EAB6 dove si vedere il proprio codice di registrazione inserito. Con bpx a MessageBoxA Olly brekka all’istruzione 0043F343, con il messaggio “informazioni di registrazione non valide”. Steppando con F7 a partire dall’istruzione 0043EAB6 riesco ad individuare la call che si occupa di verificare il serial. 0043F1EA CALL.00429638. Da questa routine non sono riuscito a ricavare niente per cui devo ripiegare dal reversing al cracking. Cerco tramite “View call tree” tutte le chiamate a questa routine ed ottengo:

downloadexpress3.jpg

Setto un brkpoint (F2) su tutte le istruzioni precedenti e faccio ripartire Olly; il primo break lo ottengo all’istruzione 0043170F è ovvio che qui debba noppare la call di verifica del seriale e noppare il JE all’istruzione 00431716, infatti se premo F9 il programma parte non registrato e quindi non effettua più nessuna chiamata alle restanti call. A questo punto se compilo la editbox con il serial e premo F9, Olly brekka all’istruzione 0043F1F5 steppando arrivo all’istruzione 0043F1FE JE dove si capisce al volo che devo noppare diversamente con quel mega salto mi trovo fuori dalla finestra e raggiungo la fatidita MessageBoxA all’istruzione0043F343. Il Je che si trova all’istruzione 0043F21E è anch’esso da trasformare in JMP perché diversamente si vede che viene fatto un controllo sui giorni rimanenti rispetto ai 30 concessi della versione trial . Si arriva cosi’ alla MessageBoxA di congratulazione all’istruzione 0043F2B3.

A questo punto se salvate con Olly le modifiche effettuate e fate ripartire il programma dopo aver spostato in avanti l’orologio di sistema il programma funziona perfettamente senza aver eliminato, come previsto dopo i 30 giorni, le opzioni avanzate. Peraltro nelle condizioni di utilizzo “registrato a: “ non compare il mio nome, restano i bottoni per la richiesta di registrazione ed una frase che invita all’acquisto.Ovviamente in quanto il prg è stato modificato a “trial infinito”. Iniziamo l’operazione di chirurgia estetica.

Cercate il file DE_IT.int e apportate le seguenti modifiche:

162= azzerate tutta la scritta pubblicitaria

165=Registrato a: ( inserite il vostro nickmame)

Restano i tre bottoni. Fate ripartire Olly e mettete un breakpoint a CreateWindowExA il programma brekka a 0045C5EC; steppando con F9 vedrete che vengono create a run-time tutte le finestre, static e button. Alla 15° volta che pigiate F9 appare la creazione del button “Altre Info” ed in sequenza “acquista ora” e “Registra DE” poi successivamente crea altre finestre che non ci interessano.

downloadexpress4.jpg

downloadexpress5.jpg

Il mio obiettivo è quello di far si che durante la creazione a runtime per i 3 bottoni in questione non passi come informazione di Style 50000000 ma solo 40000000. Infatti il valore del flag WS_VISIBLE è 10000000 mentre il flag di WS_CHILD è 40000000. Per fare questo ho deciso di aggiungere una sezione all’eseguibile dove inserisco uno snippet code che modifica al momento opportuno il valore da 50000000 a 40000000.

Apro HexWorkShop, mi porto alla fine del file ed aggiungo 256 bytes digitando tutti zeri (Edit \Insert bytes) ,questo per incrementare la dimensione dell’eseguibile.

Apro l’eseguibuile con LordPe e aggiungo una sezione (Sections\Add section header)

downloadexpress6.jpg

Ho messo virtual size = raw size in modo che i bytes siano tutti mappati in memoria e il Flags tale per cui sia executable,readable, writeable.

Riapro Olly e vado all’indirizzo 0045C5CA e modifico le istruzioni in questo modo:

downloadexpress7.jpg

Il senso della modifica è tutte le finestre che vengono create sono CHILD+VISIBLE in base all’istruzione 0045C5CA e successivamente all’istruzione 0045C5CF faccio saltare il programma verso il mio code qui sotto evidenziato dove andrò ad eliminare il visible (sub eax,10000000) quando si sta creando il 15°, 16°, e 17° button.

la call .004d5000 all’istruzione 0045C5CF si ottiene facendo (004D5000-0045C5D4); in pratica per trovare l’indirizzo di destinazione dovete sottrarre a quest’ultimo l’indirizzo dell’istruzione successiva a quella di partenza.

Apro Olly e tramite il plugin NonaWrite scrivo il mio codice (il file può essere salvato e in caso di rettifiche si può richiamare e modificare)

downloadexpress8.jpg

Pigiando il tasto assembly ottengo:

downloadexpress9.jpg

Recupero gli opcodes dumpando in memoria tramite Olly “ D 004D5000” e salvandoli usando Olly plugin Data Ripper (settings in language string,format bytes) ottengo:

downloadexpress10.jpg

Edit copy, apro HexWorkShop Edit\Goto\Offset\D5000 poi Edit\PasteSpecial CF_Text e flag su Interpret as hexadecimal string ed il tutto risulta copiato nella sezione corretta salvo e chiudo.

Faccio ripartire il programma che a questo punto appare:

downloadexpress11.jpg

Una soluzione alternativa per l’eliminazione dei tre button consiste nel creare un file.dll modificare la import table e farla caricare direttamente dal loader di Windows. Cominciamo con lo scrivere il nostro codice in asm:


.386p
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
variabile BYTE 0
variab DWORD 268435456
.code
DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax, TRUE
ret
DllEntry endp
Patch proc
push edx
push ecx
xor edx, edx
xor ecx,ecx
mov cl, 14
cmp variabile,cl
jl saltomin
mov dl,16
cmp variabile,dl
jg saltomag
add variabile,1
sub eax, variab
pop ecx
pop edx
ret
saltomin:
add variabile,1
pop ecx
pop edx
ret
saltomag:
add variabile,1
pop ecx
pop edx
cmp variabile,30
jnz salto3
mov variabile,0
salto3:
ret
ret
Patch endp
End DllEntry

Ora assemblate e linkate per ottenere la nostra FirstDll.dll

Apro iidKing, programma che permette di aggiungere nuove sezioni agli eseguibili, e digito:

downloadexpress12.jpg

devo semplicemente cliccare su “Add Them” per ottenere una nuova sezione nel mio eseguibile denominata .iidking e viene generato un file .txt con le sotto indicate informazioni che rappresentano rispettivamente il nome di come chiamarla in asm e il relativo offset:

Patch: call dword ptr [4D51AC]

Posso verificare il tutto aprendo il file.exe con LordPe:

downloadexpress13.jpg

Apro HexWorkShop e modifco gli opcodes in modo da ottenere, in Olly, questo risultato:

downloadexpress14.jpg

downloadexpress15.jpg

Salvo e faccio ripartire il programma per ottenere lo stesso risultato visto in precedenza.

Le tecniche proposte, rapportate al problema da risolvere, sono sovradimensionate ma quello che mi interessava sottolineare è la potenzialità di queste tecniche applicabili a moltissime altre situazioni sicuramente più impegnative.



Note Finali

Thanks to:

dzzie “Adding new functions to compiled code”

+Malattia “trasformare un programma in un generatore di chiavi..”

Pusillus “Come inserire una nuova sezione e una nuova funzione in un PE”

Iczelion “Le Dynamic Link Libraries “

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.