Salve a tutti amici!!!
Mi presento qui: sono Danrevella, ho 50 anni e qualche minima esperienza di programmazione.
Ultimamente mi gira per la testa un problema: come posso caricare in memoria un programma .exe senza che esso risieda fisicamente sull'hard disk?
Per quale ragione vorrei farlo? Ve ne potrei dare mille, ma una in particolare è quella che m'interessa di piu': un file che si carica e si esegue tutto direttamente in memoria, NON e rilevabile da alcun antivirus.........
Cio' puo' essere utilizzato per scopi buoni o cattivi, ma cio' credo valga praticamente per ogni concetto che qui si cerca di spiegare, dico bene?
Ora cercherò di spiegarmi meglio:
Vorrei fare un semplice packer e lo spunto (non il sorgente purtroppo....) l'ho preso da un programma che svolge piu' o meno quanto segue:
n tutta questa faccenda però non mi importa della compressione e/o delle eventuali protezioni.... a me interessa capire una cosa sola:
COME SI FA A CARICARE UN EXE IN MEMORIA SENZA AVERLO FISICAMENTE SU DISCO?(il resto può arrivare dopo...)
---------------------------------------------------------------------------------------------------------
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 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 ses tesso sul disco fisso!!!
Ho provato con diversi file exe e mi funzionano tutti. Se qualcuno è interessato ad aiutarmi a reversare questo stub posso uplodare il file da qualche parte.
Grazie per l'attenzione.
Danrevella
|