Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Linpmem — Драйвер ядра Linux для захвата физической памяти, обеспечивающий доступ на чтение к любому физическому адресу, включая зарезервированную память и дыры в памяти, с информацией о CR3 и сервисами трансляции виртуальных адресов в физические. | Kitploit
Инструменты/GitHubGitHub/velocidex/linpmem
Криминалистика памятиФорензикаЦифровая криминалистикаРеагирование на Инциденты
GitHubvelocidex/linpmem

Linpmem

Драйвер ядра Linux для захвата физической памяти, обеспечивающий доступ на чтение к любому физическому адресу, включая зарезервированную память и дыры в памяти, с информацией о CR3 и сервисами трансляции виртуальных адресов в физические.

Репозиторий
1051221 год назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Linpmem – инструмент для захвата физической памяти для Linux

alt text

Linpmem – это инструмент только для Linux x64 для чтения физической памяти.

Как и его аналог для Windows, Winpmem, это не традиционный дампер памяти. Linpmem предоставляет API для чтения с любого физического адреса, включая зарезервированную память и дыры памяти, но также может использоваться для обычного дампа памяти. Кроме того, драйвер предлагает различные режимы доступа для чтения физической памяти, такие как байтовый, словесный, двойной словесный, четверной словесный и буферный режим, причем буферный режим подходит в большинстве стандартных случаев. Если чтение требует выровненного чтения байт/слово/двойное слово/четверное слово, Linpmem сделает именно это.

В настоящее время Linpmem включает:

  1. Чтение с физического адреса (режимы доступа: байт, слово, двойное слово, четверное слово или буфер)
  2. Сервис информации CR3 (указание целевого процесса по pid)
  3. Сервис преобразования виртуального адреса в физический

Управление кэшем будет добавлено в будущем для поддержки специализированных режимов чтения.

Сводная таблица

  • Сборка драйвера ядра
  • Загрузка драйвера
  • Использование
    • Демонстрационный код
    • Инструмент командной строки
    • Библиотека
    • Инструмент для дампа памяти
  • Библиотека
  • Протестированные дистрибутивы Linux
  • Обработка Secure Boot
  • Известные проблемы
  • В разработке
  • Планы на будущее
  • Благодарности

Сборка драйвера ядра

По крайней мере сейчас, вы должны скомпилировать драйвер Linpmem самостоятельно. Метод загрузки предварительно скомпилированного драйвера Linpmem на других системах Linux в настоящее время находится в разработке, но еще не завершен. Тем не менее, скомпилировать драйвер Linpmem несложно, в основном это выполнение команды 'make'.

Шаг 1 - получение правильных заголовочных файлов

Вам понадобятся make и компилятор C. (Мы рекомендуем gcc, но clang также должен работать).

Убедитесь, что у вас установлены linux-headers (используя любой пакетный менеджер вашего целевого дистрибутива Linux). Точное имя пакета может отличаться в вашем дистрибутиве. Быстрый (независимый от дистрибутива) способ проверить, установлен ли пакет:

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

Вот и все, можно переходить к шагу 2.

Чужая система: В настоящее время, если вы хотите скомпилировать драйвер для другой системы, например, потому что вы хотите создать дамп памяти, но не можете скомпилировать на целевой системе, вам необходимо загрузить пакет заголовков непосредственно из репозиториев пакетов дистрибутива Linux этой системы. Дважды проверьте, что версия пакета точно соответствует релизу и версии ядра, работающим на чужой системе. Если другая система использует самостоятельно скомпилированное ядро, вам необходимо получить копию каталога сборки этого ядра. Затем укажите расположение любого из этих каталогов в переменной окружения KDIR.

root@kitploit:~
export KDIR=path/to/extracted/header/package/or/kernel/root

Шаг 2 - make

Скомпилировать драйвер просто, просто введите:

root@kitploit:~
make

Возможно, вы захотите проверить precompiler.h перед сборкой и выбрать, компилировать для релиза или отладки (например, с отладочной печатью). Сейчас не так много других настроек прекомпилятора.

Загрузка драйвера

Модуль linpmem.ko можно загрузить с помощью insmod path-to-linpmem.ko и выгрузить с помощью rmmod path-to-linpmem.ko. (Это загрузит драйвер только на время работы.) Если вы компилировали для отладки, также посмотрите вывод dmesg.

После загрузки, для взаимодействия с драйвером, необходимо создать устройство:

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

Если не удается связаться с драйвером, возможно, проверьте в логе dmesg, что '42' действительно является зарегистрированным major-номером:

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

Хотя обычно ядро пытается действительно назначить этот номер.

Вы можете использовать chown на устройстве, чтобы передать его вашему пользователю, если вы не хотите все время держать открытой root-консоль. (Или просто продолжайте использовать его в root-консоли.)

  • Следите за выводом dmesg. Пожалуйста, сообщайте об ошибках, если вы их видите!
  • Внимание: если в dmesg есть сообщение об ошибке от Linpmem с требованием перезагрузиться, лучше сделать это немедленно.
  • Внимание: это ранняя версия.

Использование

Демонстрационный код

Существует пример кода, демонстрирующий и подробно объясняющий, как взаимодействовать с драйвером. Ссылка на пользовательский API также находится в ./userspace_interface/linpmem_shared.h.

  1. cd demo
  2. gcc -o test test.c
  3. (sudo) ./test // <= требуется sudo, если вы не использовали chown на устройстве.

Этот код важен, если вы хотите понять, как напрямую взаимодействовать с драйвером вместо использования библиотеки. Его также можно использовать как краткий функциональный тест.

Инструмент командной строки

Существует (опциональный) базовый инструмент командной строки для Linpmem, pmem CLI tool. Он доступен здесь: https://github.com/vobst/linpmem-cli. Помимо исходного кода, есть также предварительно скомпилированный CLI-инструмент, а также предварительно скомпилированная статическая библиотека и заголовочные файлы, которые можно найти здесь (подписано). Примечание: это предварительная версия, обязательно проверяйте обновления, так как вскоре последуют многие дополнения и улучшения.

Инструмент pmem CLI можно использовать для тестирования различных функций Linpmem (относительно) безопасным и удобным способом. Linpmem также может быть загружен этим инструментом вместо использования insmod/rmmod, с некоторыми дополнительными опциями в будущем. Это также имеет преимущество — pmem автоматически создает нужное устройство для немедленного использования. Он чрезвычайно портативен и работает на любой системе Linux (и, фактически, был протестирован даже на Linux 2.6).

root@kitploit:~
$ ./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

Если вы хотите скомпилировать CLI-инструмент самостоятельно, перейдите в его каталог и следуйте инструкциям в (cli) Readme для сборки. В противном случае просто загрузите предварительно собранную программу — она должна работать на любом Linux. Чтобы загрузить драйвер ядра с помощью CLI-инструмента:

root@kitploit:~
# pmem insmod path/to/linpmem.ko

Преимущество использования инструмента pmem для загрузки драйвера в том, что вам не нужно создавать файл устройства самостоятельно, и он предложит (в следующих версиях) выбор владельца устройства linpmem.

Библиотеки

Интерфейс командной строки pmem — это лишь тонкая обертка вокруг небольшой библиотеки Rust, которая предоставляет API для взаимодействия с драйвером. Более опытные пользователи также могут использовать эту библиотеку. Библиотека автоматически компилируется (как статическая портативная библиотека) вместе с pmem CLI при сборке из https://github.com/vobst/linpmem-cli, а также включена (предварительно скомпилирована) здесь (подписано). Примечание: это предварительная версия, скоро последуют другие.

Если вы не хотите использовать пользовательскую библиотеку и предпочитаете напрямую взаимодействовать с драйвером самостоятельно, вы можете найти его пользовательский API/интерфейс и документацию в ./userspace_interface/linpmem_shared.h. Мы также предоставляем пример кода в demo/test.c, который объясняет, как напрямую использовать драйвер.

Обертка для Python

LinPyMem: обертка на Python для драйвера linpmem. Доступна на PyPI.

Инструмент для дампа памяти

Пока не реализовано.

