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

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

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

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

工具目录

分类

查看所有分类
Loading categories
mquire — 零依赖的Linux内存取证,利用内核嵌入的BTF和kallsyms进行类型感知的内存分析,无需外部调试信息。 | Kitploit
工具/GitHubGitHub/trailofbits/mquire
OSINT (开源情报)内存取证漏洞分析逆向工程取证分析恶意软件分析数字取证二进制分析威胁情报学习与教育事件响应
GitHub
18485天前Kitploit 审核通过

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
trailofbits/mquire

mquire

零依赖的Linux内存取证,利用内核嵌入的BTF和kallsyms进行类型感知的内存分析,无需外部调试信息。

查看仓库网站

mquire

mquire,由 memory 和 inquire 组合而成,是一款受 osquery 启发而开发的内存查询工具。

核心优势:无需外部调试符号

mquire 可以在不需要外部调试符号的情况下分析 Linux 内核内存快照。

分析所需的一切都已嵌入内存转储本身。这意味着你可以分析:

  • 从未见过的未知或定制内核
  • 无需准备的任何 Linux 发行版
  • 外部调试符号不可用或丢失的内存快照

要求

内核版本要求:

  • BTF 支持:内核 4.18 或更新版本,并启用了 BTF(大多数现代发行版默认启用)
  • Kallsyms 支持:内核 6.4 或更新版本(由于 scripts/kallsyms.c 格式的变更)

工作原理

mquire 通过读取现代 Linux 内核中嵌入的两种信息来分析内核内存:

  1. 来自 BTF 的类型信息(BPF 类型格式)- 描述内核数据类型的结构和布局。BTF 数据使用 btfparse crate 进行解析。
  2. 来自 Kallsyms 的符号信息 - 提供内核符号的内存位置(与 /proc/kallsyms 使用的数据相同)

通过结合类型信息和符号位置,mquire 可以查找和读取复杂的内核数据结构,例如:

  • 进程内存映射(使用 maple tree 结构)
  • 缓存的文件数据(使用 XArray 结构)
  • 内核日志消息

这使得直接从内核的文件缓存中提取文件成为可能,即使这些文件已从磁盘中删除。

兼容性说明

Kallsyms 扫描器依赖于内核源码中 scripts/kallsyms.c 的数据格式。如果未来内核版本更改了此格式,扫描器的启发式方法可能需要更新。

功能

表

mquire 提供了 SQL 表来查询系统的不同方面或工具自身的状态。

mquire 不是一个数据库。 每次查询都通过扫描内存并跟随指针来重建内核数据结构。没有预计算的索引或缓存结果:每次表访问都是对内核数据的遍历。使用 AS MATERIALIZED 可避免冗余扫描(请参阅查询优化),并在查询每个进程的表(如 task_open_files 和 memory_mappings)时提供 task 等约束,以将扫描限制为单个进程。

设计原则:虚拟地址作为连接键。 表使用 virtual_address(底层数据结构的内核地址)作为规范的连接键,而不是 pid 或其他用户可见的标识符。这是有意为之,因为相同的 PID 可能在不同的发现源和根任务中出现多次,而虚拟地址唯一标识一个特定的内核对象。SQL 表和底层的 LinuxOperatingSystem API 都围绕这一约定构建。

系统信息

  • os_version - 内核版本和架构
  • system_info - 主机名和域名
  • boot_time - 系统启动时间
  • kallsyms - 内核符号地址(与 /proc/kallsyms 相同的数据)
  • dmesg - 内核环形缓冲区消息(与 dmesg 命令相同的数据)

进程信息

  • tasks - 运行中的进程,包含命令行和二进制路径。每个任务通过多个独立源发现,这对于 rootkit 检测非常有用。请参阅比较用于 rootkit 检测的任务枚举方法和去重后的进程列表。
  • task_open_files - 每个进程打开的文件(提供 task 约束进行针对性分析,或一次性查询所有任务)
  • memory_mappings - 每个进程映射的内存区域(提供 task 约束进行针对性分析,或一次性查询所有任务)
  • task_capabilities - 任务的 Linux 能力集(有效、许可、可继承、边界、环境)。需要 task 约束,因此请与 tasks/processes 进行连接(例如 JOIN task_capabilities c ON c.task = p.virtual_address)。
  • task_ptrace_flags - 解码给定任务的 ptrace 字段。需要 task 约束。

