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?
risposta
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ì.
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
@Damon: Questo sta facendo ciò che descrivo nel terzo paragrafo, da quello che posso dire (non ho letto tutto il codice in dettaglio). –
@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
- 1. Lettura da flusso di memoria a stringa
- 2. Creazione di file zip da un flusso di memoria C#
- 3. Esiste un in flusso di memoria che blocca come un flusso di file
- 4. Posso usare AVCaptureSession per codificare un flusso AAC in memoria?
- 5. Consumo di memoria di un flusso Scala parallelo
- 6. Come caricare l'intero flusso in MemoryStream?
- 7. Prolog- Caricamento di una libreria da un file
- 8. Posso caricare javascript da un file php?
- 9. Aggiunta di un'immagine da flusso di memoria a documento Excel
- 10. Ottenere un flusso da un percorso assoluto?
- 11. Creazione flusso di stream da un lungo flusso
- 12. Caricamento di una DLL da una posizione nella memoria
- 13. Libreria Javascript - Albero genealogico Diagramma di flusso
- 14. Creazione di un flusso di input dalla memoria costante
- 15. Impossibile caricare Rjava perché non può caricare una libreria condivisa
- 16. Come caricare una riga alla volta da un file pickle?
- 17. Carica libreria dinamica dalla memoria
- 18. Come posso eseguire secannotate.exe correttamente su una libreria che dipende da una libreria di classi portatili?
- 19. Caricare una libreria in un modello in CodeIgniter
- 20. Come creare un pacchetto su un flusso di memoria
- 21. Come caricare un UIView da una NIB?
- 22. Salvare e caricare un diagramma di flusso su jsPlumb
- 23. Posso caricare un file .gitconfig da un altro?
- 24. Come posso risolvere una perdita di memoria?
- 25. Ricerca di una stringa in un flusso di input
- 26. Lettura continua da un flusso?
- 27. h5py può caricare un file da un array di byte in memoria?
- 28. Caricare un database innodb MySQL nella memoria
- 29. Posso usare una libreria di nodi in un server Dart
- 30. differenza tra flusso di memoria e filestream
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
Ho bisogno della soluzione per Windows e Linux. –