caricare un exe in memoria non da hard disk

Stato
Discussione chiusa ad ulteriori risposte.

danrevella

Utente Silver
28 Maggio 2008
0
0
0
57
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
 
danrevella ha detto:
Salve a tutti amici!!!
Mi presento qui: sono Danrevella, ho 50 anni e qualche minima esperienza di programmazione.
Ciao benvenuto! :) (Il messaggio di presentazione va nella sezione apposita)

danrevella ha detto:
Ultimamente mi gira per la testa un problema: come posso caricare in memoria un programma .exe senza che esso risieda fisicamente sull'hard disk?
bhe penso che ci sei riuscito:
danrevella ha detto:
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.

a che ti serve sapere il sorgente? hai provato a cercare se c'è un'equivalente per linux? lo troveresti sicuramente open source
 
Grazie per il veloce riscontro...
Diciamo che avere compreso tramite disassembling con Olly NON significa purtroppo saper riscrivere la stessa cosa in C, il percorso da eseguire è piuttosto lungo, ma soprattutto ci sarebbe molto da imparare!!
Però io da solo non ce la faccio ecco perchè ho postato: vorrei fare questo lavoro in gruppo con qualcuno.
Io penso che sia interessante capire come si possa usare in modo "alternativo" le API di windows, tenendo presente che lo stub è solo di 3 kb, quindi la mole di lavoro non è enorme, ed inoltre è attuale, in quanto funziona regolarmente anche sotto Vista....
Per quanto riguarda linux, sicuramente non potrei trovare nulla di analogo: il progetto riguarda un uso "underground" delle api native di windows...
In ogni caso sono mesi che saccheggio la rete alla ricerca di un sorgente C capace di fare questa cosa, ma pare che chi ce li ha se li tenga, e questo non è giusto!!!! Le informazioni devono essere libere e condivise, quindi il mio progetto è qui per colmare questa lacuna, quindi aiutatemi per il bene comune..... (beh forse ho un pochino esagerato.... comunque il senso è questo...)

Saluti a tutti.
Danrevella
 
danrevella ha detto:
...
come posso caricare in memoria un programma .exe senza che esso risieda fisicamente sull'hard disk?
...
3) Apre se stesso quale file dati in sola lettura
...
Direi che ti sei risposto da solo ;)

Il procedimento che hai notato in realtà non fa quello che tu vorresti, dato che comunque una copia risidere sempre sull'HD, anche se "mascherata". Comunque rispondendo alla tua domanda: si, si può fare, ma implica che devi essere in rete con altri computer. In teoria è possibile far eseguire un programma senza che sia fisicamente presente sull'HD (anche se almeno una volta deve esistere la copia del programma su HD [ot]non mi dilungo sulla possibilità di non far esistere del tutto la copia del programma perché è si possibile ma abbastanza complesso e non trattabile in due parole[/ot]), semplicemente deve provenire da un altro pc ;) (tipo cache di un browser, che però viene salvata solo in ram ed eseguita).
 
Si, effettivamente ho capito a grandi linee che cosa fa il programma, ma ora vorrei trascrivere in un sorgente C tale lavoro, e non è una cosa semplice, ed inoltre ci sarebbe molto da imparare, ma io da solo non ne ho le capacità, se qualcuno volesse partecipare..........
qui c'è il file: hxxp://w_ww.sendspace.com/file/sieqsx
Dal momento che c'è un file packato, è normale che un eventuale antivirus dia una falsa segnalazione, così coe per la quasi totalità dei files compressi.
Ovviamente è un falso positivo.
Saluti
 
in tutta sincerità non capisco dove risede la difficoltà. ma sopratutto perchè reversare quello quando si puo' scrivere un loader che esegue eseguibili direttamente in memoria? :)
 
Predator ha detto:
in tutta sincerità non capisco dove risede la difficoltà. ma sopratutto perchè reversare quello quando si puo' scrivere un loader che esegue eseguibili direttamente in memoria? :)
Caro Predator!!!
Hai perfettamente ragione, ma le mie difficoltà sono le seguenti:
1) Vorrei farlo in C, non in C++ o Delphi, etc....
2) Ho saccheggiato la rete ma di esempi in C non ne ho trovati: tutti i sorgenti degli stub erano in asm...... :-(
3) NON sono capace di farlo, sia per la mia limitatezza mentale che ammetto tranquillamente..... vorrei essere un programmatore, un reverser, etc. ma sono anni che ci provo ed ormai sono piuttosto anzianotto (over 50... ma non indaghiamo oltre, vi prego...)
A causa della mia incompetenza su altri forum che qui preferisco non menzionare sono stato preso a pesci in faccia, deriso e maltrattato, pur essendomi io sempre comportato in modo tranquillo e pur essendo sempre partito dal presupposto della mia ignoranza..
Mi auguro vivamente che su questo forum cio' non accada, e qualcuna voglia darmi una mano, io prometto di impegnarmi...

