2013-08-20 14 views
9

Posso caricare una libreria da un flusso di memoria? Ad esempio la mia libreria è codificata in un file. Controllo alcune condizioni e decrypt il file in un flusso di memoria. Ora ho bisogno di caricare la libreria decrittografata da quel flusso nella mia applicazione e utilizzare le sue funzioni ecc.Posso caricare una libreria da un flusso di memoria?

+1

Trovato per OSX: http://stackoverflow.com/questions/11821955/load-dynamic-library-from-memory e questo per Windows: http://stackoverflow.com/questions/638277/loading-dll- from-a-location-in-memory – koopajah

+0

Ho bisogno della soluzione per Windows e Linux. –

risposta

4

In Windows, una DLL può essere caricata solo da un file - come suggerito dai collegamenti, è possibile creare un ramdisk e installarlo come unità, ma non c'è modo di aggirare la DLL che deve essere caricata attraverso un file che esiste in un filesystem. Parte della ragione di ciò è che la DLL è "richiesta caricata", ovvero il sistema non carica l'intero file in memoria in una sola volta, carica le parti effettivamente utilizzate, 4 KB (in genere) alla volta. Inoltre, non viene scambiato nell'area di swap, viene semplicemente scartato e ricaricato dalla DLL se il sistema sta esaurendo la memoria.

Linux funziona in un modo molto simile (so che utilizza lo stesso tipo di caricamento della domanda di default, ma non è sicuro se c'è un modo per aggirarlo), quindi non credo che ci sia un altro modo lì entrambi, ma non l'ho esaminato in profondità.

Ovviamente, se tutto ciò che si desidera è una parte di codice che è possibile utilizzare nell'applicazione e si desidera archiviarlo come crittografato/compresso/qualsiasi cosa nel file eseguibile, è possibile allocare una parte di memoria eseguibile (in Windows, è possibile utilizzare VirtualAlloc per allocare memoria eseguibile). Tuttavia, è necessario assicurarsi di spostare tutti gli indirizzi di memoria assoluti nel codice se lo si fa, quindi sarà necessario memorizzare le informazioni di trasferimento nel file eseguibile.

Chiaramente, la soluzione facile è decomprimere il contenuto in un file nel filesystem e caricare da lì.

+0

Vedere https://github.com/fancycode/MemoryModule per una soluzione decisamente migliore di ramdisk (se esiste una soluzione "buona" o "migliore", non penso che sia una buona idea provare dall'inizio). – Damon

+0

@Damon: Questo sta facendo ciò che descrivo nel terzo paragrafo, da quello che posso dire (non ho letto tutto il codice in dettaglio). –

+0

@MatsPeterson: Sì, è esattamente quello che fa. È un'implementazione funzionante (l'ho provato alcuni anni fa) e leggermente migliore rispetto all'approccio "ramdisk" per ciò che l'OP vuole (dal momento che si può comunque leggere il file non crittografato dal ramdisk). Anche se, naturalmente, non ritengo comunque opportuno manomettere quella roba, poiché interferisce seriamente con la gestione della VM e in qualche modo contraddice anche il concetto di una libreria condivisa. Il punto in cui le DLL sono basate su file è che puoi mappare le stesse pagine a diversi processi, buttarli via e ricaricare su richiesta. – Damon

Problemi correlati