谈谈Android重打包--雷区

写在前面的话

细节决定成败




申明

此文禁止转载,谢谢合作


雷区一: 签名

在Android系统中,所有安装到系统的应用程序都必须有一个数字证书, Android的系统不会安装一个没有数字证书的应用程序.这个数字证书用于标识应用程序的作者和其开发的应用程序之间的关系. 当一个开发者开发出一个APP并要将其发布的时候,我们要对开发出来的APK加盖数字证书,数字证书的密钥保存在开发者的手中.就是通过这种签名机制,开发者和他开发出来的应用程序建立起了一种信任关系.每一个开发者的密钥是不同的,它们开发出来的APP就被加盖了不同的数字证书.我们就是通过这种机制来判断这个APP是谁开发的.


一般情况下,同一个开发这的不同应用程序都会使用同一个数字证书.这样有利于程序的升级,当新版本的程序和旧版本的程序数字相同时,Android系统才会认为这两个程序是同一个程序的不同版本.如果新版本的程序和旧版本的程序数字证书不想同,则Android系统会认为它们是不同的程序.


当我们在判断一个APP是不是重打包的时候我们需要排除一种情况,那就是如果这个APP是原始的作者开发的,那么这样的APP我们是应该排除掉的.比如说一个APP的功能的升级,新的版本的发布.这种情况并不能算作是重打包.怎么排除这种情况,我们就需要对已经判断出存在可疑的重打包的APP做一个签名的验证.如果他们的数字证书签名相同我们人为这个APP对不是重打包的. 因为一般我们认为一个恶意软件的制作者在对某个APP进行重打包的时候,他首先会反编译这个APP,在其中加入相关的代码,这个时候在对这个反编译的APP重新编译,加盖自己的数字证书.这样原始的APP和重打包的APP便有不同的数字证书.


因此我们在分析重打包的时候判断签名是不是相同是一个必不可少的步骤.





雷区二:加固

加固是现在对APP的一种保护手段.它通常会应用一些手段例如:代码混淆,动态代码修改,动态加载,以及反调试等等这些技术手段,使得像重打包这种情况大大减少,也使得逆向一个APP变得更加困难.
一下列出的是国内现有的比较流行的APP加固的服务:
1. Bangcle ( http://bangcle.com/ )
2. ijiami ( http://www.ijiami.cn/ )

假设一个APP被加固之后,像apktool 这种不太智能的反编译工具是绝对会失效的,要想判断这些应用有没有被重打包难度也就大大的增加.因此在对收集到的样本进行处理前,我们应该一分为二的处理这些样本,判断其中有没有加固的样本,然后对其脱壳.提取出真正的dex文件之后在进行判断.那么怎么判断一个APP是否被加固,目前最简单的方法,也比较粗暴的方法,提取so 文件,然后查看是不是存在特定的so文件名.下图显示了这几个加固程序的特有的共享库.

技术分享


我们扫描so 文件名然后在对他们做一个简单的字符串比较,变可以较为粗略的得知这个APP是不是真的加固.当然,还有很多已知和未知的APP加壳程序,遇到这些情况,当反编译出现问题的时候,我们就只能一点点手动分析查找原因.

提取so文件的代码可以参考这篇文章: 批量从apk文件中提取出so文件







雷区三:广告

在之前的前一篇文章中提到过,在原始的APP中加入广告也是重打包的一种方式.一个方法的,不可能是十全十美,总会是在各种权衡下找到一个最优值.在这里,我们需要提取出Android的资源来做判断.我们想一想,一个ANDROID的广告,不管是弹框的,内嵌的,不知道还是一个条幅跑出来的.你能看的见的,这些Activity都是资源,假设一个APP被嵌入了太多的广告,这样必然会影响我们的判断准确性.所以,在判断的过程中,想要提高准确性,广告的去留是一个需要慎重考虑的因素.
















































郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。