内核模块

  • kernel_modules - 已加载的内核模块及其元数据(名称、状态、版本、参数、污染标志)
  • kernel_module_mem_entries - 内核模块对象中的 mem 条目。需要 kernel_module 约束,因此请与 kernel_modules 进行连接(例如 JOIN kernel_module_mem_entries r ON r.kernel_module = m.virtual_address)。
  • ftrace_ops - 默认从 ftrace_ops_list 符号遍历的 struct ftrace_ops 节点列表。约束 virtual_address 以读取单个节点,或约束 start_vaddr(可选地通过 end_vaddr 限制范围)以从任意节点开始遍历。

网络信息

  • network_connections - 活动的网络连接(TCP 套接字)
  • network_interfaces - 网络接口及其 IP 地址和 MAC 地址

文件系统

  • syslog_file - 从内核文件缓存读取的系统日志(即使日志文件已被删除或不可用,只要它们缓存在内存中,此功能仍然有效)

调试

  • mquire_diagnostics - 显示分析进度、警告和错误的内部 mquire 日志

命令

mquire 提供三个主要命令:

  • mquire shell - 启动交互式 SQL shell 以查询内存快照
  • mquire query - 执行单个 SQL 查询并输出结果(支持 JSON 或表格格式)
  • mquire command - 对内存快照执行自定义命令(例如 .task_tree、.system_version、.dump)

点命令

mquire 提供了以点 (.) 为前缀的特殊命令,以区别于 SQL 查询。

内置命令

这些命令可在交互式 shell 和 mquire query 中使用:

  • .tables - 列出所有可用表
  • .schema - 显示所有表的模式
  • .schema <table> - 显示特定表的模式
  • .commands - 列出所有可用的自定义命令
  • .exit - 退出交互式 shell(仅限 shell)

自定义命令

这些命令可在交互式 shell 和 mquire command 中使用:

对任何命令使用 --help 可查看可用选项和用法信息。例如:.task_tree --help

.system_version

显示操作系统版本信息。

这是一个便捷命令,等同于 SELECT * FROM os_version,但输出格式更美观。

.task_tree

显示运行中进程和线程的层次结构树,类似于 Linux 上的 pstree 命令。

选项:

  • --show-threads - 除进程外还包括线程。启用时,显示每个条目的 TGID 和 TID。
  • --use-real-parent - 使用 real_parent 字段而不是 parent 来构建树结构。real_parent 字段显示任何重新父进程之前的原始父进程(即使在父进程退出后,也对于跟踪进程创建链很有用)。

注意:

  • 格式为 [TGID TID](显示线程时)或 [TGID](隐藏线程时)。TGID(线程组 ID)通常称为 PID。对于主线程(TGID == TID),两个值相同。

.carve

将虚拟内存区域提取到磁盘。此命令使用给定的页表从特定的虚拟地址范围提取原始内存内容,适用于提取进程内存、堆内容或其他内存区域。

参数:

  • ROOT_PAGE_TABLE - 根页表的物理地址(十六进制字符串,可带有 0x 前缀)。这决定了用于地址转换的地址空间。
  • VIRTUAL_ADDRESS - 开始提取的虚拟地址(十六进制字符串,可带有 0x 前缀)。
  • SIZE - 要提取的字节数。
  • DESTINATION_PATH - 输出文件路径,提取的内存将写入此路径。

注意:

  • 该命令在写入前会显示已映射和未映射区域的摘要。
  • 未映射区域在输出文件中以零填充。

.dump

从内核的文件缓存中提取文件,以直接从内存中恢复文件。此命令遍历所有任务及其打开的文件描述符,从页缓存中提取文件内容。

参数:

  • OUTPUT - 提取文件的输出目录。文件按 TGID 组织(例如 tgid_1234/path/to/file)。

注意:

  • 目前适用于通过文件描述符(来自进程文件描述符表)打开的文件。
  • 尚不支持从内存映射文件中提取数据。
  • 空文件(页缓存中无数据)将被跳过。
  • 读取错误区域在输出中以零填充。

使用场景

mquire 专为以下场景设计:

  • 取证分析 - 分析来自受损系统的内存快照,以了解正在运行的程序和访问过的文件
  • 应急响应 - 快速查询内存转储以寻找恶意活动的证据
  • 安全研究 - 从内存快照中研究内核内部结构和进程行为
  • 恶意软件分析 - 在不被发现的情况下检查运行中的进程及其文件操作
  • 自定义工具开发 - 使用 mquire 库 crate 构建自己的分析工具,该库提供了用于内核内存分析的可重用 API

构建与安装

通过 CI 提供的预构建包

预构建包可作为 CI 运行的构件提供。您可以从 Actions 选项卡 下载,方法是选择一次成功的 workflow 运行并下载构件。支持以下包格式:

  • linux-deb-package - Debian/Ubuntu .deb 包
  • linux-rpm-package - Fedora/RHEL/CentOS .rpm 包
  • linux-tgz-package - 通用 Linux .tar.gz 存档

从源码构建

mquire 使用 Rust 编写。要构建它:```bash

Clone the repository

git clone https://github.com/trailofbits/mquire cd mquire

Build the project

cargo build --release

The binary will be in target/release/

- mquire: Unified tool with shell, query, and command modes

root@kitploit:~
## 支持的快照格式

mquire 支持以下内存快照格式,通过文件扩展名检测:

| 格式 | 扩展名 | 描述 |
|--------|-----------|-------------|
| 原始 | `.raw` | 平坦物理内存转储(物理地址空间的逐字节副本) |
| LiME | `.lime` | [Linux 内存提取器](https://github.com/504ensicsLabs/LiME) 格式,带有地址范围头部 |
| ELF 内核 | `.elf` | 包含 PT_LOAD 段的 ELF 内核转储(由 `virsh dump` 或 QEMU `dump-guest-memory` 生成) |

## 获取内存快照

### 使用 AVML(推荐)

我们推荐使用 [AVML](https://github.com/microsoft/avml) 从运行中的 Linux 系统获取内存快照。之前曾推荐过 [LiME](https://github.com/504ensicsLabs/LiME),但它已不再积极维护。```bash
sudo avml output.lime

重要提示: 在获取用于 mquire 的快照时,不要使用 --compress。mquire 不支持压缩的 AVML 快照。如果您有压缩的快照,请先使用 avml-convert 解压缩:avml-convert compressed.lime uncompressed.lime

有关其他选项,请参阅 AVML 文档。

使用 virsh(虚拟机)

对于 libvirt/KVM 虚拟机,请使用 virsh dump 生成 ELF 核心转储:```bash virsh -c qemu:///system dump output.elf --memory-only --format elf

root@kitploit:~
VM 在转储期间暂停,之后恢复。添加 `--live` 可避免暂停,但会牺牲快照一致性。

## 入门

获得内存快照后,你可以使用 SQL 查询和自定义命令与之交互。mquire 提供了三种与快照交互的方式:

### 交互式 shell

启动交互式 SQL shell:```bash
mquire shell /path/to/memory.raw

这会打开一个提示符,您可以在其中交互式地运行SQL查询和命令:```bash mquire> .tables # List all available tables mquire> .schema tasks # Show schema for a specific table mquire> SELECT * FROM tasks; # Run SQL queries mquire> .task_tree --show-threads # Run custom commands mquire> .exit # Exit the shell

root@kitploit:~
### 一次性SQL查询

从命令行执行单个SQL查询或内置命令:```bash
# Output as JSON (default)
mquire query /path/to/memory.raw "SELECT * FROM os_version"

# Output as table format
mquire query /path/to/memory.raw "SELECT * FROM tasks" --format table

# Built-in commands work too
mquire query /path/to/memory.raw ".tables"
mquire query /path/to/memory.raw ".schema tasks"

