APK 分析器
放入一个 Android 安装包——.apk 文件——在它靠近任何一部手机之前,先读它对自己的声明:包名与版本、它所针对的 SDK 级别、它申请的每一项权限、它是否允许调试与备份、它的哪些组件能被其他应用触及,以及它是用什么证书签名的。文件从不离开你的设备:它在本页面中打开和解析,不会上传,因为你正怀疑的那个 APK,恰恰是最不该交给陌生人服务器的文件。
也可以把文件拖放到这个框的任意位置。下面的一切都从安装包本身、在这台设备上读取——清单、编译后的资源和签名块。
安装包摘要
权限
保护级别遵循 Android 框架自身的分类。本页面不认识的权限会被如实报告为不在参考表中——自定义、厂商或较新的权限都会诚实标明,绝不猜测。
应用标志
组件
签名证书
说明
一个 APK 在运行任何一行代码之前就声明了什么
APK 是一个有主见的 ZIP 压缩包。在 Android 运行它的任何代码之前,系统会先读它内部的二进制 AndroidManifest.xml,而这一个文件就是一份出人意料地完整的意图声明。它写明包名——更新正是按它来匹配身份的——以及版本。它声明应用自称支持的最旧 Android 版本,以及它按其行为规则构建的目标版本,这正是目标 SDK 重要的原因:目标定得低,就会悄悄让更旧、更宽松的权限行为继续生效。它列出应用将来能用到的每一项权限,因为没有声明的权限之后也无法被授予。它说明这个构建是否可调试——一个绝不该活着进入正式发布的标志——以及它的数据是否可以被卷入设备备份。它还盘点了应用的组件:活动、服务、接收器和提供者,每个都带一个导出状态,决定设备上的其他应用能否调用它。一个已导出又没有权限检查的组件是 Android 上经典的攻击面,而你在这里、在清单里就能看到它,什么都不用安装。
故事的另一半是签名。只有当新旧两个版本用同一把密钥签名时,Android 才允许把更新安装到现有应用之上,所以签名证书的指纹就是这个应用身份的连续性:包名相同但换了密钥签名的,是另一个披着熟悉标签的应用。本页面读取两代签名——META-INF 里 Jar 风格的证书,以及 APK 签名方案 v2/v3 块——并显示每个签名者的主题、颁发者、有效期窗口和 SHA-256 指纹,你可以拿它去和你手里的密钥或 CSR 在证书与密钥匹配器里比对。配套指南安装之前,APK 里有什么把整个检查展开成一份清单。两条诚实的限制:本页面读的是声明,不是行为——它不反编译代码、不运行应用,也不判断它是不是恶意软件;当清单本身含糊时(带 intent-filter 的组件省略了 exported 标志、标签在编译后的资源里解不出来),它会明说,而不是用一个猜测填上空缺。至于应用运行之后在网络上做什么,PCAP 分析器负责读抓包。
常见问题
我的 APK 文件会去哪里?
哪里也不去。文件在本页面、你的设备上打开和解析,不上传、不传输、不存储——分析文件时不发出任何网络请求。这一点对这个工具格外重要:人们最想检查的 APK,恰恰是他们已经不信任的那些——来自论坛的文件、直接下载的安装包、看起来不对劲的应用商店条目——而把一个可疑的二进制文件送到远程扫描服务,本身就是一种暴露。页面加载后它也能离线工作。
安装 APK 之前应该检查什么?
四样东西,上方都能看到。包名:它是发布者真正的命名空间,还是只改了一个字符的仿冒品?权限:一个手电筒应用真的需要你的通讯录、通话记录和精确位置吗——有没有签名级或特殊级的请求混在常规请求里?已导出的组件:每一个能被其他应用触及的活动、服务、接收器或提供者,都是你正在接受的攻击面。还有签名者:更新必须携带与已安装应用相同的签名证书,所以在从任何地方侧载一个“新版本”之前,先把 SHA-256 指纹和你信任的那份比对一遍。
它能告诉我一个应用是不是恶意软件吗?
不能,任何只靠一份清单就许诺这一点的工具都是在夸大。本页面读的是安装包的声明——身份、权限、组件、标志和签名——这足以抓住粗心者和冒充者:签名不对的克隆体、要求短信权限的手电筒、还开着可调试的正式构建。判断代码实际上做什么,需要反编译、动态分析,或者信誉良好的扫描器对二进制本身的结论。这里结果干净,应理解为“声明里没看出问题”,永远不是一张安全证书。
为什么有些权限写着“不在参考表中”?
因为诚实胜过一个貌似合理的猜测。这里显示的保护级别——普通、危险、签名、特殊——来自一份人工整理的知名 android.* 权限表,记录框架为每一项指定的级别。厂商会加自己的权限,制造商还会再加,新的 Android 版本也会引入新名字;这些都不在表中,所以页面会明确说明。级别未知不代表这项权限无害或危险——它表示这份参考没有覆盖它,而权限自己的名字和命名空间就是你开始核查的地方。
“导出状态:未指定”是什么意思?
它的意思是清单里确实没写。当一个组件声明了 intent-filter 却省略 android:exported 时,实际答案历来取决于应用的目标 SDK 和 Android 版本——旧规则默认这类组件是导出的,新规则则拒绝安装这个应用,直到开发者明确作出决定。一个打印出自信的“是”或“否”的读取器,会凭空捏造一个文件里不存在的事实,所以本页面报告的是这个省略本身。如果你自己的构建里出现这一行,它是最值得明确修复的一项。