Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Linpmem — Linux内核驱动,用于物理内存获取,支持读取任意物理地址(包括保留内存和内存空洞),提供CR3信息及虚拟地址到物理地址的转换服务。 | Kitploit
工具/GitHubGitHub/velocidex/linpmem
内存取证取证分析数字取证事件响应
GitHubvelocidex/linpmem

Linpmem

Linux内核驱动,用于物理内存获取,支持读取任意物理地址(包括保留内存和内存空洞),提供CR3信息及虚拟地址到物理地址的转换服务。

查看仓库
105121年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Linpmem -- 一个用于 Linux 的物理内存获取工具

alt text

Linpmem 是一款仅适用于 Linux x64 的物理内存读取工具。

与其 Windows 版本 Winpmem 类似,这不是传统的内存转储工具。Linpmem 提供了一个从任意物理地址读取的 API,包括保留内存和内存空洞,但它也可以用于常规内存转储。此外,该驱动提供了多种读取物理内存的访问模式,如字节、字、双字、四字和缓冲区访问模式,其中缓冲区访问模式适用于大多数标准情况。如果读取需要对齐的字节/字/双字/四字读取,Linpmem 将精确执行。

目前,Linpmem 的功能包括:

  1. 从物理地址读取(访问模式:字节、字、双字、四字或缓冲区)
  2. CR3 信息服务(通过 PID 指定目标进程)
  3. 虚拟地址到物理地址的转换服务

缓存控制将在未来添加,以支持特定的读取访问模式。

摘要表

  • 编译内核驱动
  • 加载驱动
  • 使用
    • 演示代码
    • 命令行界面工具
    • 库
    • 内存转储工具
  • 库
  • 经过测试的 Linux 发行版
  • 处理安全启动
  • 已知问题
  • 正在开发
  • 未来工作
  • 致谢

编译内核驱动

至少目前,你必须自己编译 Linpmem 驱动。一种在其他 Linux 系统上加载预编译 Linpmem 驱动的方法正在开发中,但尚未完成。尽管如此,编译 Linpmem 驱动并不困难,基本上就是执行 'make'。

第一步 - 获取正确的头文件

你需要 make 和一个 C 编译器。(我们推荐 gcc,但 clang 应该也可以工作。)

确保你已经安装了 linux-headers(使用你的目标 Linux 发行版的任何包管理器)。确切的包名可能因你的发行版而异。 一个快速(与发行版无关)检查是否安装了该包的方法:

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

就这样,你可以继续进行第二步了。

外部系统: 目前,如果你想为另一个系统编译驱动,例如,因为你想要创建内存转储但无法在目标系统上编译,你必须直接从该系统的 Linux 发行版的包仓库下载头文件包。双重检查包的版本精确匹配外部系统上运行的发行版和内核版本。如果另一个系统使用的是自行编译的内核,你必须获取该内核构建目录的副本。然后,将任一目录的位置放入 KDIR 环境变量中。

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

第二步 - make

编译驱动很简单,只需输入:

root@kitploit:~
make

这应该会在当前工作目录中生成 linpmem.ko。

你可能想先检查 precompiler.h,并选择是为发布版还是调试版编译(例如,带有调试打印)。目前没有太多其他预编译器设置。

加载驱动

可以通过 insmod path-to-linpmem.ko 加载 linpmem.ko 模块,通过 rmmod path-to-linpmem.ko 卸载。(这只会在此次运行期间加载驱动。)如果你为调试版编译,也请查看 dmesg。

加载后,为了与驱动通信,你需要创建设备:

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

如果你无法与驱动通信,请检查 dmesg 日志以验证 '42' 确实是注册的主设备号:

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 // <= 如果你没有对该设备使用 chown,则需要 sudo。

如果你想了解如何直接与驱动交互而不使用库,这段代码很重要。它也可以用作简短的功能测试。

命令行界面工具

Linpmem 有一个(可选的)基本命令行界面工具,即 pmem CLI 工具。可以在这里找到: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)自述文件中的说明进行构建。否则,直接下载预构建的程序,它应该可以在任何 Linux 上工作。使用 CLI 工具加载内核驱动:

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

使用 pmem 工具加载驱动的优点是你不必自己创建设备文件,并且它将在(下一个版本中)提供选择谁拥有 linpmem 设备的选项。

库

pmem 命令行界面只是一个小型 Rust 库的薄包装,该库公开了与驱动交互的 API。更高级的用户也可以使用这个库。从 https://github.com/vobst/linpmem-cli 编译时,该库会与 pmem CLI 工具一起自动编译(作为静态可移植库),但也(预编译)包含在这里(已签名)。注意:这是一个初步版本,更多内容即将推出。

如果你不想使用用户模式库,更愿意自己直接与驱动交互,你可以在 ./userspace_interface/linpmem_shared.h 中找到其用户空间 API/接口和文档。我们还在 demo/test.c 中提供了示例代码,说明如何直接使用驱动。

Python 包装器

LinPyMem:linpmem 驱动的 Python 包装器。可在 PyPI 上获取。

内存转储工具

尚未实现。

经过测试的 Linux 发行版

  • Debian,自行编译的 6.4.X,Qemu/KVM,未半虚拟化。
    • PTI:关闭/开启
  • Debian 12,Qemu/KVM,完全半虚拟化。
    • PTI:开启
  • Ubuntu server,Qemu/KVM,未半虚拟化。
    • PTI:开启
  • Fedora 38,Qemu/KVM,完全半虚拟化。
    • PTI:开启
  • 裸机 Linux 测试,AMI BIOS:Linux 6.4.4
    • PTI:开启
  • 裸机 Linux 测试,HP:Linux 6.4.4
    • PTI:开启
  • 裸机,Arch[-hardened],Dell BIOS,Linux 6.4.X
  • 裸机,Debian,6.1.X
  • 裸机,Ubuntu 20.04,安全启动开启。有效,但需要先签名驱动。
  • 裸机,Ubuntu 22.04,Linux 6.2.X

处理安全启动

如果系统在加载模块时报告以下错误信息,可能是因为安全启动:

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

仍有不同的方法来加载模块。最明显的一种是在 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
    
    系统会要求你输入一个密码,该密码将在下一步中使用。建议使用你可以在美国键盘布局上输入的密码。
  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 会识别大页并拒绝读取。
  • 读取映射的 IO 和 DMA 空间时,CPU 缓存将保持启用。
  • 页表遍历期间不持有锁。当并发修改发生时,可能会导致奇怪的结果。这是实时 RAM 读取的一个普遍且(基本无解的)问题,除非让整个操作系统完全停止。
  • 安全启动(Ubuntu):请在使用前签名你的驱动。
  • 任何基于 CPU 的内存加密,例如 AMD SME、Intel SGX/TDX……
  • Pluton 芯片?

(如果遇到任何问题,请报告潜在问题。)

正在开发

  • 在任何 Linux 上加载预编译驱动。
  • 处理器缓存控制。例如:用于无缓存读取映射的 I/O 和 DMA 空间。

未来工作

  • Arm/Mips 支持。(远期的未来工作)
  • 旧内核(例如 2.6),基于 Unix 的内核

致谢

Linpmem 和 Winpmem 的存在离不开我们前辈在(现已退休的)REKALL 项目中的工作:https://github.com/google/rekall。

  • 我们要感谢 Mike Cohen 和 Johannes Stüttgen 在 PTE 重映射方面的开创性工作和开源贡献,这项技术在 10 年后仍然在使用。

我们的开源贡献者:

  • Viviane Zwanger
  • Valentin Obst
下载工具