【安卓静默安装手段分析】

———CSDN插入图片实在是蛋疼,现在都喜欢用Evernote了,但是有好的文章还是想分享出来

我们平时安装应用的手段

1.应用市场安装。 这种是没有安装界面的,一般有也只是有个进度条。如:小米应用市场,googleplay等。 
2.adb 命令进行安装 这种也是没有安装界面 
3.网络下载的应用。 这种一般都有安装界面。

apk的安装处理流程
i. apk会copy到/data/app;
ii. 解压apk中的class.dex,并对其进行优化,获得odex(即JIT)。最后保存到/data/dalvik_cache;
iii. 还有一些权限和包信息,会缓存到/data/system中的packages.list和packages.xml中。(–有root权限之后能不能修改应用的权限?)
iiii.并data/data目录下创建对应的应用数据目录。

卸载过程
删除安装过程中在上述三个目录下创建的文件及目录。

我目前知道的手法有五种:
pm 命令,将apk移动到系统目录下 ,android无障碍服务, 反射调用PackageInstaller中隐藏的API,配置init修改系统引导的预装

第一种:病毒用的最多的,pm 命令。 限制条件:是要有root权限
相当于在手机里面调用adb shell命令

主要实现代码一看就很清楚了。申请su权限和 执行install命令

第二种:将apk移动到系统目录下 限制条件:是要有root权限,移动后需要重启
病毒一般都是拿到root权限后,挂载系统目录,然后将apk移动到system/app目录下。重启之后那个app就安装了,而且提升为系统app进一步抵抗卸载。这是是很常见的预装方式

至于为什么移动到系统目录下后就能静默安装是因为,是因为安卓手机在启动时会扫描system/app目录下的apk文件。如果发现没有安装。会重新安装一遍。
这就是为什么删除了某些系统app之后,重启他又出来了。(而且一开机想这种时钟程序,桌面luancher程序都是启动的这和配合文件init.rc也有关系)

第三种:android无障碍服务 限制条件:是需要开启无障碍服务

腾讯视屏自动安装也是用的这个,某些抢红包插件也是基于此。
智能安装功能的实现原理要借助Android提供的无障碍服务,关于无障碍服务的详细讲解可参考官方文档:
http://developer.android.com/guide/topics/ui/accessibility/services.html

无障碍服务这个功能其实很有用的,但是他的出现的出发点是给那些肢体上有障碍的人使用的,比如手指不健全的用户,怎么才能滑动屏幕,然后打开一个应用呢?那么辅助功能就是干这些事,他的功能其实就是可以概括两句话:

第一、寻找到我们想要的View节点

第二、然后模拟点击,实现特定功能

流程如下:程序下载完成后,点击。并在询问安装的窗口上找到安装按钮的View节点,点击安装即可。
思路是这样,具体程序写完来补充

第四种:反射调用PackageInstaller中隐藏的API来实现安装程序 限制:安装包APK文件拥有与系统相同的签名(正常情况下基本上用不到,但是手机厂商定制rom里面系统自带的应用商店可能就是这种。如:小米应用市场)
程序的安装过程其实是调用了系统中的PackageInstaller来完成的。PackageInstaller也是通过使用PackageManager进行安装的。调用的是其installPackage方法,但是此方法是一个abstract,且是对外不可见的(hide)。
PackageInstaller定义如下:

且PackageManager与installPackage两者皆为abstract抽象的。其具体实现都在ApplicationPackageManager中,其installPackage中的实现为:

可见调用的installPackage方法为IPackageManager中的installPackage方法。在ContextImpl中通过调用
ActivityThread.getPackageManager()获得IPackageManager实例对象。而在在ActivityThread.getPackageManager()方法中,是调用SystemService中的名为package的Service来实例化的。代码如下:

因为,installPackage是系统的API,为了使用PackageManagerService.installPackage(),考虑通过反射机制可以调用installPackage()。

但其中难以得到的是其参数中的IPackageInstallObserver类型,我们看来一下IPackageInstallObserver,发现IPackageInstallObserver是由aidl文件定义的。这个也难不倒我们,通过aidl文件的特性,将IPackageInstallObserver.aidl文件拷到本地程序中,可以得到类IPackageInstallObserver.calss,通过它反射出installPackage()方法。

但在invoke调用该方法时,却无法得到IPackageInstallObserver的实例对象,IPackageInstallObserver的实例对象必须通过IPackageInstallObserver.Stub.asInterface(Binder binder)方式得到,无法得到与其绑定的Binder对象,因而无法执行反射出来的方法。

其次,应为是系统API,需要声明安装应用的权限:android.permission.INSTALL_PACKAGES。当时这类比较敏感的权限不是说声明系统就会给予的,还需要我们的安装包APK文件拥有与系统相同的签名,才能完成静默安装操作。这个方式的静默安装,对于广泛的推广应用是不现实的。但是,但是~~~~~小米的miui(广告ui)就特么是这么推广的。

进一步的补充hook之,绕过签名 使不是系统签名的也能正常安装
这样就能在其他三方rom上安装了

http://blog.csdn.net/yyh352091626/article/details/50533137

第五种:配置init修改系统引导的预装 限制:需要root权限,并且修改init.rc文件
对于存放Apk文件到”/system/app“目录下已经是很普通的预装方式了,这就导致了,预装应用很容易就被卸载掉。恶意的手机ROM就会想着更加恶心的方法来留住预装应用,比如修改系统ROM的逻辑,让系统在开机的时候检测一下自己的预装是否完整然后重新安装。那么,当然系统预装应用的安装文件也会在另一个保存一份。
这类的预装应用,又称为“开机静默安装”,常用的方式就是修改init.rc,添加一个开机执行的脚本,在脚本中调用一个Service使用pm install命令批量安装应用。
自定义个一个开机启动脚本

在系统的init.rc脚本中调用init.local.rc如下:

此方式做预装用户在使用Root后删除掉/system/app下的已安装应用后,系统重启后又会执行启动脚本自动重装预装应用回来,且预装apk文件的存放目录根据不同的系统ROM还不一样,是极为流氓的推广策略。当然,我们通过分析已经看到了,如果要删除此类的预装应用,只需要全盘的扫描apk文件再进行删除即可。
对抗思路如下:在启动脚本init.rc的init.local.rc安装apk成功后,修改apk文件后缀或者加密apk文件。躲避全盘扫描。
在启动的service中改回apk文件并安装,解密apk文件。再安装。
解决办法:引擎检测出init.rc被修改后,用android的dd命令修改init.rc文件。
参考360的解决办法http://blogs.360.cn/360mobile/2014/01/18/oldboot-the-first-bootkit-on-android_cn/

总结:基本上每一种实现默认安装的手法,都有很强的限制条件。所以一般都是通过特殊手段来达到条件:
弹出框,诱导欺骗用户开启无障碍服务–再静默安装。
脚本或者漏洞提权root—再用pm静默安装或者将apk文件移动系统目录下成为预装文件(修改init.rc也是其中的一种。且一般杀软难以卸载,危害性较大)。

小米应用商店等系统同签名应用—–调用系统api实现默认安装。

参考如下:注意技术细节
http://blog.csdn.net/yzzst/article/details/45746853
http://blog.csdn.net/guolin_blog/article/details/47803149

posted @ 2016-11-23 22:14  Tesi1a  阅读(279)  评论(0编辑  收藏  举报