sterrasec/apk-medit

GitHub: sterrasec/apk-medit

无需 root 和 NDK 即可对可调试 Android 应用进行内存搜索与修补的命令行安全测试工具。

Stars: 419 | Forks: 66

# apk-medit [![GitHub 发布](https://img.shields.io/github/v/release/sterrasec/apk-medit.svg)](https://github.com/sterrasec/apk-medit/releases/latest) [![许可证: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/sterrasec/apk-medit/blob/main/LICENSE) [![](https://img.shields.io/badge/Black%20Hat%20Arsenal-USA%202020-blue.svg)](https://www.blackhat.com/us-20/arsenal/schedule/index.html#apk-medit-memory-search-and-patch-tool-for-apk-without-root--android-ndk-21026) [![](https://img.shields.io/badge/CODE%20BLUE%20-Bluebox%202020-blue.svg)](https://archive.codeblue.jp/2020/talks/?content=talks_28) ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/e66e57731d125721.svg) ![typos workflow](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/48c09ebc93125723.svg) Apk-medit 是一款针对可调试 apk 的内存搜索和修补工具,无需 root & ndk。 它的初衷是为了进行手机游戏的安全测试。 许多手机游戏具有 root 检测机制,但 apk-medit 不需要 root 权限,因此可以在不绕过 root 检测的情况下进行内存修改。 ## 动机 内存修改是游戏作弊最简单的方法,这也是安全测试中需要检查的项目之一。 此外,还有像 GameGuardian 这样可以轻松使用的作弊工具。 然而,以前并没有适用于非 root 设备和 CUI 环境的工具。因此我将其开发为一款安全测试工具。 针对 iOS 应用的版本是 [sterrasec/ipa-medit](https://github.com/sterrasec/ipa-medit)。 ## 演示 这是一个使用 apk-medit 通关需要点击一百万次的游戏的演示。 ## 安装 从 [GitHub Releases](https://github.com/sterrasec/apk-medit/releases/) 下载二进制文件,请将该二进制文件推送到 Android 设备上的 `/data/local/tmp/` 目录中。 ``` $ adb push medit /data/local/tmp/medit medit: 1 file pushed. 29.0 MB/s (3135769 bytes in 0.103s) ``` ### 如何构建 你可以使用 make 命令进行构建。这需要 Go 编译器。 构建完成后,如果已连接 adb,它会将构建好的二进制文件推送到 Android 设备上的 `/data/local/tmp/` 目录中。 ``` $ make GOOS=linux GOARCH=arm64 GOARM=7 go build -o medit /bin/sh -c "adb push medit /data/local/tmp/medit" medit: 1 file pushed. 23.7 MB/s (3131205 bytes in 0.126s) ``` ## 使用方法 由于需要使用 `run-as` 命令来读取目标应用使用的文件,因此 apk-medit 只能用于启用了 debuggable 属性的应用。 要启用 debuggable 属性,请打开 `AndroidManifest.xml`,在 application xml 节点中添加以下 xml 属性: ``` android:debuggable="true" ``` 你还可以使用 [sterrasec/apkutil](https://github.com/sterrasec/apkutil) 轻松启用 debuggable 属性,而无需编辑 `AndroidManifest.xml`,这非常实用。 ``` $ apkutil debuggable .apk ``` 运行 `run-as` 命令后,目录会自动更改。因此请从 `/data/local/tmp/` 中复制 `medit`。 运行 `medit` 会启动一个交互式提示符。 ``` $ adb shell $ pm list packages # to check $ run-as $ cp /data/local/tmp/medit ./medit $ ./medit ``` 你也可以选择在写入内存时不使用 ptrace。 这样可以避免被 ptrace 检测到调试器,但由于 SELinux 的限制,这在 Android 10 或更高版本上不起作用。 ``` $ ./medit -without-ptrace ``` ### 命令 以下是在交互式提示符中可用的命令。 #### find 在内存中搜索指定的整数。 ``` > find 999982 Search UTF-8 String... Target Value: 999982([57 57 57 57 56 50]) Found: 0! ------------------------ Search Word... parsing 999982: value out of range ------------------------ Search Double Word... Target Value: 999982([46 66 15 0]) Found: 1! Address: 0xe7021f70 ``` 你也可以指定数据类型,例如 string、word、dword、qword。 ``` > find dword 999996 Search Double Word... Target Value: 999996([60 66 15 0]) Found: 1! Address: 0xe7021f70 ``` #### filter 过滤上一次搜索结果中与当前搜索结果匹配的记录。 ``` > filter 993881 Check previous results of searching dword... Target Value: 993881([89 42 15 0]) Found: 1! Address: 0xe7021f70 ``` #### patch 在通过搜索找到的地址上写入指定的值。 ``` > patch 10 ... Successfully patched! ``` #### ps 查找目标进程,如果只有一个,则将其指定为目标。`ps` 会在启动时自动运行。 ``` > ps Package: jp.sterrasec.tap1000000, PID: 4398 Target PID has been set to 4398. ``` #### attach 如果目标 pid 已由 `ps` 设置,则附加到目标进程,并通过 ptrace 停止应用中的所有进程。 ``` > attach Target PID: 4398 Attached TID: 4398 Attached TID: 4405 Attached TID: 4407 Attached TID: 4408 Attached TID: 4410 Attached TID: 4411 Attached TID: 4412 Attached TID: 4413 Attached TID: 4414 Attached TID: 4415 Attached TID: 4418 Attached TID: 4420 Attached TID: 4424 Attached TID: 4429 Attached TID: 4430 Attached TID: 4436 Attached TID: 4437 Attached TID: 4438 Attached TID: 4439 Attached TID: 4440 Attached TID: 4441 Attached TID: 4442 ``` 如果未设置目标 pid,可以在命令行中指定。 ``` > attach ``` #### detach 从已附加的进程中断开。 ``` > detach Detached TID: 4398 Detached TID: 4405 Detached TID: 4407 Detached TID: 4408 Detached TID: 4410 Detached TID: 4411 Detached TID: 4412 Detached TID: 4413 Detached TID: 4414 Detached TID: 4415 Detached TID: 4418 Detached TID: 4420 Detached TID: 4424 Detached TID: 4429 Detached TID: 4430 Detached TID: 4436 Detached TID: 4437 Detached TID: 4438 Detached TID: 4439 Detached TID: 4440 Detached TID: 4441 Detached TID: 4442 ``` #### dump 显示类似于 hexdump 的内存转储。 ``` > dump 0xf0aee000 0xf0aee300 Address range: 0xf0aee000 - 0xf0aee300 ---------------------------------------------- 00000000 34 32 20 61 6e 73 77 65 72 20 28 74 6f 20 6c 69 |42 answer (to li| 00000010 66 65 20 74 68 65 20 75 6e 69 76 65 72 73 65 20 |fe the universe | 00000020 65 74 63 7c 33 29 0a 33 31 34 20 70 69 0a 31 30 |etc|3).314 pi.10| 00000030 30 33 20 61 75 64 69 74 64 20 28 61 76 63 7c 33 |03 auditd (avc|3| 00000040 29 0a 31 30 30 34 20 63 68 61 74 74 79 20 28 64 |).1004 chatty (d| 00000050 72 6f 70 70 65 64 7c 33 29 0a 31 30 30 35 20 74 |ropped|3).1005 t| 00000060 61 67 5f 64 65 66 20 28 74 61 67 7c 31 29 2c 28 |ag_def (tag|1),(| 00000070 6e 61 6d 65 7c 33 29 2c 28 66 6f 72 6d 61 74 7c |name|3),(format|| 00000080 33 29 0a 31 30 30 36 20 6c 69 62 6c 6f 67 20 28 |3).1006 liblog (| 00000090 64 72 6f 70 70 65 64 7c 31 29 0a 32 37 31 38 20 |dropped|1).2718 | 000000a0 65 0a 32 37 31 39 20 63 6f 6e 66 69 67 75 72 61 |e.2719 configura| 000000b0 74 69 6f 6e 5f 63 68 61 6e 67 65 64 20 28 63 6f |tion_changed (co| 000000c0 6e 66 69 67 20 6d 61 73 6b 7c 31 7c 35 29 0a 32 |nfig mask|1|5).2| 000000d0 37 32 30 20 73 79 6e 63 20 28 69 64 7c 33 29 2c |720 sync (id|3),| 000000e0 28 65 76 65 6e 74 7c 31 7c 35 29 2c 28 73 6f 75 |(event|1|5),(sou| 000000f0 72 63 65 7c 31 7c 35 29 2c 28 61 63 63 6f 75 6e |rce|1|5),(accoun| ``` #### exit 要退出 medit,请使用 `exit` 命令或 `Ctrl-D`。 ``` > exit Bye! ``` ## 测试 你可以使用 make 命令运行测试代码。 ``` $ make test ``` ## 许可证 MIT License
标签:ADB, Android NDK, APK安全测试, Black Hat Arsenal, CUI工具, EVTX分析, URL发现, 云资产清单, 免Root, 内存修改, 内存搜索, 内存补丁, 安全检测, 安卓逆向, 无Root, 日志审计, 游戏作弊, 游戏外挂, 目录枚举, 移动安全, 移动游戏安全, 逆向工程, 黑帽兵器