Протестированные дистрибутивы Linux

  • Debian, самостоятельно скомпилированное 6.4.X, Qemu/KVM, не паравиртуализировано.
    • PTI: выкл/вкл
  • Debian 12, Qemu/KVM, полностью паравиртуализировано.
    • PTI: вкл
  • Ubuntu server, Qemu/KVM, не паравиртуализировано.
    • PTI: вкл
  • Fedora 38, Qemu/KVM, полностью паравиртуализировано.
    • PTI: вкл
  • Baremetal тест Linux, AMI BIOS: Linux 6.4.4
    • PTI: вкл
  • Baremetal тест Linux, HP: Linux 6.4.4
    • PTI: вкл
  • Baremetal, Arch[-hardened], Dell BIOS, Linux 6.4.X
  • Baremetal, Debian, 6.1.X
  • Baremetal, Ubuntu 20.04 с включенным Secure Boot. Работает, но сначала подпишите драйвер.
  • Baremetal, Ubuntu 22.04, Linux 6.2.X

Обработка Secure Boot

Если при загрузке модуля система сообщает следующую ошибку, это может быть связано с Secure Boot:

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

Существуют разные способы все же загрузить модуль. Самый очевидный — отключить Secure Boot в настройках UEFI.

Если ваш дистрибутив это поддерживает, более элегантным решением будет подписать модуль перед использованием. Это можно сделать с помощью следующих шагов (проверено на Ubuntu 20.04).

  1. Установите mokutil:
    root@kitploit:~
    $ sudo apt install mokutil
    
  2. Создайте материал ключа подписи:
    root@kitploit:~
    $ openssl req -new -newkey rsa:4096 -keyout mok-signing.key -out mok-signing.crt -outform DER -days 365 -nodes -subj "/CN=Some descriptive name/"
    
    Обязательно настройте параметры в соответствии с вашими потребностями. Особенно обратите внимание на длину ключа (-newkey), срок действия (-days), возможность установить парольную фразу для ключа (-nodes; опустите, если хотите установить парольную фразу) и общее имя, включаемое в сертификат (-subj).
  3. Зарегистрируйте новый MOK:
    root@kitploit:~
    $ sudo mokutil --import mok-signing.crt
    
    Вас попросят ввести пароль, который потребуется на следующем шаге. Рекомендуется использовать пароль, который можно ввести на раскладке клавиатуры US.
  4. Перезагрузите систему. Система войдет в меню регистрации MOK. Следуйте инструкциям для регистрации вашего нового ключа.
  5. Подпишите модуль После регистрации MOK вы можете подписать ваш модуль.
    root@kitploit:~
    $ /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 path/to/mok-singing/MOK.key path/to//MOK.cert path/to/linpmem.ko
    

После этого вы сможете загрузить модуль.

Обратите внимание, что с точки зрения готовности к криминалистическому анализу, вы должны подготовить подписанный модуль до того, как он вам понадобится, так как система перезагрузится дважды в ходе описанного выше процесса, уничтожая большую часть ваших энергозависимых данных в памяти.

Известные проблемы

  • Чтение огромных страниц не реализовано. Linpmem распознает огромную страницу и отклоняет чтение, пока что.
  • Чтение из отображенного пространства ввода-вывода и DMA будет выполняться с включенным кэшированием ЦП.
  • Во время обхода таблицы страниц не используются блокировки. Это может привести к забавным результатам при одновременных модификациях. Это общая и (в основном неразрешимая) проблема чтения оперативной памяти на работающей системе без полной остановки всей ОС.
  • Secure Boot (Ubuntu): пожалуйста, подпишите ваш драйвер перед использованием.
  • Любое шифрование памяти на уровне ЦП, например, AMD SME, Intel SGX/TDX, ...
  • Чипы Pluton?

(Пожалуйста, сообщайте о потенциальных проблемах, если вы столкнетесь с чем-либо.)

В разработке

  • Загрузка предварительно скомпилированного драйвера на любой системе Linux.
  • Управление кэшем процессора. Пример: для некэшированного чтения отображенного пространства ввода-вывода и DMA.

Планы на будущее

  • Поддержка Arm/Mips. (далекие планы)
  • Устаревшие ядра (такие как 2.6), ядра на основе Unix

Благодарности

Linpmem, так же как и Winpmem, не существовали бы без работы наших предшественников из (ныне закрытого) проекта REKALL: https://github.com/google/rekall.

  • Мы хотели бы поблагодарить Майка Коэна и Йоханнеса Штюттгена за их пионерскую работу и вклад в открытый код по ремаппингу PTE, технику, которая все еще используется 10 лет спустя.

Наши участники открытого проекта:

  • Viviane Zwanger
  • Valentin Obst
Скачать инструмент