DownloadExpress
From UIC
Download Express
Contents |
| DownloadExpress | |
|---|---|
| Author: | Johan Padan |
| Email: | |
| Website: | Home page |
| Date: | 09/03/2006 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| 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:
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:
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:
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.
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)
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:
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)
Pigiando il tasto assembly ottengo:
Recupero gli opcodes dumpando in memoria tramite Olly “ D 004D5000” e salvandoli usando Olly plugin Data Ripper (settings in language string,format bytes) ottengo:
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:
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:
.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:
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:
Apro HexWorkShop e modifco gli opcodes in modo da ottenere, in Olly, questo risultato:
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!!!!!
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 malevole 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.











