taibeihacker
Moderator
就像它的Windows对应物Winpmem一样,这不是传统的内存笨拙。 LinPMEM提供了一个用于从任何物理地址(包括保留的内存和内存孔)读取的API,但也可以用于正常内存转储。此外,驱动程序还提供了多种访问模式来读取物理内存,例如字节,单词,dword,qword和缓冲区访问模式,其中缓冲区访问模式在大多数标准情况下都是合适的。如果读取需要一个对齐字节/word/dword/qword读取,则linpmem将确切地做到这一点。
目前,LINPMEM功能:
从物理地址(访问模式,单词,dword,Qword或Buffer)中读取CR3信息服务(通过PID指定目标过程)虚拟到物理地址转换服务CACHE CASCE CONTROL将来,以支持专门的读取访问模式。
确保您安装了Linux-Headers(使用目标Linux发行版的任何包装管理器)。确切的包装名称可能会因您的分发而异。一种快速(独立于发行的)方法,用于检查是否已安装了包装:
ls -l/usr/lib/lib/模块/`uname -r`/就是这样,您可以继续步骤2。
当前Foreign system:,如果要编译另一个系统的驱动程序,例如,因为要创建一个内存转储,但无法在目标上编译,则必须直接从该系统Linux Distibstion的包装存储库中下载标头软件包。双重检查包版本与外国系统上运行的版本和内核版本完全匹配。如果另一个系统使用自我编译的内核,则必须获得该内核构建目录的副本。然后,将任一目录的位置放置在KDIR环境变量中。
导出kdir=路径/到/提取/header/package/or/kernel/root
这样做应在当前工作目录中产生linpmem.ko。
您可能需要在之前检查precompiler.h,然后选择是否要编译进行发布还是调试(例如,使用调试打印)。现在没有其他其他预编译器设置。
加载后,要与驾驶员交谈,您需要创建设备:
MKNOD /DEV /LINPMEM C 42 0如果您不能与驾驶员交谈,则可能检查DMESG日志以验证“ 42”确实是注册的Major:
[12827.900168] Linpmem:注册了42号的Chrdev,尽管通常内核会尝试真正分配此数字。
如果您不想始终打开根控制台,则可以在设备上使用Chown将其提供给用户。 (或者只是在根控制台中继续使用它。)
观看DMESG输出。如果您看到任何问题,请报告错误!警告:如果LinpMem的DMESG错误打印说要重新启动,最好立即执行此操作。警告:这是一个早期版本。
CD DEMO GCC -O TEST.C(SUDO)./test //=如果您在设备上没有使用Chown,则需要Sudo。如果您想了解如何直接与驱动程序交互而不是使用库,则此代码很重要。它也可以用作短函数测试。
PMEM CLI工具可用于以(相对)安全和方便的方式测试LINPMEM的各种功能。 LinpMem也可以由此工具加载,而不是使用InsMod/RMMOD,将来有一些额外的选项。这也具有PMEM自动创建合适的设备供您立即使用的优势。它非常便携,并且在任何Linux系统上运行(实际上,即使在Linux 2.6上也经过了测试)。
$ ./pmem -H
LINPMEM驱动程序的命令行客户端
USAGE: PMEM [options] [命令]
命令:
insmod加载linpmem驱动程序
帮助打印此消息或给定子命令的帮助
Options:
-a, - 地址的物理阅读操作地址
-v, - virt-address virt_address在目标过程的地址空间中翻译地址(default:当前过程)
-s, - 缓冲区读取操作的尺寸大小的大小
-m, - 模式模式访问模式用于读取操作[可能的值:字节,单词,dword,qword,buffer]
-p, - CR3信息和虚拟到物理翻译的PID PID PID目标过程
-cr3查询目标过程的CR3值(默认:当前过程)
- Verbose显示调试输出
-h, - - 螺旋打印的帮助(请参阅更多的“ - 螺旋”)
-v, - Version打印版本如果您想自己编译CLI工具,请更改为目录,并按照(CLI)读数中的说明进行构建。否则,只需下载预构建程序,就应该在任何Linux上使用。使用CLI工具:加载内核驱动程序
#pmem insmod路径/to/linpmem.ko使用PMEM工具加载驱动程序的优点是您不必自己创建设备文件,它将(在接下来的发行版上)选择谁拥有LinpMem设备。
如果您不想使用USERMODE库,并且更喜欢直接与驱动程序进行连接,则可以在./userspace_interface/linpmem_shared.h中找到其用户空间API/接口和文档。我们还提供了示例/test.c中的示例代码,该代码说明了如何直接使用驱动程序。
$ sudo insmod linpmem.ko
INSMOD: ERROR:无法插入模块linpmem.ko:操作不允许使用其他方法仍然加载模块。显而易见的是在UEFI设置中禁用安全启动。
如果您的发行版支持它,则更优雅的解决方案是在使用该模块之前签署该模块。可以使用以下步骤完成此操作(在Ubuntu 20.04上测试)。
Install mokutil: $ sudo apt install mokutil Create the singing key material: $ openssl req -new -newkey rsa:4096 -keyout mok-signing.key -outmodmok-signing.crt -outform DER -days 365 -nodes -subj '/CN=Some descriptive name/' Make sure to adjust the options to your needs.特别是,请考虑关键长度(-newkey),有效性(-days),设置密钥通行短语(-nodes;如果要设置通行证短语)的选项,将通用名称包括在证书(-subj)中。注册新的MOK: $ SUDO MOKUTIL -IMPORT MOK-SIGNING.CRT您将要求您提供一个密码,这是下一步所必需的。考虑使用密码,您可以在美国键盘布局上输入密码。重新启动系统。它将输入MOK注册菜单。请按照说明注册新键。签署模块后,一旦注册了MOK,就可以签署模块。 $/usr/src/linux-Headers-$(uname -r)/scripts/sign-file sha256路径/to/mok-singing/mok.key path/to/mok.cert path/to/linpmem.ko之后,您应该能够加载模块。
请注意,从法医准备的角度来看,您应该准备一个签名的模块before您需要它,因为系统将在上述过程中重新启动两次,从而破坏了内存中的大多数挥发性数据。
我们要感谢迈克马云惹不起马云科恩(Mike Cohen)和约翰内斯马云惹不起马云斯特格(JohannesStüttgen)的飞行员工作和对PTE重塑的开源贡献,这是10年后仍在使用的技术。我们的开源贡献者:
Viviane Zwanger Valentin obs
目前,LINPMEM功能:
从物理地址(访问模式,单词,dword,Qword或Buffer)中读取CR3信息服务(通过PID指定目标过程)虚拟到物理地址转换服务CACHE CASCE CONTROL将来,以支持专门的读取访问模式。
Building the kernel driver
至少目前,您必须自己编译LINPMEM驱动程序。目前正在其他Linux系统上加载预编译LinPMEM驱动程序的方法,但尚未完成。也就是说,编译LinpMem驱动程序并不困难,基本上它正在执行“制造”。Step 1 - getting the right headers
您需要制造和C编译器。 (我们建议海湾合作委员会,但Clang也应该工作)。确保您安装了Linux-Headers(使用目标Linux发行版的任何包装管理器)。确切的包装名称可能会因您的分发而异。一种快速(独立于发行的)方法,用于检查是否已安装了包装:
ls -l/usr/lib/lib/模块/`uname -r`/就是这样,您可以继续步骤2。
当前Foreign system:,如果要编译另一个系统的驱动程序,例如,因为要创建一个内存转储,但无法在目标上编译,则必须直接从该系统Linux Distibstion的包装存储库中下载标头软件包。双重检查包版本与外国系统上运行的版本和内核版本完全匹配。如果另一个系统使用自我编译的内核,则必须获得该内核构建目录的副本。然后,将任一目录的位置放置在KDIR环境变量中。
导出kdir=路径/到/提取/header/package/or/kernel/root
Step 2 - make
编译驱动程序很简单,只需type:这样做应在当前工作目录中产生linpmem.ko。
您可能需要在之前检查precompiler.h,然后选择是否要编译进行发布还是调试(例如,使用调试打印)。现在没有其他其他预编译器设置。
Loading The Driver
可以使用insmod to-linpmem.ko加载linpmem.ko模块,并用RMMOD to to to-linpmem.ko卸载。 (这只会在此正常运行时间内加载驱动程序。)如果您进行了调试,请查看DMESG。加载后,要与驾驶员交谈,您需要创建设备:
MKNOD /DEV /LINPMEM C 42 0如果您不能与驾驶员交谈,则可能检查DMESG日志以验证“ 42”确实是注册的Major:
[12827.900168] Linpmem:注册了42号的Chrdev,尽管通常内核会尝试真正分配此数字。
如果您不想始终打开根控制台,则可以在设备上使用Chown将其提供给用户。 (或者只是在根控制台中继续使用它。)
观看DMESG输出。如果您看到任何问题,请报告错误!警告:如果LinpMem的DMESG错误打印说要重新启动,最好立即执行此操作。警告:这是一个早期版本。
Usage
Demo Code
有一个示例代码演示和解释(详细说明)如何与驱动程序进行交互。用户空间API参考可以在./userspace_interface/linpmem_shared.h中找到。CD DEMO GCC -O TEST.C(SUDO)./test //=如果您在设备上没有使用Chown,则需要Sudo。如果您想了解如何直接与驱动程序交互而不是使用库,则此代码很重要。它也可以用作短函数测试。
Command Line Interface Tool
有一个(可选的)基本命令线接口工具,用于PMEM CLI工具LinpMem。可以在此处找到: https://github.com/vobst/linpmem-cli。除源代码外,还有一个预编译的CLI工具以及可以在此处找到的预编译的静态库和标题(已签名)。 Note:这是一个初步版本,请务必检查更新,因为许多添加和增强功能很快就会随之而来。PMEM CLI工具可用于以(相对)安全和方便的方式测试LINPMEM的各种功能。 LinpMem也可以由此工具加载,而不是使用InsMod/RMMOD,将来有一些额外的选项。这也具有PMEM自动创建合适的设备供您立即使用的优势。它非常便携,并且在任何Linux系统上运行(实际上,即使在Linux 2.6上也经过了测试)。
$ ./pmem -H
LINPMEM驱动程序的命令行客户端
USAGE: PMEM [options] [命令]
命令:
insmod加载linpmem驱动程序
帮助打印此消息或给定子命令的帮助
Options:
-a, - 地址的物理阅读操作地址
-v, - virt-address virt_address在目标过程的地址空间中翻译地址(default:当前过程)
-s, - 缓冲区读取操作的尺寸大小的大小
-m, - 模式模式访问模式用于读取操作[可能的值:字节,单词,dword,qword,buffer]
-p, - CR3信息和虚拟到物理翻译的PID PID PID目标过程
-cr3查询目标过程的CR3值(默认:当前过程)
- Verbose显示调试输出
-h, - - 螺旋打印的帮助(请参阅更多的“ - 螺旋”)
-v, - Version打印版本如果您想自己编译CLI工具,请更改为目录,并按照(CLI)读数中的说明进行构建。否则,只需下载预构建程序,就应该在任何Linux上使用。使用CLI工具:加载内核驱动程序
#pmem insmod路径/to/linpmem.ko使用PMEM工具加载驱动程序的优点是您不必自己创建设备文件,它将(在接下来的发行版上)选择谁拥有LinpMem设备。
Libraries
PMEM命令线接口只是一个小小的锈库周围的薄包装器,该包装库揭示了用于与驾驶员接口的API。更高级的用户也可以使用此库。从https://github.com/vobst/linpmem-cli编译时,将自动编译该库(作为静态便携式库)以及PMEM CLI工具,但此处还包括(预先编译)(签名)。 Note:这是一个初步版本,更快遵循。如果您不想使用USERMODE库,并且更喜欢直接与驱动程序进行连接,则可以在./userspace_interface/linpmem_shared.h中找到其用户空间API/接口和文档。我们还提供了示例/test.c中的示例代码,该代码说明了如何直接使用驱动程序。
Memdumping tool
尚未实施。Tested Linux Distributions
Debian,自构式6.4.x,qemu/kvm,不寄生。 pti: Off/on debian 12,Qemu/kvm,完全寄电。 pti:在ubuntu服务器上,QEMU/KVM,未寄生。 PTI:在Fedora 38上,QEMU/KVM,完全寄电。 PTI: on Baremetal Linux test, AMI BIOS: Linux 6.4.4 PTI: on Baremetal Linux test, HP: Linux 6.4.4 PTI: on Baremetal, Arch[-hardened], Dell BIOS, Linux 6.4.X Baremetal, Debian, 6.1.X Baremetal, Ubuntu 20.04 with Secure启动。有效,但首先签名驱动程序。 Baremetal,Ubuntu 22.04,Linux 6.2.xHandling Secure Boot
如果系统在加载模块时报告以下错误消息,则可能是因为安全boot:$ sudo insmod linpmem.ko
INSMOD: ERROR:无法插入模块linpmem.ko:操作不允许使用其他方法仍然加载模块。显而易见的是在UEFI设置中禁用安全启动。
如果您的发行版支持它,则更优雅的解决方案是在使用该模块之前签署该模块。可以使用以下步骤完成此操作(在Ubuntu 20.04上测试)。
Install mokutil: $ sudo apt install mokutil Create the singing key material: $ openssl req -new -newkey rsa:4096 -keyout mok-signing.key -outmodmok-signing.crt -outform DER -days 365 -nodes -subj '/CN=Some descriptive name/' Make sure to adjust the options to your needs.特别是,请考虑关键长度(-newkey),有效性(-days),设置密钥通行短语(-nodes;如果要设置通行证短语)的选项,将通用名称包括在证书(-subj)中。注册新的MOK: $ SUDO MOKUTIL -IMPORT MOK-SIGNING.CRT您将要求您提供一个密码,这是下一步所必需的。考虑使用密码,您可以在美国键盘布局上输入密码。重新启动系统。它将输入MOK注册菜单。请按照说明注册新键。签署模块后,一旦注册了MOK,就可以签署模块。 $/usr/src/linux-Headers-$(uname -r)/scripts/sign-file sha256路径/to/mok-singing/mok.key path/to/mok.cert path/to/linpmem.ko之后,您应该能够加载模块。
请注意,从法医准备的角度来看,您应该准备一个签名的模块before您需要它,因为系统将在上述过程中重新启动两次,从而破坏了内存中的大多数挥发性数据。
Known Issues
未实现巨大的页面读取。 Linpmem识别出一个庞大的页面,并拒绝阅读。通过启用CPU缓存,将从映射IO和DMA空间中读取。在第桌步行期间没有锁。同时修改进行时,这可能会导致有趣的结果。这是现场直播阅读的一般且(主要是无法解决的)问题,而无需停止整个操作系统。安全启动(Ubuntu):请在使用之前签署驱动程序。任何CPU驱动的内存加密,例如AMD SME,Intel SGX/TDX, Pluton芯片? (如果您遇到任何事情,请报告潜在问题。)Under work
在任何Linux上加载预编译驱动程序。处理器缓存控制。示例:用于映射的I/O和DMA空间的未读取。Future work
ARM/MIPS支撑。 (未来的工作)传统内核(例如2.6),基于UNIX的内核Acknowledgements
LinpMem以及WinpMem,如果没有我们(现已退休的)Rekall Project: 3: 3https://Github.com/google/google/rekall的(现已退休的)Rekall Project:的工作。我们要感谢迈克马云惹不起马云科恩(Mike Cohen)和约翰内斯马云惹不起马云斯特格(JohannesStüttgen)的飞行员工作和对PTE重塑的开源贡献,这是10年后仍在使用的技术。我们的开源贡献者:
Viviane Zwanger Valentin obs