返回更新列表
新发布Sep 21, 2026

apk-medit v0.2.7

用于可调试 APK 的内存搜索与补丁工具,无需 root 和 NDK

分享

apk-medit

GitHub release License: MIT typos workflow

Apk-medit 是一款无需 root 和 ndk 即可对可调试 apk 进行内存搜索和修改的工具。 它专为移动游戏安全测试而创建。 许多移动游戏具有 root 检测,但 apk-medit 不需要 root 权限,因此无需绕过 root 检测即可进行内存修改。

动机

内存修改是游戏作弊最简单的方式,也是安全测试中需要检查的项目之一。 还有一些可以随意使用的作弊工具,比如 GameGuardian。 然而,当时没有适用于非 root 设备和 CUI 的工具。因此我将其作为安全测试工具制作了出来。 针对 iOS 应用的版本是 sterrasec/ipa-medit

演示

这是一个使用 apk-medit 通关一个需要点击一百万次才能通关的游戏的演示。

安装

GitHub Releases 下载二进制文件,请将二进制文件推送到 Android 设备上的 /data/local/tmp/ 目录。 提供了适用于 arm64(物理设备)和 amd64(x86_64 Android 模拟器,例如 Windows PC 上的模拟器)的二进制文件。使用 adb shell getprop ro.product.cpu.abi 检查设备的 ABI。

$ 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)

要为 x86_64 Android 模拟器构建,请改用 build-x86_64 目标。

$ make build-x86_64 deploy
GOOS=linux GOARCH=amd64 go build -o medit
/bin/sh -c "adb push medit /data/local/tmp/medit"

用法

Windows 控制台

在 Windows 10 的 Cmd 和 PowerShell 上,常驻的命令描述面板会向上漂移并覆盖提示符(#37)。 当 medit 检测到类似 Windows 的控制台(原生 Windows 构建,或 TERM 为空/dumb)时,它会在启动时打印一次命令列表并禁用实时面板;Tab 键仍可补全命令名称。

  • APK_MEDIT_LIVE_HELP=1 / 0 强制开启或关闭实时面板。
  • APK_MEDIT_WINDOWS_CONSOLE=1 / 0 覆盖控制台检测。

使用 run-as 命令读取目标应用使用的文件,因此 apk-medit 只能用于启用了 debuggable 属性的应用。 要启用 debuggable 属性,请打开 AndroidManifest.xml,在 application xml 节点中添加以下 xml 属性:

android:debuggable="true"

你也可以使用 sterrasec/apkutil 轻松启用 debuggable 属性,而无需编辑 AndroidManifest.xml,这很有用。

$ apkutil debuggable <target-apk-name>.apk

运行 run-as 命令后,目录会自动切换。因此请从 /data/local/tmp/ 复制 medit。 运行 medit 会启动一个交互式提示符。

$ adb shell
$ pm list packages # to check <target-package-name>
$ run-as <target-package-name>
$ 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

如果通过 ps 设置了目标 pid,则附加到目标进程,通过 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 <pid>

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

分类