远控免杀实验笔记(二)

郑重声明:本文展示的过程是在模拟环境中进行的,只为学习研究之用,如有人用于非法用途,产生的后果笔者不负任何责任。

看看“流氓应用”都是怎么隐藏起来在后台运行的,引以为戒。

设置页面为透明

  1. AndroidManifest.xml中,在需要设置为透明的activity标签中添加:
1
android:theme="@android:style/Theme.Translucent.NoTitleBar"
  1. 在Activity的onCreate方法中添加:

    1
    2
    3
    4
    5
    6
    7
    8
    // 设置Activity宽高
    Window window = getWindow();
    WindowManager.LayoutParams windowLayoutParams = window.getAttributes(); // 获取对话框当前的参数值
    windowLayoutParams.width = 1;
    windowLayoutParams.height = 1;

    // 隐藏界面
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

从近期任务中隐藏起来

在启动页Activity的标签中添加配置:

1
android:excludeFromRecents="true"

虽然在近期任务中不可见了,但是清理后台还是能被清理掉。

后台运行不被清理

这个要根据手机品牌和型号来具体设置。

大体思路就是将应用加入电池优化白名单,后台清理白名单。可以参考:https://users.easemon.com/zh

设置前台服务

有时候需要从后台Service通过Intent启动Activity,但是从Android Q开始做了限制, 需要改为从前台Service启动Activity。

首先适配服务启动方法:

1
2
3
4
5
6
7
public static void startService(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(new Intent(context, MyService.class));
} else {
context.startService(new Intent(context, MyService.class));
}
}

前台服务会在通知栏显示服务相关信息,在Service的onCreate方法中进行配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
NotificationChannel Channel = new NotificationChannel(CHANNEL_ID, "Internet Service", NotificationManager.IMPORTANCE_NONE);
Channel.enableLights(false);//设置提示灯
Channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
manager.createNotificationChannel(Channel);

Notification notification = new Notification.Builder(this)
.setChannelId(CHANNEL_ID)
.setContentTitle("")//标题
// .setContentText("Internet Service")//内容
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)//小图标一定需要设置,否则会报错(如果不设置它启动服务前台化不会报错,但是你会发现这个通知不会启动),如果是普通通知,不设置必然报错
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.build();
startForeground(1, notification);//服务前台化只能使用startForeground()方法,不能使用 notificationManager.notify(1,notification); 这个只是启动通知使用的,使用这个方法你只需要等待几秒就会发现报错了
}
}

怎么隐藏此通知呢,在onStartCommand方法中将通知移除即可:

1
stopForeground(true);