#内存访问 #内存 #虚拟机 #内省 #操作系统 #进程运行 #DMA

无 std memflow

memflow 物理内存内省框架的核心组件

19 个版本

0.2.3 2024年7月29日
0.2.1 2024年1月5日
0.2.0 2023年12月25日
0.2.0-beta92022年10月31日
0.0.0 2020年7月16日

34内存管理 中排名

Download history 513/week @ 2024-05-03 288/week @ 2024-05-10 227/week @ 2024-05-17 228/week @ 2024-05-24 146/week @ 2024-05-31 182/week @ 2024-06-07 169/week @ 2024-06-14 166/week @ 2024-06-21 92/week @ 2024-06-28 128/week @ 2024-07-05 111/week @ 2024-07-12 90/week @ 2024-07-19 408/week @ 2024-07-26 162/week @ 2024-08-02 146/week @ 2024-08-09 148/week @ 2024-08-16

876 每月下载量
16 crate 中使用

MIT 许可证

725KB
14K SLoC

memflow

Crates.io build and test codecov MIT licensed Discord

简化机器内省

memflow 是一个库,允许以通用方式内省各种机器(硬件、虚拟机、内存转储)。在 memflow 中有 2 种主要类型的对象 - 连接器操作系统层。连接器提供对机器物理内存的原始访问。同时,操作系统层在运行中的操作系统之上构建了一个更高级别的抽象,提供对运行中的进程、输入事件等的访问。这些对象非常灵活,可以将它们链接在一起以访问深层次虚拟化的进程(见下图)。

+-----------+        +-----------+
| native OS |        | leechcore |
+-+---------+        +-+---------+
  |                    |
  |  +-----------+     |  +----------+
  +->|  QEMU VM  |     +->| Win32 OS |
     +-+---------+        +-+--------+
       |                    |
       |  +----------+      |  +-----------+
       +->| Win32 OS |      +->| lsass.exe |
          +-+--------+         +-----------+
            |
            |  +-----------+
            +->|  Hyper-V  |
               +-+---------+
                 |
                 |  +----------+
                 +->| Linux OS |
                    +-+--------+
                      |
                      |  +-----------+
                      +->| SSHD Proc |
                         +-----------+

(Example chains of access. For illustrative purposes only - Hyper-V Connector and Linux OS are not yet available)

作为库用户,您无需担心链接的复杂性 - 一切都已提供,电池包含在内。请参阅我们的示例,了解构建链(不包括解析)是多么简单。所有连接器和操作系统层都可以使用通用接口动态加载。

所有这些灵活性都是通过一个非常健壮和高效的底层后端提供的 - 内存接口是可分批和可分割的,这被我们的吞吐量优化的虚拟地址转换管道所利用,该管道能够在不到一秒钟内遍历整个进程的虚拟地址空间。连接器和操作系统层可以与大量通用的缓存机制、实用函数和数据结构组合。

memflow生态系统并不仅限于Rust - 连接器和操作系统层函数使用C ABI链接在一起,因此用户可以用其他语言编写与它们接口的代码,例如C、C++、Zig等。此外,这些插件也可以用外语实现 - 一切都是开放的。

总体而言,memflow是机器内省最稳健、高效和灵活的解决方案。

入门指南

请确保您的rustc版本至少为1.74.0或更高版本。

memflow采用插件式方法,能够在运行时加载不同的物理内存后端(所谓的connectors)。在物理内存后端之上,memflow还能够在运行时加载用于与特定目标操作系统交互的插件。

要开始,您至少需要安装一个连接器。为此,请使用memflowup实用程序(使用开发通道)。

手动安装

Linux上连接器的推荐安装位置为

/usr/lib/memflow/libmemflow_xxx.so
$HOME/.local/lib/memflow/libmemflow_xxx.so

Windows上连接器的推荐安装位置为

[Username]/Documents/memflow/libmemflow_xxx.dll

此外,连接器还可以放置在环境PATH中的任何目录或程序的工作目录中。

有关如何开始使用memflow的更多信息,请访问由h33p制作的YouTube系列。

运行示例

您可以使用cargo run --release --example运行示例之一。不传递任何内容以获取示例列表。

某些连接器(如qemu)需要提升权限。有关它们所需访问权限的更多信息,请参阅连接器的readme。

为了简化通过不同连接器运行示例、测试和基准测试,我们在本存储库中添加了一个简单的cargo runner脚本。在运行cargo命令时,只需设置以下任一环境变量即可提升权限

  • RUST_SUDO将通过sudo启动生成的二进制文件。
  • RUST_SETPTRACE在执行之前将启用PTRACE权限。

或者,您可以通过cargo bench(可以传递正则表达式过滤器)运行基准测试。Win32基准测试目前仅在Linux上工作。

所有示例都支持memflow连接器plugins库存系统。您至少需要安装一个connector才能使用示例。有关详细信息,请参阅入门指南部分。

使用qemu连接器运行memflow/read_keys示例

RUST_SETPTRACE=1cargo run--example read_keys-- -vv-c qemu-a[vmname] -o win32

使用coredump连接器运行memflow/read_bench示例

cargorun --exampleread_bench --release ---vv -c coredump -a coredump_win10_64bit.raw -o win32

注意:在上面的示例中,qemu 连接器需要 'CAP_SYS_PTRACE'=ep' 权限。当将 RUST_SETPTRACE 环境变量传递给运行脚本时,该脚本将设置适当的标志。

文档

更详细的代码文档可以在 docs.rs 找到(目前相对较旧)。

此外,在 memflow.github.io 可以找到入门指南以及 memflow 内部工作原理的高级解释。

如果您决定构建最新的文档,可以通过以下命令进行

cargodoc --workspace --no-deps --open

编译支持

memflow 目前至少需要 rustc 版本 1.74.0 或更高版本。

目标 构建 测试 基准 在稳定版上编译
linux x86_64 ✔️ ✔️ ✔️ ✔️
mac x86_64 ✔️ ✔️ ✔️ ✔️
win x86_64 ✔️ ✔️ ✔️ ✔️
linux aarch64 ✔️ ✔️ ✔️ ✔️
linux i686 ✔️ ✔️ ✔️ ✔️
linux armv7 ✔️ ✔️ ✔️ ✔️
无标准 ✔️ ✔️ ✔️

目标支持

默认情况下,memflow 支持在任意机器上分析 64 位机器,无论是 32 位还是 64 位。在不使用 default_features 的情况下使用 memflow 可以在 32 位机器上禁用 64 位支持以提高效率,而启用 128_bit_mem 功能可以为理论上的 128 位机器分析做准备。请注意,所有连接器和操作系统层都必须使用相同的内存功能编译,并且 memflowup 目前只编译默认的功能集。

memflow-win32 在最新的 Windows 11 和 Windows 10 版本以及 Windows NT 4.0 上进行了测试。如果您发现某个版本不工作,请提交一个包含主要/次要版本以及构建号的 issue。

连接器

此存储库中提供的所有示例都使用 plugins 库来动态加载连接器。当以程序方式使用库时,可以仅将连接器静态链接到代码中。

一些连接器还需要不同的权限。有关更多信息,请参阅各个连接器的存储库。

以下是目前官方存在的连接器

如果您编写了自己的连接器,请通过 pull request 联系我们,以便我们可以维护第三方连接器的列表。

基于 memflow 构建

官方支持的项目

来自社区的额外项目

致谢

  • CasualX 对于他出色的 pelite crate
  • ufrisk 对于他在该主题上的先前工作以及许多启发

贡献

请检查 CONTRIBUTE.md

依赖项

~5–16MB
~193K SLoC