Grazie a tutti coloro che mi hanno letto e che vorranno darmi una mano

Danrevella
p.s. se qualcuno di voi ha già codificato qualcosa del genere e volesse sottopormelo, io mi impegno a studiare e a commentare il tutto...
 
Dunque dunque...
intanto l'età non è un limite :)
certo una mente giovane assimila meglio, in quanto ha meno schemi mentali ma non è proprio un limite.
il C è ad un passo dall'asm, se hai trovato sorgenti in assembler non dovrebbe essere molto difficile "tradurlo"
personalmente quando devo codare in C, io preferisco farlo in asm...
cmq tu lo devi per forza fare in c questo programma?
un packer/cripter che crea un processo da una stringa in memoria premette la conoscenza di concetti del formato PE (l'exe).

a mio avviso dovresti comprendere buona parte di questo documento
http://www.ntcore.com/Files/pe.htm
scritto dal mitico (mi inchino) Daniel Pistelli, alias Ntoskrn.

poi acquisite le conoscenze, potresti fare come ho fatto io... avvi un exe che da una stringa (il secondo eseguibile) sostituisce completamente a sè stesso e si autorilascia :)
questa tecnica ha destato interesse a diversi reverser di alto livello.

oppure senza farsi tanto male, spulcia programmi tipo upx o qualsiasi altro packer o semplicemente un crypter, cosi' non hai compressione che è piu' difficile da gestire.

Pred
 
Grazie per il link!!!!
Ho già iniziato a guardarlo...... se potessi direi...... (che pup*** ehm) ma invece dico solo: che meraviglia..... :)))
In ogni caso, la mia mente anziana ha molti neuroni in meno.... :-(
Comunque a me non è assolutamente possibile risalire ad un sorgente C partendo da uno in asm..... io l'asm non lo comprendo quasi... :-((
Il C (non C++) è l'unico linguaggio che conosco (e nemmeno tanto bene...), e sinceramente non pensavo che si potesse fare uno stub in C, finchè non ho visto quello che ho proposto di aiutarmi a riversare e/o a rifare ispirandosi a qualcos'altro.........
Comunque... sorgenti in C di stub NON ne ho trovati, se qualcuno ha già fatto qualcosa del genere e può aiutarmi con codice e /o spezzoni di codice, ben venga, altrimenti, è ovvio, non posso certo pretendere che qualcuno faccia il lavoro al mio posto..... sono anziano ma non (ancora) completamente rimbambito.
Grazie a tutti e saluti.
Danrevella
 
il al momento l'ho scritto in assembler e visual basic (un miracolo per quel linguaggio, molti pensano sia l'unico codice presente in internet). al momento non ho tempo per buttarmi sulla riscrittura del sorgente in C, ma se personalmente trovo qualcosa ti avviso....
non è che è ora di espandere gli orrizzonti imparando il c++? :)
 
Predator ha detto:
il al momento l'ho scritto in assembler e visual basic (un miracolo per quel linguaggio, molti pensano sia l'unico codice presente in internet). al momento non ho tempo per buttarmi sulla riscrittura del sorgente in C, ma se personalmente trovo qualcosa ti avviso....
non è che è ora di espandere gli orrizzonti imparando il c++? :)
Certo sarebbe bello iniziare il C++ ma purtroppo per il momento per quel che mi riguarda è ancora prematuro: quando faccio dei programmi in C, anche se semplici semplici, faccio così tanti errori di sintassi che ho assolutamente bisogno di chiarirmi ancora le idee.
In ogni caso, sorgenti, link, pezzi di codice, qualsiasi cosa per me sarà benvenuta e mi aiuterà per lo meno ad iniziare.
Ahhh.... Visual basic hai detto uno stub?
Non conosco il Visual basic ma tu mi fai capire che nonostante i puristi lo snobbino in realtà sembra avere grandi potenzialità.
Saluti a tutti!!

Danrevella
 
Stato
Discussione chiusa ad ulteriori risposte.