11

穿着马甲的重打包App,你在哪里?

 3 years ago
source link: https://zhuanlan.zhihu.com/p/27969277
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

穿着马甲的重打包App,你在哪里?

这篇文章科普了Android应用重打包方面的技术挑战和研究现状,并介绍了我们发表在ICPC2017的研究工作“RepDroid: An automated tool for Android application repackaging detection” [1]。

大家对应用市场中“XXX-破解版”的app一定感到不陌生,能免费玩上好游戏,真是开心。这些app都是第三方开发者对原应用进行反编译,在其中添加、删除、修改部分功能,然后再重新编译打包成新的app发布到应用市场中。当然,重打包app的开发者并不都是好人,甚至通常都是图谋不轨,包含但不限于以下事项:

  • 插入额外广告获取经济利益;
  • 插入恶意程序,窃取用户隐私信息;
  • 植入或篡改链接,骗取流量或者诱使用户访问恶意网站;

作为程序员的你可能心有防范,但那些大爷大妈怎么可能区分出重打包应用?然后他们的信息就被卖了,一不留神还被装上全家桶。

给你一大堆apk文件,能从里面找出那些重打包的app吗?

重打包:矛与盾

要治理这种现象,人工审核当然是不太靠得住的(所以苹果辛苦建立的生态圈真是不容易),所以就有了自动重打包检测相关的研究:要是应用市场能把市场里的apk全都扔到一个工具里,工具自动就能找出那些重打包的应用,岂不很好。这里要解决的研究问题就是怎样给一个app打上一个“胎记”(birthmark),使重打包以后的应用具有相同的胎记,而不同的应用具有不同的胎记

例如Viewdroid [7],它以应用的界面为节点,界面跳转为边构建了一个有向图(如下图),边上的Label就是触发这条边的事件。该图就作为app胎记,只要比较app之间的胎记就能快速识别出重打包的应用了。

当然,重打包应用的人肯定希望想方设法能逃过各种检测(甚至很多应用市场几乎没有审核机制),万一重打包过的app火了,不就捞了一票么。所以自动检测应用重打包的主要挑战就是能抵抗代码混淆工具对app胎记产生的影响。

爱加密[2]就是一个专业的混淆加密工具。它通过对原应用加壳,使得反编译工具无法获取到原应用的有效信息。如下图,图中左半边为原始应用反编译代码,右边为爱加密混淆后的反编译代码。我们可以看到,原始的函数内容全部被清空,使得依赖于这些信息的重打包检测方式无法起作用。

重打包:自动检测

现阶段已经有很多工作来解决安卓重打包检测问题。按照app胎记的生成方式,我们将这些工作大致分为静态方式和动态方式这两类。静态方式大都是分析应用的反编译后的代码和资源,DroidMOSS [3]对应用中每个函数方法进行模糊哈希作为胎记; DNADroid [4]和AnDarwin [5]为建立了程序依赖图(program dependency graph),Centroid [6]构建了3D控制流图(3D control flow graph),Viewdroid [7]则根据应用界面生成了界面图(view graph),这些生成图的方法各自计算图的相似度从而决定应用的相似度。而在动态方式中,人们通过分析应用运行时的API调用序列[8]和UI信息[9]来计算相似度。

我们的技术

代码混淆道高一尺、魔高一丈,通过扫描二进制代码检重打包已经越来越困难了(考虑一下分析插入了大量垃圾控制流、反射、魔改的字节码有多么困难)。如果不能直接从代码中提取有效的胎记,应该怎么办呢?聪明的你也许已经想到回到重打包的原点了:

软件重打包往往包含一个特点:重打包应用和原始应用有着相似的界面和功能。进行重打包的人主要是为了利用原始应用的流行性,然后在里面修改小部分功能来达到自己的目的,因此不会改变原始应用太多的特性。

所以我们把app拿来运行一下,把运行时候的用户界面拿来作为应用的胎记不就能不管代码,去检测出功能相似的克隆app了嘛?

具体的解决方案

为了实现重打包的检测,首先面对的问题是如何度量应用的相似性。

那么如何来衡量应用的相似性呢?如果将两个应用交给人来判断是否相似的话,我们往往会尝试运行这两个应用,然后判断

  • 这两个应用的大部分界面是不是长得都差不多;
  • 这两个应用操作起来是不是很类似。

如果上述两点都是肯定的回答的话,那么我们就会认为这两个应用是相似的。

那让我们看一个山寨app的例子。这两个app看起来……很像,又有显著的区别:除了整体颜色不一样外,其余部分几乎都是没有区别的。如果我们尝试点击里面的按钮来看看应用的其他界面的话,我们也可以发现同样的情况。因此,我们可以判断出这两个应用是相似的。

我们就是根据上述思路,对应用界面进行建模(也就是包含了界面与界面转移信息的图,这张图就是我们的app胎记),量化出相似度来判断应用的相似性。