执行自定义命令

运行自定义命令进行专门分析:```bash

List all available commands (default behavior)

mquire command /path/to/memory.raw

Display system version

mquire command /path/to/memory.raw ".system_version"

Show process tree

mquire command /path/to/memory.raw ".task_tree"

Show process tree with threads

mquire command /path/to/memory.raw ".task_tree --show-threads"

Get help for a command

mquire command /path/to/memory.raw ".task_tree --help"

root@kitploit:~
## Autostart SQL Files

mquire 在启动时会自动加载并执行 `$HOME/.config/trailofbits/mquire/autostart/` 目录下的 SQL 文件。文件按操作系统和架构进行组织:```
autostart/
  common/common/    # All platforms and architectures
  common/{arch}/    # All platforms, specific architecture
  {os}/common/      # Specific platform, all architectures
  {os}/{arch}/      # Specific platform and architecture

每个目录内的文件按字母顺序排序。目录按上述顺序扫描。

特性:

  • 文件必须具有 .sql 扩展名
  • 错误会记录到 mquire_diagnostics,但不会阻止执行
  • 同时适用于 mquire shell 和 mquire query 命令

预置视图

mquire 在 sql/views/ 目录中附带可复用的 SQL 视图。使用 just install-views 安装它们。完整列表、编号约定和目录结构请参阅 views README。

Linux 视图 (sql/views/linux/common/):

  • 000_processes.sql — 跨所有发现源的去重进程列表,过滤为用户空间进程领导者。使用 SELECT * FROM processes 查询。
  • 100_process_network_connections.sql — 通过文件描述符关联,将网络连接映射到所属进程。使用 SELECT * FROM process_network_connections WHERE comm = 'sshd' 查询。
  • 120_process_capabilities.sql — 快速查看能力概览,每进程一行,每个集合以紧凑列表形式呈现(ALL、'' 或能力名称;若不可读则为 NULL)。使用 SELECT * FROM process_capabilities 查询。
  • 130_process_ptrace_flags.sql — 快速查看 ptrace 概览,每进程一行,以紧凑列表形式呈现 标志集合(未跟踪时为 )以及原始值。使用 查询。

查询优化

mquire 查询需要通过使用嵌入的类型信息和调试符号解引用指针,从虚拟内存重建内核数据结构。此处理过程可能开销较大,因此使用查询优化技术可显著提升性能。

通过 AS MATERIALIZED 进行物化

当表用于 JOIN 或多次访问时,使用 AS MATERIALIZED 提示来缓存表结果。

何时物化:

  • 生成开销较大的表(例如 tasks 需要遍历进程结构的链表,为每个进程解引用多个指针)
  • 用于 JOIN 的表(在查询执行期间多次访问)
  • 在同一查询中被多次引用的表

示例:```sql -- Find network connections for a specific process using materialization WITH target_tasks AS MATERIALIZED ( SELECT * FROM tasks WHERE comm = 'sshd' AND type = 'thread_group_leader' ),

network_connections_mat AS MATERIALIZED ( SELECT * FROM network_connections )

SELECT t.tgid, t.comm, nc.local_address, nc.local_port, nc.remote_address, nc.remote_port, nc.state, nc.protocol FROM target_tasks t JOIN task_open_files tof ON tof.task = t.virtual_address JOIN network_connections_mat nc ON nc.inode = tof.inode;

root@kitploit:~
**注意:** `task_open_files` 和 `memory_mappings` 表使用 `task` 列作为生成器输入。当与 `tasks` 表连接时,SQLite 通过嵌套循环连接自动传递约束条件,使得直接 JOIN 更高效。

**性能影响:** 物化可为含有 JOIN 的查询提供显著的加速(通常快 2-5 倍)

**示例基准测试结果:**

*测试在 Ubuntu 24.04 快照(内核 6.8.0-63)上执行,含 351 个进程、50 个连接、2142 个打开文件。性能会因快照大小、内核版本和硬件而异。*

| 方法 | 实时时间 | 用户时间 | 加速比 |
|--------|-----------|-----------|---------|
| 无物化 | 12.067s | 16.373s | 基准线 |
| 有物化 | 3.171s | 8.786s | **快 3.8 倍** |

### JOIN 顺序优化

**从最小的表开始,朝着较大的表进行 JOIN**,以最小化查询管道早期处理的行数。

**典型表大小:**
- `network_connections`:最小——仅包含有网络活动的进程
- `tasks`:中等——所有进程
- `task_open_files`:最大——所有打开的文件描述符

**最佳顺序:**

从经过筛选的 tasks 表开始,然后向较大的表进行 JOIN:```sql
FROM target_tasks t                                       -- filtered tasks
JOIN task_open_files tof ON tof.task = t.virtual_address  -- open files
JOIN network_connections_mat nc ON nc.inode = tof.inode   -- matching connections

