19 个版本
0.2.3 | 2024年7月29日 |
---|---|
0.2.1 | 2024年1月5日 |
0.2.0 | 2023年12月25日 |
0.2.0-beta9 | 2022年10月31日 |
0.0.0 | 2020年7月16日 |
34 在 内存管理 中排名
876 每月下载量
在 16 crate 中使用
725KB
14K SLoC
memflow
简化机器内省
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系列。
- memflow基础知识
- memflow应用(该系列针对memflow 0.1,因此大部分代码可能需要更改)
运行示例
您可以使用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 构建
官方支持的项目
- memflow-py memflow 的 Python 包装器(感谢 emesare)
来自社区的额外项目
致谢
贡献
请检查 CONTRIBUTE.md
依赖项
~5–16MB
~193K SLoC