Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Linpmem — Pilote du noyau Linux pour l'acquisition de la mémoire physique, permettant un accès en lecture à toute adresse physique, y compris la mémoire réservée et les trous mémoire, avec les informations CR3 et les services de traduction virtuelle à physique. | Kitploit
Outils/GitHubGitHub/velocidex/linpmem
Criminalistique MémoireAnalyse ForensiqueCriminalistique NumériqueRéponse aux Incidents
GitHubvelocidex/linpmem

Linpmem

Pilote du noyau Linux pour l'acquisition de la mémoire physique, permettant un accès en lecture à toute adresse physique, y compris la mémoire réservée et les trous mémoire, avec les informations CR3 et les services de traduction virtuelle à physique.

Voir le dépôt
10512il y a 1 anVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Linpmem – un outil d'acquisition de mémoire physique pour Linux

alt text

Linpmem est un outil Linux x64 uniquement pour lire la mémoire physique.

Comme son homologue Windows, Winpmem, il ne s'agit pas d'un vidage mémoire traditionnel. Linpmem offre une API pour lire depuis n'importe quelle adresse physique, y compris la mémoire réservée et les trous mémoire, mais il peut également être utilisé pour un vidage mémoire normal. De plus, le pilote propose différents modes d'accès pour lire la mémoire physique, tels que les modes octet, mot, double mot, quadruple mot et tampon, ce dernier étant approprié dans la plupart des cas standards. Si la lecture nécessite une lecture alignée en octet/mot/double mot/quadruple mot, Linpmem le fera précisément.

Actuellement, Linpmem propose :

  1. Lecture d'adresse physique (mode d'accès octet, mot, double mot, quadruple mot ou tampon)
  2. Service d'information CR3 (spécifier le processus cible par pid)
  3. Service de traduction d'adresse virtuelle en adresse physique

Le contrôle du cache sera ajouté à l'avenir pour prendre en charge les modes d'accès spécialisés.

Tableau récapitulatif

  • Construction du pilote noyau
  • Chargement du pilote
  • Utilisation
    • Code de démonstration
    • Outil en ligne de commande
    • Bibliothèque
    • Outil de vidage mémoire
  • Bibliothèque
  • Distributions Linux testées
  • Gestion du Secure Boot
  • Problèmes connus
  • En cours
  • Travaux futurs
  • Remerciements

Construction du pilote noyau

Pour l'instant, vous devez compiler vous-même le pilote Linpmem. Une méthode pour charger un pilote Linpmem précompilé sur d'autres systèmes Linux est en cours de développement, mais pas encore terminée. Cela dit, compiler le pilote Linpmem n'est pas difficile, il suffit d'exécuter make.

Étape 1 – Obtenir les bons en-têtes

Vous avez besoin de make et d'un compilateur C. (Nous recommandons gcc, mais clang devrait fonctionner aussi.)

Assurez-vous d'avoir installé les linux-headers (en utilisant le gestionnaire de paquets de votre distribution Linux cible). Le nom exact du paquet peut varier selon votre distribution. Un moyen rapide (indépendant de la distribution) de vérifier si vous avez le paquet installé :

root@kitploit:~
ls -l /usr/lib/modules/`uname -r`/

C'est tout, vous pouvez passer à l'étape 2.

Système étranger : Actuellement, si vous voulez compiler le pilote pour un autre système (par exemple parce que vous voulez créer un vidage mémoire mais ne pouvez pas compiler sur la cible), vous devez télécharger le paquet d'en-têtes directement depuis les dépôts de la distribution Linux de ce système. Vérifiez doublement que la version du paquet correspond exactement à la version du noyau et de la version exécutée sur le système étranger. Si l'autre système utilise un noyau compilé manuellement, vous devez obtenir une copie du répertoire de construction de ce noyau. Ensuite, placez le chemin de l'un ou l'autre répertoire dans la variable d'environnement KDIR.

root@kitploit:~
export KDIR=chemin/vers/le/paquet/d'en-têtes/extrait/ou/racine/du/noyau

Étape 2 – make

Compiler le pilote est simple, tapez simplement :

root@kitploit:~
make

Cela devrait produire linpmem.ko dans le répertoire de travail courant.

Vous voudrez peut-être vérifier precompiler.h avant et choisir de compiler pour la release ou le debug (par exemple avec des impressions de debug). Il n'y a pas beaucoup d'autres paramètres de précompilation pour le moment.

Chargement du pilote

Le module linpmem.ko peut être chargé en utilisant insmod chemin-vers-linpmem.ko, et déchargé avec rmmod chemin-vers-linpmem.ko. (Cela chargera le pilote uniquement pour cette session.) Si vous avez compilé pour le debug, regardez aussi dmesg.

Après le chargement, pour communiquer avec le pilote, vous devez créer le périphérique :

root@kitploit:~
mknod /dev/linpmem c 42 0

Si vous ne pouvez pas parler au pilote, vérifiez éventuellement dans le journal dmesg que '42' était bien le majeur enregistré :

root@kitploit:~
[12827.900168] linpmem: registered chrdev with major 42

Cependant, généralement le noyau essaiera d'attribuer ce nombre.

Vous pouvez utiliser chown sur le périphérique pour le donner à votre utilisateur, si vous ne voulez pas garder une console root ouverte en permanence. (Ou continuez simplement à l'utiliser dans une console root.)

  • Surveillez la sortie dmesg. Veuillez signaler les erreurs si vous en voyez !
  • Attention : s'il y a un message d'erreur dmesg de Linpmem demandant de redémarrer, faites-le immédiatement.
  • Attention : ceci est une version préliminaire.

Utilisation

Code de démonstration

Un exemple de code démontrant et expliquant (en détail) comment interagir avec le pilote est fourni. La référence de l'API espace utilisateur se trouve en outre dans ./userspace_interface/linpmem_shared.h.

  1. cd demo
  2. gcc -o test test.c
  3. (sudo) ./test // <= vous avez besoin de sudo si vous n'avez pas utilisé chown sur le périphérique.

Ce code est important si vous voulez comprendre comment interagir directement avec le pilote au lieu d'utiliser une bibliothèque. Il peut également être utilisé comme un test de fonctionnalité court.

Outil en ligne de commande

Il existe un outil en ligne de commande (optionnel) de base pour Linpmem, l'outil CLI pmem. Il se trouve ici : https://github.com/vobst/linpmem-cli. Outre le code source, il existe également un outil CLI précompilé ainsi que la bibliothèque statique précompilée et les en-têtes que l'on peut trouver ici (signés). Remarque : ceci est une version préliminaire, vérifiez les mises à jour car de nombreux ajouts et améliorations suivront bientôt.

L'outil CLI pmem peut être utilisé pour tester les différentes fonctions de Linpmem de manière (relativement) sûre et pratique. Linpmem peut également être chargé par cet outil au lieu d'utiliser insmod/rmmod, avec quelques options supplémentaires à l'avenir. Cela a aussi l'avantage que pmem crée automatiquement le bon périphérique pour vous pour une utilisation immédiate. Il est extrêmement portable et fonctionne sur n'importe quel système Linux (et a en fait été testé même sur un Linux 2.6).

root@kitploit:~
$ ./pmem -h
Client en ligne de commande pour le pilote linpmem

Utilisation : pmem [OPTIONS] [COMMANDE]

Commandes :
  insmod  Charger le pilote linpmem
  help    Afficher ce message ou l'aide de la sous-commande donnée

Options :
  -a, --address <ADRESSE>            Adresse pour les opérations de lecture physique
  -v, --virt-address <VIRT_ADRESSE>  Traduire l'adresse dans l'espace d'adressage du processus cible (défaut : processus courant)
  -s, --size <TAILLE>                Taille des opérations de lecture tampon
  -m, --mode <MODE>                  Mode d'accès pour les opérations de lecture [valeurs possibles : byte, word, dword, qword, buffer]
  -p, --pid <PID>                    Processus cible pour les informations cr3 et les traductions virtuel-vers-physique
      --cr3                          Interroger la valeur cr3 du processus cible (défaut : processus courant)
      --verbose                      Afficher les sorties de debug
  -h, --help                         Afficher l'aide (voir plus avec '--help')
  -V, --version                      Afficher la version

Si vous voulez compiler l'outil CLI vous-même, placez-vous dans son répertoire et suivez les instructions du Readme (de la CLI) pour le construire. Sinon, téléchargez simplement le programme préconstruit, il devrait fonctionner sur n'importe quel Linux. Pour charger le pilote noyau avec l'outil CLI :

root@kitploit:~
# pmem insmod chemin/vers/linpmem.ko

L'avantage d'utiliser l'outil pmem pour charger le pilote est que vous n'avez pas à créer le fichier de périphérique vous-même, et il proposera (dans les prochaines versions) de choisir qui possède le périphérique linpmem.

Bibliothèques

L'interface en ligne de commande pmem n'est qu'une fine couche autour d'une petite bibliothèque Rust qui expose une API pour interagir avec le pilote. Les utilisateurs plus avancés peuvent également utiliser cette bibliothèque. La bibliothèque est automatiquement compilée (comme bibliothèque portable statique) avec l'outil CLI pmem lors de la compilation depuis https://github.com/vobst/linpmem-cli, mais aussi incluse (précompilée) ici (signée). Remarque : ceci est une version préliminaire, d'autres suivront bientôt.

Si vous ne voulez pas utiliser la bibliothèque espace utilisateur et préférez interfacer vous-même directement avec le pilote, vous trouverez son API/interface espace utilisateur et sa documentation dans ./userspace_interface/linpmem_shared.h. Nous fournissons également un exemple de code dans demo/test.c qui explique comment utiliser le pilote directement.

Wrapper Python

LinPyMem : Un wrapper Python pour le pilote linpmem. Disponible sur PyPI.

Outil de vidage mémoire

Pas encore implémenté.

Distributions Linux testées

  • Debian, noyau 6.4.X auto-compilé, Qemu/KVM, non paravirtualisé.
    • PTI : désactivé/activé
  • Debian 12, Qemu/KVM, entièrement paravirtualisé.
    • PTI : activé
  • Ubuntu server, Qemu/KVM, non paravirtualisé.
    • PTI : activé
  • Fedora 38, Qemu/KVM, entièrement paravirtualisé.
    • PTI : activé
  • Test Linux sur matériel nu, AMI BIOS : Linux 6.4.4
    • PTI : activé
  • Test Linux sur matériel nu, HP : Linux 6.4.4
    • PTI : activé
  • Matériel nu, Arch[-hardened], Dell BIOS, Linux 6.4.X
  • Matériel nu, Debian, 6.1.X
  • Matériel nu, Ubuntu 20.04 avec Secure Boot activé. Fonctionne, mais signez d'abord le pilote.
  • Matériel nu, Ubuntu 22.04, Linux 6.2.X

Gestion du Secure Boot

Si le système signale le message d'erreur suivant lors du chargement du module, cela peut être dû au Secure Boot :

root@kitploit:~
$ sudo insmod linpmem.ko
insmod: ERROR: could not insert module linpmem.ko: Operation not permitted

Il existe différentes façons de charger le module malgré tout. La plus évidente est de désactiver le Secure Boot dans les paramètres UEFI.

Si votre distribution le supporte, une solution plus élégante consiste à signer le module avant de l'utiliser. Cela peut être fait en suivant les étapes suivantes (testé sur Ubuntu 20.04).

  1. Installer mokutil :
    root@kitploit:~
    $ sudo apt install mokutil
    
  2. Créer le matériel de clé de signature :
    root@kitploit:~
    $ openssl req -new -newkey rsa:4096 -keyout mok-signing.key -out mok-signing.crt -outform DER -days 365 -nodes -subj "/CN=Un nom descriptif/"
    
    Assurez-vous d'ajuster les options selon vos besoins. Notamment la longueur de la clé (-newkey), la validité (-days), l'option de définir une phrase de passe pour la clé (-nodes ; omettez-la si vous souhaitez définir une phrase de passe), et le nom commun à inclure dans le certificat (-subj).
  3. Enregistrer le nouveau MOK :
    root@kitploit:~
    $ sudo mokutil --import mok-signing.crt
    
    Un mot de passe vous sera demandé, requis à l'étape suivante. Utilisez un mot de passe que vous pouvez taper sur un clavier américain.
  4. Redémarrer le système. Un menu d'enregistrement MOK apparaîtra. Suivez les instructions pour enregistrer votre nouvelle clé.
  5. Signer le module Une fois le MOK enregistré, vous pouvez signer votre module.
    root@kitploit:~
    $ /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 chemin/vers/mok-signing.key chemin/vers/mok-signing.crt chemin/vers/linpmem.ko
    

Après cela, vous devriez pouvoir charger le module.

Notez que d'un point de vue de préparation forensique, vous devriez préparer un module signé avant d'en avoir besoin, car le système redémarrera deux fois au cours du processus décrit ci-dessus, détruisant la plupart de vos données volatiles en mémoire.

Problèmes connus

  • La lecture des grandes pages n'est pas implémentée. Linpmem reconnaît une grande page et rejette la lecture, pour l'instant.
  • La lecture depuis l'espace d'E/S mappé et DMA se fera avec le cache du processeur activé.
  • Aucun verrou n'est pris lors de la marche des tables de pages. Cela peut conduire à des résultats étranges lorsque des modifications concurrentes sont en cours. C'est un problème général et (largement insoluble) de la lecture de RAM en direct, sans arrêter complètement le système d'exploitation.
  • Secure Boot (Ubuntu) : veuillez signer votre pilote avant utilisation.
  • Tout chiffrement mémoire piloté par le processeur (par exemple AMD SME, Intel SGX/TDX, ...)
  • Puces Pluton ?

(Veuillez signaler tout problème potentiel si vous en rencontrez.)

En cours

  • Chargement d'un pilote précompilé sur n'importe quel Linux.
  • Contrôle du cache du processeur. Exemple : pour une lecture sans cache de l'espace d'E/S mappé et DMA.

Travaux futurs

  • Support Arm/Mips. (travail lointain)
  • Noyaux anciens (comme 2.6), noyaux de type Unix.

Remerciements

Linpmem, ainsi que Winpmem, n'existeraient pas sans le travail de nos prédécesseurs du projet REKALL (désormais retiré) : https://github.com/google/rekall.

  • Nous tenons à remercier Mike Cohen et Johannes Stüttgen pour leur travail pionnier et leur contribution open source sur le remappage PTE, une technique toujours utilisée 10 ans plus tard.

Nos contributeurs open source :

  • Viviane Zwanger
  • Valentin Obst
Télécharger l’outil