1. 什么是Android样本重打包,为什么要检测重打包
(1)apk是zip,很容易做repack
(2)repack后,被抄袭,redirect ad,或者插入malicious payloads
(3)repack带来的影响、问题:
- 游戏,被repack后,能做很多事情
- repack银行app后,可能直接转移用户的资金
(4)repack的定义:两个APP,如果代码相似度超过80%,并且是由不同的开发者签名,则可以被认为是repack(参考1)
(5)app中有大量SDK代码。有的SDK代码比app核心代码多,所以app相似度就高。所以检测时最好能做SDK移除
(6)作者发现,数据集中,被多次repack的样本,还都release到google play了
参考1是一篇介绍该领域研究的综述,介绍非常详细全面,值得细读。
用JEB打开Repack的样本,如果样本没有严重的混淆或者加壳,也能看到Repack后的样本,被插入了一些(恶意)的代码,如下图所示:
这是笔者曾经发现并且报给 Google Security 团队的恶意样本。
2. 检测思路1:manifest tag
manifest中如果有类似 "platformBuildVersionName___6.0-2704002" 的tag,就说明是被重打包过。 应为这样的tag是一个重打包工具apktool会默认加上的,可以通过大批量manifest文件的统计能找出一大批类似的标记。apktool做样本重打包时,会调用aapt,aapt就会加上这样的tag。所以这种检测思路,是不会有FP的,但是肯定有FN。因为这个tag是可以被抹掉的。
3. 检测思路2:string_ids中的字符串的偏移位置
参考2提到了一种方法,和检测思路1类似,也是找到了样本重打包的标记。这种方法是解析DEX文件结构,string_ids中的字符串的偏移位置(地址),在没有repack过的app中是有序的,在repack后的app中是无序的。
4. 检测思路3:相似性icon,code
这种思路,是使用LSH之类的来计算代码相似性,再根据开发者证书不同,来进行判断。如果代码相似,并且又插入了敏感权限,就可能是潜在的恶意代码injection。
5. 总结
Android样本重打包检测,可以发现恶意代码注入的情况。检测思路是根据manifest找到tag,或者DEX文件字符串地址偏移顺序。大多检测思路都是根据相似性来实现的。当然还能使用机器学习之类的做检测,或者直接根据特征向量做比对/相似性检索。也可以研究不同的重打包工具,做重打包后的统计分析来寻找tag。根据tag来检测,FP为0但FN应该会比较高。相似性的思路,一定会有FP(比如开发者换证书)。
参考
-
Li Li etc. Rebooting Research on Detecting Repackaged Android Apps: Literature Review and Benchmark. 2019
-
Hugo Gonzalez etc. Exploring Reverse Engineering Symptoms in Android apps