装了个新游戏,检具点开图标,测工屏幕闪了一下就退回桌面。检具没报错,测工没提示,检具就这么无声无息地挂了。测工这种情况十有八九是检具APK本身有问题——要么是打包时漏了某个架构的so库,要么是测工签名被篡改过,要么干脆就是检具个套壳的恶意程序。这时候你需要的测工不是重启手机,而是检具一个趁手的APK检测工具。
我手机里常年装着三四个这类工具,测工各有各的检具用处。最常用的测工是APK Analyzer,这玩意儿能直接拆开APK看内部结构。检具点进去第一眼就能看到AndroidManifest.xml,权限列表一目了然。有次装了个小众手电筒应用,它居然申请了读取通讯录和定位权限,当场就删了。APK Analyzer还能看DEX文件的方法数、资源文件的压缩比,甚至能对比两个版本的差异。上次帮朋友排查一个更新后闪退的APP,用这工具对比新旧版本,发现新包少了个armeabi-v7a的lib文件夹,问题直接定位。
另一类工具走的是静态扫描路线,代表是Virustotal的移动端版本。上传APK后,它拿几十个杀毒引擎同时跑一遍。我试过把一个从第三方市场下载的“破解版”笔记软件传上去,结果12个引擎报毒。仔细看报告,其中一个引擎标注了“Android.Trojan.HiddenAds”,这玩意儿会在后台偷偷点击广告。Virustotal的好处是结果直观,坏处是上传要等,而且有些引擎会误报——特别是那些加壳的APK,十个引擎里总有两三个因为壳的特征就报风险。所以看报告得看具体行为描述,别光盯着那个红色数字。
动态检测工具更有意思。AppBrain有个沙箱功能,能让APK在云端虚拟手机里跑起来,记录它到底干了什么。我拿一个号称“系统优化”的APK试过,沙箱里跑了三分钟,日志显示它偷偷连了三个IP,其中一个在俄罗斯。还尝试读取了设备ID和已安装应用列表。这种动态行为比静态权限列表更有说服力——权限可以声明了不用,但网络请求骗不了人。不过沙箱也不是万能,有些恶意程序会检测运行环境,发现是虚拟机就装死。
普通用户其实不需要搞这么复杂。如果你只是想知道一个APK安不安全,ES文件浏览器自带的检测功能就够用。它主要查签名和已知恶意特征库,速度快,结果简单。我给我妈手机就装了这个,她下载广场舞视频APP的时候,ES弹了个“该应用签名与官方版本不一致”的提示,她截图发我,我一看,果然是个山寨包。这种场景下,工具不需要多强大,能拦住最明显的坑就行。
有个细节值得单独说:签名验证。很多APK检测工具会把签名信息藏在二级菜单里,但这个东西特别重要。正规应用的签名是开发者私钥签的,一旦被重新打包,签名就会变。我见过一个案例,某银行APP的钓鱼版,界面做得跟真的一模一样,但签名是自签名的测试证书。用APK Analyzer一看签名指纹,跟官方公布的完全对不上。所以不管用什么工具,养成看签名的习惯,能过滤掉一大半山寨货。
最后说个反直觉的观察:不是所有报毒的APK都不能装。有些开源应用因为用了某些广告SDK,会被杀毒引擎标记为“Riskware”。这时候得看具体报的是什么。如果是“Adware”且你愿意忍受广告,那可以装;如果是“Spyware”或者“Banker”,碰都别碰。工具给的是数据,判断还得靠自己。我一般会交叉验证——Virustotal报毒,就去APK Analyzer看权限和行为,再去应用官网对签名。三样都对得上,才敢往主力机上装。
说到底,APK检测工具就像给应用做体检。有人只看体重秤上的数字,有人非要拍CT。选哪个,取决于你多在乎自己的手机。