Condividi:        

costruire da ZERO un packer/crypter in C

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Anthony47, Triumph Of Steel, archimede

costruire da ZERO un packer/crypter in C

Postdi danrevella » 30/05/08 21:40

Salve amici!!!
Vorrei chiedere se qualcuno di Voi è interessato a scrive insieme a me un passo alla volta un programma di protezione, il cui risultato finale dovrebbe essere quello di:
-) sfuggire ai debugger
-) non essere "dumpabile"
-) non essere rilevato dagli antivirus (che voi mi insegnate ultimamente danno un numero esagerato di falsi positivi...)
-) essere in grado di funzionare anche su macchine con il controllo DEP attivato
-) etc.....
Però mi spiego meglio: io ho diverse idee ed ho già raccolto diverso codice, però ho dei grossi problemi nel passare dalle idee alla codifica, ho pensato quindi che una costruzione del programma da zero, potrebbe essere un buon esercizio per un newbie che potrebbe vedere come sorge il programma un po' alla volta, mentre chi è piu' esperto potrebbe dare una supervisione e dei consigli per l'ottimizzione, etc.
Insomma farne una specie di mini-progetto da seguire in un gruppo di persone collaborando attivamente.... Tra l'altro ho proposto di farlo in C, linguaggio che mi pare appropriato per chi è all'inizio, ma nel frattempo l'argomento mi pare abbastanza stimolante, visto che si tratta in parte anche di far fare le "acrobazie" a certe API di Windows.
Pertanto avrei identificato un modello di esecuzione ispirandomi ad un semplice packer di cui ho provato a ricavarne il funzionamento debuggandolo con Ollydbg, vi spiego cosa ne è venuto fuori:
Ho trovato solo un sorgente di un packer scritto in C, ma non fa al caso mio: il suo stub non fa altro che decompattare in un file temporaneo e poi eseguire tale file.
C'era, è vero un sorgente scritto da un certo Poke che invece decompattava in memoria, ma è scritto in Delphi ed a parte il fatto che non lo capisco, non possiedo nemmeno il compilatore.
In tutta questa faccenda però non mi importa della compressione e/o delle eventuali protezioni.... a me interessa capire una cosa sola (inizialmente...):
COME SI FA A CARICARE UN EXE IN MEMORIA SENZA AVERLO FISICAMENTE SU DISCO?
---------------------------------------------------------------------------------------------------------
Mi sono armato di tanta pazienza ed ho esaminato forse un centinaio di programmi di packing ed ho cercato di capire il funzionamento dello stub..... e ho trovato uno il cui autore ammette che lo stub è scritto in C è che non è a sua volta protetto, difatti l'output di Ollydbg è piuttosto cristallino (almeno per un esperto).
Mi pare di capire quanto segue:
-) il file che d'ora in poi chiamerò packed.exe è formato dallo stub.exe (circa 3kb) e dal programma che gli abbiamo fatto packare che chiamerò original.exe.
-) per ottenere packed.exe si fa così: si prende un qualsiasi file exe (ad es. master.exe) e.......
c:>copy /b stub.exe+master.exe packed.exe
-) Insomma, lo stub è sempre uguale, basta accodargli un exe e lui (lo stub) sa esattamente come fare per eseguirlo in memoria senza swappare sull'hd
-)Ecco i passi che compie (almeno cio' che io sono riuscito a capire da Olly), almeno quelli principali:
si supponga: stub.exe lungo 3.000 bytes, master.exe 17.000 bytes
1) Ricava il nome del file ed il percorso, ad es.: c:\packed.exe (ovvero lui stesso)
2) Ricava la lunghezza di packed.exe ------->20.000
3) Apre se stesso quale file dati in sola lettura
4) Effettua (20000-3000)=17000 e quindi carica in una zona di memoria 17000 bytes a partire dall'offset 3001 (in pratica l'intero file master.exe viene caricato in una zona di memoria)
5) Chiama CreateProcessA dandogli come parametro il dato ottenuto al punto 1): c:\packed.exe (ovvero lui stesso); il processo viene creato in forma sospesa.
6) Effettua giusto una manciata di istruzioni (almeno così a me sembra...) nel corso delle quali invoca : ReadProcessMemory, VirtualQueryex, e finalmente 2 serie di WriteProcessMemory prelevando i dati ottenuti nel precedente punto 4)...
7) Sblocca il processo testè creato, e tutto funziona master.exe sta funzionando, e NON esiste una copia di se stesso sul disco fisso!!!
*************************************************************************************************************************
Allora... a qualcuno interessa questa avventura?

