近期分析了一款应用的自启动,防强杀的方式,把需要记录的东西写下以供日后回忆。
发现一款应用在很多手机上能自启动,防止am force-stop ,并且没有root权限,这就是它牛逼的地方。
准备
1.编译android 5.1.1,单独编译framework 中的模块,service.jar 在ActivityManagerService ActiveServices中加入log,log点就是在启动服务的接口,启动进程的接口,编译这部分看前面那片记录。编译好后直接push到相应目录重启就行了。
根据现有的log分析行为
关键点是Scheduling restart of crashed 后面的地方 。
然后我们开始分析这个启动过程。有助于了解启动者究竟是谁?
在ams中是这样的:
startServiceLocked中这么调用:
用上面10张图说明了AMS通过启动服务来启动进程的流程,在这里面可以知道真正的调用者是谁。
简单说就是:
ActivityManagerService.java
1. startService
ActiveServices.java
2. startServiceLocked
3.startServiceInnerLocked
4.bringUpServiceLocked
ActivityManagerService.java
5.startProcessLocked
6.startProcessLocked
7.startProcessLocked
启动进程
还有就是知道setting.apk中强制停止做了什么?
看到pm做的事情不禁感慨这个应用做的真不错。
2.安装android studio 在ubuntu上,这个需要oracle的jdk。但是编译源码又需要open jdk。所有要切换需要update-alternatives。
sudo update-alternatives –config java 进行切换
通过切换然后看
java -version
来看是否切换成功了。
android studio下载就去官网但是记住要在ubuntu下面的浏览器下载不然下载的不是linux版本的,为了提高效率,记下下载链接然后用迅雷下载这样可以达到20mb/s很大程度的提高了速度。到opt目录下去解压文件然后执行bin下的 studio.sh
cd /opt/android-studio/bin
./stuido.sh
3.反编译apk,有那种国外的在线反编译平台直接上传apk就可以了。
查看log到底是哪个东西在作怪,根据上面我们在ams中加入的log可以很清晰的发现一个现象,一个服务被干掉之后自己把自己起来了?!WTF
最后发现这货和ams进行了通信,并且在lib下用一个libdemon.so的文件做了一些事情
比如进程守护,针对MediaProvider进行写入等
4.分析apk行为在什么情况下会启动?是谁启动的?怎么让它启动的?它是怎么做到am force-stop 还能重启的?