手机锁机软件原理

这两天在手机论坛里面发现好多手机被锁屏软件锁屏了,锁屏效果(模拟器中)如下:

初次接触这个软件,我一直以为是锁定了fastloader,但是问哪些被锁屏的人,他们没有root,也没有刷过机,只是单单的安装了这个软件,所以就得排除锁定loader的方式。

直到后来反编译这个锁屏软件的安装包,才解开它真正实现的原理:

  1. 通过锁定home键,锁定返回键,这样单凭按键是无法退出该应用。

  2. 用户可能选择强制关机,一旦开机之后,系统就会恢复到桌面应用,而不是本应用,为了开机之后打开本应用,就需要是在应用中注册一个开机完成的广播接受者

    广播如下:android:name="android.intent.action.BOOT_COMPLETED"/>,收到该广播后就通过intent打开本应用。

     3. 当应用不在前台时,比如如下情况: 手机被锁定了,手机来电了,这时应用就在电话应用的下一个应用,这个时候你可以按下home键,将后台的那个应用侧滑清除掉,

     

   为了保证侧滑不被清楚点,它便在后台开启一个看门狗服务,每150ms检测一下前台应用应用是不是我的应用,如果不是就跳转到我的应用,也就是判断上图中最底下的应用是不是我的锁屏应用,如果是的话,就重新打开我的应用。

 应用关键代码如下: 

  //4.0以上锁定home键
    getWindow().setFlags(0x80000000, 0x80000000);

  //这个方法是锁定home键,4.0下可用,4.0上对部分机型可用.
    getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);

  //屏蔽返回键 

     

@Override
public void onBackPressed() {

  //屏蔽父类的返回处理
  //super.onBackPressed();
}

开机广播接受处理:

 public class BootBroadcastReceiver extends BroadcastReceiver
  {
    String action_boot="android.intent.action.BOOT_COMPLETED";

    @Override
    public void onReceive(Context context, Intent intent)
    {

      /*因为手机刷了MIUI,我不知道能不能自启,如果不能,删除注释符号。*/

        if (intent.getAction().equals(action_boot)){
      Intent ootStartIntent=new Intent(context, MainActivity.class);
      ootStartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      context.startActivity(ootStartIntent);
        }

    }

  }

开门狗代码:

public class killpoccessserve extends Service
{
  Context context;
  @Override
  public IBinder onBind(Intent p1)
  {
    // TODO: Implement this method
    return null;
  }

  @Override
  public void onCreate()
  {
    context = this;
    //Handler线程,接收timertask的message,用于重启应用。
    final Handler h = new Handler(new Handler.Callback(){
      public boolean handleMessage(Message msg){
        ActivityManager am=(ActivityManager)context.getSystemService(context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> runningTasks = am.getRunningTasks(1);
        ActivityManager.RunningTaskInfo runningTaskInfo = runningTasks.get(0);
        ComponentName topActivity =runningTaskInfo.topActivity;
        String packageName =topActivity.getPackageName();
        if(packageName.equals("tk.jianmo.study")){//判断是否是本应用
        }else{
           //不是本应用,启动应用,并kill掉之前的应用
            Intent intent=new Intent();
            intent.setClass(context,MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
            am.killBackgroundProcesses(packageName);
          }
        return false;
      }
    });

    Timer timer;
    TimerTask timertask;
    timer = new Timer();
    timertask = new TimerTask(){
    @Override
    public void run(){
      h.obtainMessage().sendToTarget();

      }
    };

    timer.schedule(timertask, 0, 150);//0.15秒启动一次timertask,无延迟

  }

  @Override
  public void onStart(Intent intent, int startId){
    // TODO: Implement this method
    super.onStart(intent, startId);

  }


  @Override
  public void onDestroy()
  {
    // TODO: Implement this method
    super.onDestroy();
    }
}

 解决办法:软件卸载(以下的解决办法程度递增的)

  1. 锁屏软件也是软件,只不过你启动该软件后是手机无法退出该软件,当然不排除你手速够快能在150ms(软件开发者设定,如果1s你就gg了)的时间内卸载该应用。

  2. 既然手机是无法退出该应用,那么我们可以借助电脑来卸载该软件,如果手机打开了usb调试,就可以通过手机助手在电脑中卸载安装在手机中的软件,如何没有开启的话,如  果手速够快的话,也可以在150ms时间内,打开usb调试。

  3. 甚至有些手机可以远程管理手机应用,甚至是清除数据。

      4.手机数据双清。

      5.手机刷机。

原文地址:https://www.cnblogs.com/android-er/p/5442291.html