理解查询执行

使用 EXPLAIN QUERY PLAN 查看 SQLite 如何执行你的查询:```sql EXPLAIN QUERY PLAN SELECT ... FROM target_tasks t JOIN task_open_files tof ON tof.task = t.virtual_address JOIN network_connections_mat nc ON nc.inode = tof.inode;

root@kitploit:~
寻找:
- **布隆过滤器**:SQLite 对大型 JOIN 的优化
- **自动覆盖索引**:为查找创建的临时索引
- **扫描**:全表扫描(驱动表预期方式)
- **搜索**:基于索引的查找(高效)

### 最佳实践

1. **始终物化 JOIN 中开销大的表**
2. **从最小的表开始**作为驱动表
3. **在脚本中使用多行 SQL** 以提高可读性
4. **使用 `EXPLAIN QUERY PLAN` 检查查询计划** 对于复杂查询
5. **避免在生产中使用 `SELECT *`** - 仅指定需要的列

### 文件提取

将文件从内存提取到磁盘:```bash
mquire command /path/to/memory.raw ".dump /output/directory"

示例查询

所有查询均使用标准 SQL 语法。

系统版本```bash

$ mquire shell ubuntu2404_6.14.0-37-generic.lime mquire> SELECT * FROM os_version; arch:"x86_64" kernel_version:"6.14.0-37-generic" system_version:"#37~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Nov 20 10:25:38 UTC 2"

root@kitploit:~
#### 系统信息```bash
$ mquire shell ubuntu2404_6.14.0-37-generic.lime
mquire> SELECT * FROM system_info;
domain:"(none)" hostname:"ubuntu2404"

内核模块```bash

$ mquire shell ubuntu2404_6.14.0-37-generic.lime mquire> SELECT name, state, src_version, parameters FROM kernel_modules LIMIT 5; name:"snd_seq_dummy" state:"live" src_version:"7A40E0FD47A0746D1C9CD85" parameters:"ump (perm: 0o444), duplex (perm: 0o444), ports (perm: 0o444)" name:"snd_hrtimer" state:"live" src_version:"81EE6D58896E2C2E63E252D" parameters:"" name:"qrtr" state:"live" src_version:"473C5AB47E04ECEA0106681" parameters:"" name:"virtio_rng" state:"live" src_version:"0852940240D554836D22CB2" parameters:"" name:"intel_rapl_msr" state:"live" src_version:"34853C4F5EB8FCAD28ACFB3" parameters:""

root@kitploit:~
#### 运行任务```bash
$ mquire shell ubuntu2404_6.14.0-37-generic.lime
mquire> SELECT comm, binary_path, command_line FROM tasks WHERE command_line NOT NULL AND comm LIKE "%systemd%";
comm:"systemd" binary_path:"/usr/lib/systemd/systemd" command_line:"/sbin/init splash"
comm:"systemd-oomd" binary_path:"/usr/lib/systemd/systemd-oomd" command_line:"/usr/lib/systemd/systemd-oomd"
comm:"systemd-resolve" binary_path:"/usr/lib/systemd/systemd-resolved" command_line:"/usr/lib/systemd/systemd-resolved"
comm:"systemd-udevd" binary_path:"/usr/bin/udevadm" command_line:"/usr/lib/systemd/systemd-udevd"
comm:"systemd" binary_path:"/usr/lib/systemd/systemd" command_line:"/usr/lib/systemd/systemd --user"
comm:"systemd-logind" binary_path:"/usr/lib/systemd/systemd-logind" command_line:"/usr/lib/systemd/systemd-logind"
comm:"systemd-journal" binary_path:"/usr/lib/systemd/systemd-journald" command_line:"/usr/lib/systemd/systemd-journald"
comm:"systemd-timesyn" binary_path:"/usr/lib/systemd/systemd-timesyncd" command_line:"/usr/lib/systemd/systemd-timesyncd"