接下来,我们执行程序获得胎记。

胎记定义有了,接下来就需要通过遍历应用的方式,不断的收集运行时的界面信息。随之而来就需要解决一个问题:如何来遍历应用。假设我们是测试人员,想要尽可能完整的遍历某个应用,我们会

  • 尽可能多的交互到界面中的每个控件;
  • 那些能跳转到新界面的控件会被更多的点击到,这样我们就能有更多机会去遍历新的界面;

通过这两个规则,我们就可以尽可能多的遍历应用。

当然这种方法并不能保证能触及到应用的每一个界面(比如某个界面需要输入用户名密码才能访问),但是我们认为:相似的应用有着相似的特性,所以两者能遍历到和不能遍历到的界面应该是有一致性的。

最后我们通过二分图匹配的方式比较两个应用胎记之间的相似性。这部分内容说起来有些枯燥,有兴趣的同学可以阅读我们的论文。当然这个技术也不是完美的,比如,有些需要登录/注册才出界面的app,还是无法实现全自动的胎记收集,以及现在还不能支持游戏。

实验结果

我们建立了2个数据集S1和S2。S1共包含98对应用,每一对应用表示一个原始应用和一个被“爱加密”加密后的应用。S1数据集是用来检测我们的方法对加密应用是否有效。S2共包含从豌豆荚市场中8个分类下载的125个应用,该数据集是用来检测我们的方法能否正确的区分出不同的应用。同时,我们还和其他已有的方法进行了对比,最终的结果在下表中。表中FN表示事实上是一组重打包应用,但是方法并没有检测出来;FP表示事实上不是一组重打包应用,但是方法却判为重打包。另外我们公开了实验数据

通过上述实验,我们可以看到

  • 对于被加密混淆的应用,我们能够有效检测出原应用和加密后的应用的重打包情况;
  • 对于拥有相同主题相同类别的独立开发应用(比如同样都是新闻阅读应用),我们同样有效的区分出它们,避免误判;

幕后故事

你在读这篇文章的时候,也许已经感觉到了:重打包代码抄袭检测有非常紧密的联系。是否有人不禁想起学生时代偷偷把大神的代码提交给老师蒙混过关的经历,如果老师也有这么一个工具,那我岂不是惨了?事实上代码抄袭检测也是一个十分热门的研究话题。本文的作者之一就曾经做过这样的事情,随手写了个比较x86二进制的代码,结果这个代码用了好几年,残害了无数同学——虽然没有使用UI graph,但同样是以代码函数为结点,然后用匹配计算一个代码最佳的“嵌入程度”,能有效抵挡一些同学们常用的代码混淆手段:变量改名、修改锁进、拆分合并函数、增加无用代码等。这篇文章的核心算法一部分受到这个工具的启发。

参考文献

[1] Yue S, Feng W, Ma J, et al. RepDroid: an automated tool for Android application repackaging detection. In Proceedings of the 25th International Conference on Program Comprehension, 2017: 132-142.

[2] Ijiami. (2016, Dec) Ijiami. Available: 爱加密-保护智能世界,打造和谐、强大、安全的物联网生态

[3] Zhou W, Zhou Y, Jiang X, et al. Detecting repackaged smartphone applications in third-party android marketplaces. In Proceedings of the second ACM conference on Data and Application Security and Privacy, 2012: 317-326.

[4] Crussell J, Gibler C, Chen H. Attack of the Clones: Detecting Cloned Applications on Android Markets. In Proceedings of ESORICS. 2012.

[5] Crussell J, Gibler C, Chen H. Scalable semantics-based detection of similar Android applications. In Proceedings of ESORICS. 2013.

[6] Chen K, Liu P, Zhang Y. Achieving accuracy and scalability simultaneously in detecting application clones on Android markets. In Proceedings of the 36th International Conference on Software Engineering, 2014: 175-186.

[7] Zhang F, Huang H, Zhu S, et al. ViewDroid: Towards obfuscation-resilient mobile application repackaging detection. In Proceedings of the 2014 ACM conference on Security and privacy in wireless & mobile networks, ACM, 2014: 25-36.

[8] Kim D, Gokhale A, Ganapathy V, et al. Detecting plagiarized mobile apps using API birthmarks. Journal of Automated Software Engineering, 2016, 23(4): 591-618.

[9] Soh C, Tan H B K, Arnatovich Y L, et al. Detecting clones in android applications through analyzing user interfaces. In Proceedings of the 2015 IEEE 23rd International Conference on Program Comprehension, 2015: 163-173.

论文信息:"RepDroid: An automated tool for Android application repackaging detection"。论文实验数据集

作者简介:本文作者是来自南京大学计算机软件研究所的岳胜涛、冯伟赞、马骏蒋炎岩陶先平许畅、吕建。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK