
Driver del kernel Linux per l'acquisizione di memoria fisica, che consente l'accesso in lettura a qualsiasi indirizzo fisico, inclusi memoria riservata e buchi di memoria, con informazioni CR3 e servizi di traduzione da virtuale a fisico.

Come la sua controparte Windows, Winpmem, non è uno strumento tradizionale di dump della memoria. Linpmem offre un'API per leggere da qualsiasi indirizzo fisico, inclusa la memoria riservata e i buchi di memoria, ma può essere utilizzato anche per il normale dump della memoria. Inoltre, il driver offre una varietà di modalità di accesso per leggere la memoria fisica, come le modalità byte, word, dword, qword e buffer, dove la modalità buffer è appropriata nella maggior parte dei casi standard. Se la lettura richiede una lettura allineata byte/word/dword/qword, Linpmem farà esattamente questo.
Attualmente, le funzionalità di Linpmem includono:
Il controllo della cache verrà aggiunto in futuro per supportare le modalità di accesso specializzate.
Almeno per ora, devi compilare il driver Linpmem da solo. È in lavorazione, ma non ancora terminato, un metodo per caricare un driver Linpmem precompilato su altri sistemi Linux. Detto questo, compilare il driver Linpmem non è difficile, sostanzialmente si esegue 'make'.
Hai bisogno di make e di un compilatore C. (Raccomandiamo gcc, ma anche clang dovrebbe funzionare).
Assicurati di avere installati i linux-headers (usando qualsiasi gestore di pacchetti abbia la tua distribuzione Linux di destinazione). Il nome esatto del pacchetto può variare a seconda della distribuzione.
Un modo rapido (indipendente dalla distribuzione) per verificare se hai il pacchetto installato:
ls -l /usr/lib/modules/`uname -r`/
Questo è tutto, puoi procedere al passo 2.
Sistema estraneo: Attualmente, se vuoi compilare il driver per un altro sistema, ad esempio perché vuoi creare un dump della memoria ma non puoi compilare sulla macchina di destinazione, devi scaricare il pacchetto header direttamente dai repository dei pacchetti della distribuzione Linux di quel sistema. Ricontrolla che la versione del pacchetto corrisponda esattamente alla versione della release e del kernel in esecuzione sul sistema estraneo. Se l'altro sistema utilizza un kernel auto-compilato, devi ottenere una copia della directory di compilazione di quel kernel. Quindi, imposta il percorso di una delle due directory nella variabile d'ambiente KDIR.
export KDIR=path/to/extracted/header/package/or/kernel/root
Compilare il driver è semplice, basta digitare:
make
Questo dovrebbe produrre linpmem.ko nella directory di lavoro corrente.
Potresti voler controllare precompiler.h prima e scegliere se compilare per release o debug (ad esempio, con stampa di debug). Al momento non ci sono molte altre impostazioni del precompilatore.
Il modulo linpmem.ko può essere caricato usando insmod path-to-linpmem.ko e rimosso con rmmod path-to-linpmem.ko. (Questo caricherà il driver solo per questa sessione di uptime.) Se hai compilato per debug, dai anche un'occhiata a dmesg.
Dopo il caricamento, per comunicare con il driver, devi creare il dispositivo:
mknod /dev/linpmem c 42 0
Se non riesci a comunicare con il driver, controlla potenzialmente il log di dmesg per verificare che '42' sia effettivamente il major registrato:
[12827.900168] linpmem: registered chrdev with major 42
Anche se di solito il kernel cerca di assegnare effettivamente questo numero.
Puoi usare chown sul dispositivo per darlo al tuo utente, se non vuoi tenere aperta una console di root tutto il tempo. (O usa semplicemente una console di root.)
C'è un codice di esempio che mostra e spiega (in dettaglio) come interagire con il driver. Il riferimento all'API user-space può essere trovato inoltre in ./userspace_interface/linpmem_shared.h.
Questo codice è importante se vuoi capire come interagire direttamente con il driver invece di usare una libreria. Può anche essere usato come un breve test di funzionalità.
C'è uno strumento da riga di comando (opzionale) per Linpmem, lo strumento CLI pmem. Si trova qui: https://github.com/vobst/linpmem-cli. Oltre al codice sorgente, sono disponibili anche uno strumento CLI precompilato, così come la libreria statica precompilata e gli header, che possono essere trovati qui (firmati). Nota: questa è una versione preliminare, controlla gli aggiornamenti, poiché molte aggiunte e migliorie seguiranno a breve.
Lo strumento CLI pmem può essere utilizzato per testare le varie funzioni di Linpmem in modo (relativamente) sicuro e comodo. Linpmem può anche essere caricato da questo strumento invece di usare insmod/rmmod, con alcune opzioni extra in futuro. Questo ha anche il vantaggio che pmem crea automaticamente il dispositivo giusto per te per un uso immediato. È estremamente portabile e funziona su qualsiasi sistema Linux (e, di fatto, è stato testato anche su un Linux 2.6).
$ ./pmem -h
Client da riga di comando per il driver linpmem
Utilizzo: pmem [OPZIONI] [COMANDO]
Comandi:
insmod Carica il driver linpmem
help Stampa questo messaggio o l'aiuto del sottocomando specificato
Opzioni:
-a, --address <INDIRIZZO> Indirizzo per operazioni di lettura fisica
-v, --virt-address <VIRT_ADDRESS> Traduci l'indirizzo nello spazio di indirizzi del processo di destinazione (predefinito: processo corrente)
-s, --size <DIMENSIONE> Dimensione delle operazioni di lettura buffer
-m, --mode <MODALITÀ> Modalità di accesso per le operazioni di lettura [valori possibili: byte, word, dword, qword, buffer]
-p, --pid <PID> Processo di destinazione per informazioni cr3 e traduzioni virtuale-fisica
--cr3 Interroga il valore cr3 del processo di destinazione (predefinito: processo corrente)
--verbose Mostra output di debug
-h, --help Stampa l'aiuto (vedi di più con '--help')
-V, --version Stampa la versione