Grazie per avermi letto e saluti a tutti.

Danrevella
danrevella
Utente Junior
 
Post: 27
Iscritto il: 27/10/03 18:35

Sponsor
 

Re: costruire da ZERO un packer/crypter in C

Postdi zello » 03/06/08 13:37

Apre se stesso quale file dati in sola lettura

No, direi di no. Per quanto mi ricordo io, un file in esecuzione non è apribile neppure in sola lettura.
A parte che in memoria c'è già, non importa rileggerlo da disco (in windows, per quanto ne so io, il loader carica comunque tutto il file, anche le parti non riferite dall'header, ma potrei sbagliarmi. In tal caso basta includerlo tra le risorse, invece di copiarlo fisicamente in coda al file; così viene caricato senz'altro), io farei il lavoro del linker:
- creerei un processo sospeso
- ci caricherei nel suo spazio il mio eseguibile, rispettando la distribuzione delle varie sezioni (studia gli headers pe, sono discretamente documentati)
- linkerei a mano (con tanto di compilazione della IAT e di eventuali rilocazioni)
- farei ripartire il programma dall'entry point.
Non dovrebbe essere complicatissimo, ma neppure divertente. Il fatto di non essere dumpabili è ben più complicato (puoi rendere la vita difficile ad un debugger, ma difficilmente gliela renderai impossibile). Io avevo pistolato sia con gli indirizzi di ritorno (usando jmp al posto di call per usare una API inutile e dando un doppio ritorno, il primo alla funzione che volevo chiamare, il secondo al punto effettivo di ritorno), sia leggendo direttamente il peb per sostituire IsDebuggerPresent (via tib, e quindi via il registro di segmento fs), sia sostituendo GetProcAddress con una mia funzione (GetProcAddress è spesso intercettata dai debuggers).
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Re: costruire da ZERO un packer/crypter in C

Postdi danrevella » 03/06/08 15:29

zello ha scritto: In tal caso basta includerlo tra le risorse, invece di copiarlo fisicamente in coda al file; così viene caricato senz'altro),

Non ti chiedo una spiegazione dettagliata, ma agrandi linee come si fa a caricare un file in una risorsa?
Grazie, Ciao!!

Danrevella
danrevella
Utente Junior
 
Post: 27
Iscritto il: 27/10/03 18:35

Re: costruire da ZERO un packer/crypter in C

Postdi zello » 03/06/08 16:03

FindResource/SizeOfResource/LoadResource/LockResource, guarda le relative documentazioni sul pSDK. Alla fine della fiera ti trovi con un puntatore all'inizio dell'eseguibile.
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Re: costruire da ZERO un packer/crypter in C

Postdi zello » 03/06/08 16:06

Ah, ho risposto fuori tema, tu mi chiedevi come inserire una risorsa, non come estrarla. Due sistemi:
- dal tuo editor di risorse preferito, oppure
- manipolando direttamente le risorse via programma (non è complicatissimo, ma neppure divertente. Sono archiviate in una struttura ad albero al limite dell'incomprensibile, però se ne hai bisogno devo aver scritto qualcosa tempo fa; ci sono anche funzioni per modificarle "al volo", non funzionano - se mi ricordo bene - sotto win9x,
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Re: costruire da ZERO un packer/crypter in C

Postdi danrevella » 03/06/08 16:28

zello ha scritto:non è complicatissimo, ma neppure divertente.

Grazie mille, intanto...
Sai una cosa piu' mi addentro in questo "favoloso" progetto di reversing e piu' mi rendo conto che non è affatto divertente..... :(
Ho paura che rinuncerò......

Ciao a tutti!!

Danrevella
danrevella
Utente Junior
 
Post: 27
Iscritto il: 27/10/03 18:35


Torna a Programmazione


Topic correlati a "costruire da ZERO un packer/crypter in C":


Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti