
Linux-Kernel-Treiber zur Erfassung des physischen Speichers, der Lesezugriff auf jede physische Adresse ermöglicht, einschließlich reserviertem Speicher und Speicherlücken, mit CR3-Informationen und Diensten zur virtuell-physischen Adressübersetzung.

Wie sein Windows-Pendant Winpmem ist dies kein traditioneller Memory-Dumper. Linpmem bietet eine API zum Lesen von jeder physischen Adresse, einschließlich reserviertem Speicher und Speicherlöchern, kann aber auch für normales Speicher-Dumping verwendet werden. Darüber hinaus bietet der Treiber eine Vielzahl von Zugriffsmodi zum Lesen des physischen Arbeitsspeichers, wie Byte-, Word-, Dword-, Qword- und Puffer-Zugriffsmodus, wobei der Puffer-Zugriffsmodus in den meisten Standardfällen geeignet ist. Wenn das Lesen einen ausgerichteten Byte-/Word-/Dword-/Qword-Lesezugriff erfordert, führt Linpmem genau das aus.
Derzeit bietet Linpmem folgende Funktionen:
Cache Control wird in Zukunft hinzugefügt, um die spezialisierten Lesezugriffsmodi zu unterstützen.
Zumindest vorerst müssen Sie den Linpmem-Treiber selbst kompilieren. Eine Methode zum Laden eines vorkompilierten Linpmem-Treibers auf anderen Linux-Systemen befindet sich derzeit in Arbeit, ist aber noch nicht abgeschlossen. Das Kompilieren des Linpmem-Treibers ist dennoch nicht schwierig, im Grunde genügt die Ausführung von 'make'.
Sie benötigen make und einen C-Compiler (wir empfehlen gcc, aber clang sollte auch funktionieren).
Stellen Sie sicher, dass die linux-headers installiert sind (mit dem Paketmanager Ihrer Ziel-Linux-Distribution). Der genaue Paketname kann je nach Distribution variieren. Eine schnelle (distributionsunabhängige) Methode, um zu überprüfen, ob das Paket installiert ist:
ls -l /usr/lib/modules/`uname -r`/
Das war's, Sie können mit Schritt 2 fortfahren.
Fremdsystem: Derzeit müssen Sie, wenn Sie den Treiber für ein anderes System kompilieren möchten, z. B. weil Sie einen Speicherabbild erstellen möchten, aber auf dem Zielsystem nicht kompilieren können, das Header-Paket direkt aus den Paketquellen der Linux-Distribution dieses Systems herunterladen. Überprüfen Sie unbedingt, ob die Paketversion exakt mit der auf dem Fremdsystem laufenden Release- und Kernelversion übereinstimmt. Falls das andere System einen selbst kompilierten Kernel verwendet, müssen Sie eine Kopie des Build-Verzeichnisses dieses Kernels besorgen. Legen Sie dann den Pfad zu einem dieser Verzeichnisse in der Umgebungsvariablen KDIR fest.
export KDIR=path/to/extracted/header/package/or/kernel/root
Das Kompilieren des Treibers ist einfach, geben Sie einfach ein:
make
Dies sollte linpmem.ko im aktuellen Arbeitsverzeichnis erzeugen.
Sie sollten vorher precompiler.h überprüfen und wählen, ob Sie für Release oder Debug kompilieren möchten (z. B. mit Debug-Ausgabe). Es gibt derzeit nicht viele andere Precompiler-Einstellungen.
Das Modul linpmem.ko kann mit insmod path-to-linpmem.ko geladen und mit rmmod path-to-linpmem.ko entladen werden. (Dadurch wird der Treiber nur für diese Betriebszeit geladen.) Wenn Sie für Debug kompiliert haben, werfen Sie auch einen Blick auf dmesg.
Nach dem Laden müssen Sie das Gerät erstellen, um mit dem Treiber zu kommunizieren:
mknod /dev/linpmem c 42 0
Wenn Sie nicht mit dem Treiber kommunizieren können, überprüfen Sie ggf. im dmesg-Protokoll, ob '42' tatsächlich die registrierte Major-Nummer ist:
[12827.900168] linpmem: registered chrdev with major 42
Normalerweise versucht der Kernel jedoch, diese Nummer tatsächlich zuzuweisen.
Sie können chown auf dem Gerät verwenden, um es Ihrem Benutzer zu geben, wenn Sie nicht ständig eine Root-Konsole offen halten möchten. (Oder verwenden Sie sie einfach weiter in einer Root-Konsole.)
Es gibt einen Beispielcode, der detailliert zeigt und erklärt, wie mit dem Treiber interagiert wird. Die Referenz für die Benutzerraum-API finden Sie außerdem in ./userspace_interface/linpmem_shared.h.
Dieser Code ist wichtig, wenn Sie verstehen möchten, wie Sie direkt mit dem Treiber interagieren, anstatt eine Bibliothek zu verwenden. Er kann auch als kurzer Funktionstest verwendet werden.
Es gibt ein (optionales) grundlegendes Kommandozeilen-Tool für Linpmem, das pmem CLI-Tool. Es ist hier zu finden: https://github.com/vobst/linpmem-cli. Neben dem Quellcode gibt es auch ein vorkompiliertes CLI-Tool sowie die vorkompilierte statische Bibliothek und Header, die hier (signiert) zu finden sind. Hinweis: Dies ist eine vorläufige Version, überprüfen Sie unbedingt auf Updates, da bald viele Ergänzungen und Verbesserungen folgen werden.
Das pmem CLI-Tool kann zum Testen der verschiedenen Funktionen von Linpmem auf eine (relativ) sichere und bequeme Weise verwendet werden. Linpmem kann auch mit diesem Tool anstatt mit insmod/rmmod geladen werden, mit einigen zusätzlichen Optionen in Zukunft. Dies hat auch den Vorteil, dass pmem automatisch das richtige Gerät für die sofortige Nutzung erstellt. Es ist extrem portabel und läuft auf jedem Linux-System (und wurde tatsächlich sogar auf einem Linux 2.6 getestet).
$ ./pmem -h
Command-line client for the linpmem driver
Usage: pmem [OPTIONS] [COMMAND]
Commands:
insmod Load the linpmem driver
help Print this message or the help of the given subcommand(s)
Options:
-a, --address <ADDRESS> Address for physical read operations
-v, --virt-address <VIRT_ADDRESS> Translate address in target process' address space (default: current process)
-s, --size <SIZE> Size of buffer read operations
-m, --mode <MODE> Access mode for read operations [possible values: byte, word, dword, qword, buffer]
-p, --pid <PID> Target process for cr3 info and virtual-to-physical translations
--cr3 Query cr3 value of target process (default: current process)
--verbose Display debug output
-h, --help Print help (see more with '--help')
-V, --version Print version