面向人类和 AI 代理的 Android 逆向工程:毫秒级类型化 Java、交叉引用、API 与密钥侦察、APK 差异对比、重新签名、原生查看器和 MCP 服务器。单个 Rust 可执行文件,无需 JVM。
打开任意 Android 应用,看清它究竟做了什么。
它收集了什么、如何从你身上获利、暴露了什么。几秒之内,以可读的 Java 呈现。
面向 AI 智能体的查看器、CLI 和 MCP 服务器。单个可执行文件。无需 Java。
每一项都需要将清单文件、资源和反编译代码结合起来阅读。用 grep 搜索
http:// 找不到其中任何一项。点击某项发现即可查看证据:真实输出,已裁剪至关键行。
Block Blast! 10.9.3(Play 构建版),75,938 个类,3.1 秒内扫描完成。
谁获取了你的数据: AppLovin MAX、AdMob、Meta、Unity、ironSource、Pangle、Liftoff/Vungle、InMobi、
Moloco、Amazon APS、Digital Turbine/Fyber、PubMatic、Bigo。跟踪器:AppsFlyer、Firebase、Facebook 和
TikTok 事件、ThinkingData、工作室自有的 cn.hsdata。权限:广告 ID 以及全部四个
Privacy Sandbox 广告 API。
有两个端点不属于任何 SDK。 infer 是一次模型调用:这个玩家的广告价值是多少?
$ apkscope search blockblast.xapk urls
q.mb("https://low-ecpm.afafb.com/infer/v1/low_ecpm_cut", appActivity, jSONObject, new c() {
return "https://ecpm.afafb.com/infer/v1/ecpm";
$ apkscope decompile blockblast.xapk me.f # the code calls it AlgorithmInterCutManager
m2.mg(jSONObject, "ActUserInfo", ClassE.ma());
m2.me(jSONObject, "AdHistInfo", jSONArray);
m2.mg(jSONObject, "UserContext", ClassE.mc(str2, appActivity, z, UUID.randomUUID().toString(), "INTER"));
m2.mg(jSONObject, "UserInfo", ClassE.md());
这些字段会填入 deviceModel、ram、disk、cpu、carrier、country、ip_country、timeZone、install_time、cold_start_num,以及你过去投放的广告及其 revenue。系统据此计算出你的底价,即广告主为向你展示广告所必须超过的最低出价:
$ apkscope decompile blockblast.xapk v2.d --method Y # AlgorithmBy1004, AppLovin MAX
double d3 = d * d2; // floor = predicted eCPM x "floor_factor" (remote, default 2.0)
this.g_c.mi(d3);
String.format(Locale.locale_US, "算法接口成功更新底价 - FloorPrice: %.2f, ... // "algorithm API updated the floor price"
结论: 合法,以及广告资助的游戏如何运作。现在你可以看到了。
Block Blast 将其游戏类隐藏在 NetEase 打包器之后:org.cocos2dx.javascript.AppActivity 并不在
APK 中。apkscope dump 让游戏自行解包,并在 25 秒内从内存中提取出 15 个 DEX,约
3,100 个隐藏类。脚本通过 JsCallJava 调用 Java;其方法显示了它们请求的内容:
$ apkscope dump com.block.juggle out/ --attach
$ apkscope decompile out/dex/classes9.dex org.cocos2dx.javascript.pay.o --method w # SPayManager.serverControl
if (jSONObject.has("isStatus")) {
boolean z = k0.ma("1", jSONObject.getString("isStatus"));
SPStore.mk().y(z);
JsCallJava.setGameAuditMode(z, "auditMode"); // → window.IPAUtils.respHearingState(1)
auditMode,游戏会记住它。游戏利用这一点在商店审核期间表现出不同行为;Block Blast 改变的是其加密脚本中的内容,因此我们不做更多断言。callNativeGetLeftBattery(电池百分比)、callNativeIsInstallOtherApp(是否安装了应用 X?)、getDeviceInfoByAdb(CPU 速度、RAM、存储、屏幕、型号)。trackGameEndRevenue 在每局游戏结束时存储收入数据。BleBumpKit 在征得许可后配对附近的两部手机。未展示:它如何决定你的下一个方块。那在加密脚本中(见限制)。
文件数据库提供程序已导出,其 <path-permission> 标签指定了一个字面名为 "false" 的权限。唯一真正的防护在代码中,而它跳过了 file/、dir/ 和根目录:
$ apkscope decompile nextcloud.apk com.owncloud.android.providers.FileContentProvider
private boolean isCallerNotAllowed(Uri uri) {
switch (i) {
case 4: case 5: case 6: case 7: case 8: // shares, capabilities, uploads, ...
str = this.mContext.getPackageManager().getNameForUid(Binder.getCallingUid());
}
return false; // file (1), dir (2), root (3): anyone
}
public Cursor query(Uri uri, ...) {
if (i != 1 && i != 2 && i != 3 && isCallerNotAllowed(uri)) {
(案例标签已折叠,注释已添加。)insert、update 和 delete 使用相同的检查。该表包含 path、path_decrypted、file_owner、sharees、share_by_link、metadata_gps……
结论: 任何已安装的应用都能读取你的文件名、文件夹和共享内容,包括端到端加密文件的解密名称,并能更改或删除行。GitHub Security Lab 在 2021 年指出了这一点;该报告中提到的 SQL 注入已被修复,但开放访问在 35.0.1 中仍然存在。此结论来自代码阅读,而非在设备上运行。
$ apkscope resource antennapod.apk res/xml/network_security_config.xml
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="user" />
<certificates src="system" />
$ apkscope decompile antennapod.apk de.danoeh.antennapod.net.ssl.CompositeX509TrustManager --method checkServerTrusted
X509TrustManager x509TrustManager = (X509TrustManager) iterator.next();
try {
x509TrustManager.checkServerTrusted(x509CertificateArr, str);
判定: 由于 Android 7 起应用会忽略用户证书;此应用选择重新启用,因此受管理的设备或安装证书的“VPN”应用可以读取其 HTTPS 流量。自定义 TrustManager 会逐一尝试每个真实证书,若均不被接受则抛出异常:这是有意为之的选择,而非“信任一切”的漏洞。
scan 将 Jetpack Compose 的 PreviewActivity 列为已导出。它会运行 intent 中指定的任意类。
$ apkscope decompile thunderbird.apk androidx.compose.ui.tooling.PreviewActivity --method onCreate
int i = getApplicationInfo().flags & 2;
if (i == 0) {
Log.md(str, "Application is not debuggable. Compose Preview not allowed.");
finish();
判定: flags & 2 即 FLAG_DEBUGGABLE,而发布构建不会如此。所有扫描器都会标记这一点;
只有代码能说明它是安全的,直到有人发布了一个可调试的构建。
$ apkscope decompile keepassdx.apk com.kunzisoft.encrypt.aes.AESTransformer
cipher = Cipher.getInstance("AES/ECB/NoPadding");
key = (Key) new SecretKeySpec(bArr, "AES");
cipher.init(1, key);
while (UnsignedKt.ulongCompare(j2, j) < 0) {
结论: KeePass AES-KDF 将单个数据块用自身加密 rounds 次,以减缓密码猜测速度。对单个数据块使用 ECB 模式正是规范所要求的。知道该舍弃哪些标志位,就已经成功了一半。
| 打开 TikTok 比 JADX 快 11 倍,内存占用少 9 倍 | 12.4 秒 / 997 MB 对比 2 分 18 秒 / 9.4 GB |
| 每次 agent 调用比 rust_ASC 快 2.7 倍 | 中位数 70 毫秒对比 191 毫秒,通过 MCP |
| 带类型的 Java,而非伪代码 | 审核人员或 agent 可以信赖它 |
| 一个工具:反编译器、交叉引用、侦察、差异对比、Frida、脱壳、重签名、GUI、MCP | 而非五个 |
面向安全研究人员、移动端渗透测试人员、隐私研究人员、检查某个库实际行为的开发者,以及任何将 APK 交给 AI agent 处理的人。
1. 获取它: 从 Releases 下载 apkscope.exe,或自行构建:
cargo build --release # viewer + CLI + MCP server
cargo build --release --no-default-features # CLI + MCP only (Linux, macOS, servers)
2. 将其交给你的 agent: