android进程保活(掌握黑心科技)

进程保活

android这个生态真的是不好,从一开始,大家就想方设法在后台常驻,为了让自己app不被杀,绞尽脑汁想各种存活办法。目前,之前用的大部分保活方案,在手机上几乎都是失效的,尤其是一些国内厂家机型,提供一键清理功能,把你正的运行的APP,杀的渣也不剩。所以,目前还能正常使用的方法就只有一种,那就是两个进程互相监听。

技术原理

  • B发现A死了后,赶紧把A拉活,然后再把自己杀死,这样达到瞒天过海的效果。
  • 进程A使用flock锁定一个文件,此时B进程再flock就会就会挂起,除非A进程主动释放或者结束,B进程才会继续,也就是所谓的监听
  • 反射使用ActivityManagerService直接拉活组件

启动子进程

方案一:就是fork。fork会分离出一个子进程,在fork的地方开始执行接下来的工作,可以根据fork函数返回值来判断是主进程还是子进程。这里提到的另一个概念就是二次fork,关于二次fork和进程托孤,可以自行上网了解一下。

方案二:使用app_process命令启动一个java进程。https://blog.csdn.net/u010651541/article/details/53163542

1
2
app_process <dir> <class name> <parameters> --application --nice-name=nice_name
app_process -Djava.class.path=Helloworld.dex dir classname

当然了,要想启动java进程,classpath得设置,如执行export CLASSPATH,也可以使用-D来指定路径。如果有so要调用,还要将共享库加到环境变量中。export LD_LIBRARY_PATH 或者export _LD_LIBRARY_PATH

两个进程如何互相监听

这里有一个相当巧妙的方式,使用linux提供的函数。

1
int flock(int fd,LOCK_EX);

具体用法请自行搜索,简单讲,A进程调用该函数后,此时B进程再调用,会造成B进程阻塞。而当A进程挂了后,B进程就会立马继续执行。

如何拉活APP

要获取ams的IBinder,然后调用transact来启动组件。这里给大家提供源代码的路径,这里需要用反射。

1
2
mRemote = android.os.ServiceManager.getService("activity")
mRemote.transact(code,data,null,FLAG_ONEWAY);

这里有两部分需要处理,一个是code值,另一个就是data。关于code值,不同的安卓版本不一样,另外有的rom也会修改,翻看源码android.app.IActivityManager。关于data,也会根据不同的系统版本有不同的拼装方法。我这里以service为例。具体参数,也可以参考源码,下面的写法也是根据IActivityManager不同版本中的startService写的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mServiceData = Parcel.obtain();
mServiceData.writeInterfaceToken("android.app.IActivityManager");
mServiceData.writeStrongBinder(null);
if (Build.VERSION.SDK_INT >= 26) {
mServiceData.writeInt(1);
}
//这个是service的intent
serviceIntent.writeToParcel(mServiceData, 0);
mServiceData.writeString(null);
if (Build.VERSION.SDK_INT >= 26) {
//fg service
mServiceData.writeInt(1);
}
if (Build.VERSION.SDK_INT >= 23) {
String packageName = serviceIntent.getComponent().getPackageName();
mServiceData.writeString(packageName);
}
mServiceData.writeInt(0);

我声明一下,service保活在部分手机上可用。

上代码

->具体保活代码看这里

20年最早做的时候是没找到这坨代码的,当时纯逆向+找资料总结的。前两天一搜,现在不知道谁上传了,就给看到的有缘人发出来,这套保活目前应该还能稍微撑一撑吧,就挺恶心的。