连接

通过连接 tasks、task_open_files 和 network_connections,查找特定进程的网络连接。```bash $ mquire shell ubuntu2404_6.14.0-37-generic.lime mquire> SELECT t.tgid, t.comm, nc.protocol, nc.local_address, nc.local_port, nc.remote_address, nc.remote_port, nc.state FROM tasks t JOIN task_open_files tof ON tof.task = t.virtual_address JOIN network_connections nc ON nc.inode = tof.inode WHERE t.comm = 'sshd'; tgid:"1134" comm:"sshd" protocol:"tcp" local_address:"0.0.0.0" local_port:"22" remote_address:"" remote_port:"" state:"listen" tgid:"1134" comm:"sshd" protocol:"tcp" local_address:"::" local_port:"22" remote_address:"" remote_port:"" state:"listen"

root@kitploit:~
#### 任务打开文件

通过连接 `tasks` 与 `task_open_files`,列出特定进程的打开文件:```bash
$ mquire shell ubuntu2404_6.14.0-37-generic.lime
mquire> SELECT t.comm, tof.path
FROM tasks t
JOIN task_open_files tof ON tof.task = t.virtual_address
WHERE t.comm LIKE '%systemd%'
LIMIT 10;
comm:"systemd" path:"/null"
comm:"systemd" path:"/null"
comm:"systemd" path:"/null"
comm:"systemd" path:"/kmsg"
comm:"systemd" path:"[eventpoll]"
comm:"systemd" path:"[signalfd]"
comm:"systemd" path:"inotify"
comm:"systemd" path:"/"
comm:"systemd" path:"[timerfd]"
comm:"systemd" path:"/usr/lib/systemd/systemd-executor"

命令行查询示例

JSON 输出 (默认)```bash

$ mquire query --format=json ubuntu2404_6.14.0-37-generic.lime "SELECT * FROM os_version" [ { "arch": "x86_64", "kernel_version": "6.14.0-37-generic", "system_version": "#37~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Nov 20 10:25:38 UTC 2" } ]

root@kitploit:~
##### 表格输出```bash
$ mquire query --format=table ubuntu2404_6.14.0-37-generic.lime "SELECT * FROM os_version"
arch:"x86_64" kernel_version:"6.14.0-37-generic" system_version:"#37~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Nov 20 10:25:38 UTC 2"

自定义命令示例

列出可用命令```bash

$ mquire command ubuntu2404_6.14.0-37-generic.lime Available commands: .carve Carve a region of virtual memory to disk .dump Dump all open files from tasks to disk .system_version Display the operating system version .task_tree Display a hierarchical task tree

root@kitploit:~
##### 显示系统版本```bash
$ mquire command ubuntu2404_6.14.0-37-generic.lime ".system_version"
System Version: #37~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Nov 20 10:25:38 UTC 2
Kernel Version: 6.14.0-37-generic
Architecture: x86_64
显示进程树```bash

$ mquire command ubuntu2404_6.8.0-63-generic.lime .task_tree | head -n 10 Parent: task_struct::parent Threads: Disabled Page Table: paddr(0x0000000001a60000)

└─ [0] (ffffffff90c0fcc0) swapper/0 ╎ ↳ [0] (ffff982a00e33518) \xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd,)\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\x0e ├─ [1] (ffff982a0084a8c0) systemd │ ├─ [430] (ffff982a0d27a8c0) systemd-journal │ ├─ [495] (ffff982a08a88000) systemd-udevd │ ├─ [786] (ffff982a07a60000) systemd-oomd

root@kitploit:~
**注意:** 当存在多个拥有相同 TID(线程 ID,可能由内存损坏或快照时机导致)的 `task_struct` 条目时,重复条目会以续行符 `╎   ↳` 缩进显示在主条目下方。格式为 `[TGID] (virtual_address) name`(当隐藏线程时),或 `[TGID TID]`(当显示线程时,其中 TGID 即通常所说的 PID)。

#### 从内存中提取文件```bash
$ mquire command ubuntu2404_6.14.0-37-generic.lime ".dump ./extracted_files"
Legend: SK = skipped, OK = all good, ER = errored

Summary:
  Total files processed: 1234
  Successfully dumped: 1156
  Skipped: 45
  Errors: 33

File Status:
  OK /usr/lib/systemd/systemd (TGID 1)
  OK /etc/passwd (TGID 1)
  SK /dev/null (TGID 1)
  ...

故障排除

使用 --debug 标志可在初始化和分析期间启用详细的调试消息:```bash mquire --debug command /path/to/memory.raw ".system_version"

root@kitploit:~
- **`shell` 和 `query` 模式**:调试消息存储在 `mquire_diagnostics` SQL 表中。使用 `SELECT * FROM mquire_diagnostics;` 查询。
- **`command` 模式**:调试消息直接输出到 stderr。

对于阻止 mquire 成功加载快照的初始化问题,建议使用 `command` 模式并执行一个简单的命令(如 `.system_version`),因为它会立即将调试输出打印到 stderr,无需查询 `mquire_diagnostics` 表。

## 配置

mquire 可以通过位于 `$HOME/.config/trailofbits/mquire/config.toml` 的 TOML 文件进行配置。如果该文件不存在,则使用默认值。

### 可用选项和默认值```toml
[database]
# Maximum number of entries retained in the mquire_diagnostics table.
# During initialization, all entries are kept regardless of this limit.
# Once initialization completes, new log entries trigger eviction of the
# oldest entries when the total exceeds this value.
mquire_diagnostics_max_entries = 1000

开发

本项目使用 just 作为命令运行器。运行 just 可查看可用命令:

SQL 查询集成测试

这些测试验证 mquire 针对内存快照的查询是否能产生正确输出。

  • just integration-test - 运行测试并将输出与预期的 JSON 文件进行比较
  • just integration-update - 用实际输出更新预期的 JSON 文件(在更改表模式时使用)

运行 integration-update 后,请检查 git diff,确保更改符合预期,然后再提交。

添加新测试: 在相应的快照目录中创建 .sql 文件和对应的 .json 文件,然后运行 just integration-update 以填充预期的输出。

贡献

欢迎贡献!贡献时请遵循以下指南:

  1. 测试你的更改 - 在提交前确保你的更改正确工作
  2. 保持最少依赖 - 仅在绝对必要时添加新依赖
  3. 避免缓存易变数据 - 不要缓存可能在内核对象中移动或变化的值。仅缓存稳定引用,例如:
    • Kallsyms 位置
    • init_task 虚拟地址
    • BTF 数据

许可证

本项目采用 Apache License 2.0 许可。详情请参阅 LICENSE 文件。

下载工具
PT_*
''
SELECT * FROM process_ptrace_flags
  • 200_tasklist_pidns_differences.sql — 检测在一个发现源中可见但在另一个中缺失的进程,适用于 rootkit 检测。使用 SELECT * FROM tasklist_pidns_differences 查询。
  • 230_unbacked_ftrace_ops.sql — 已注册的 ftrace 回调,指向内核文本和 kernel_modules 中列出的每个模块之外。使用 SELECT * FROM unbacked_ftrace_ops 查询。
  • 命令描述
    just check运行所有检查(cargo check、cargo clippy、cargo fmt、ruff、mypy)
    just test运行单元测试
    just format格式化代码(cargo fmt、ruff)
    just integration-test运行SQL查询集成测试
    just integration-update更新预期测试输出
    just package构建发布包