一、前言

前几天忙着公司的活,最近又可以歇歇了,休息不能不做事呀?今天就来研究一下Android中应用锁的实现。应用锁顾名思义就是对app进行加密,在打开app的时候需要输入指定的密码才能打开应用。

现在市场中这种应用很多的,他们的实现原理很简单,网上也有人解释了。

二、市场中应用锁apk的分析

我们来随便看一下那些加密锁的应用的实现,这里我从豌豆荚上面下载了一个:应用锁.apk

安装运行,然后对360手机卫士进行加密,

我们在打开360手机卫士:

这时候就弹出了加密的页面

这时候我们查看一下系统中正在运行的程序:

这个应用果然在后台开启一个监听服务

然后我们在使用命令:

adb shell dumpsys activity >activity.txt

查看正在运行的Activity

可以发现当前的Activity就是它的解锁页面

三、原理

原理:在后台启动一个Service,然后每隔一段时间进行轮询一次,查看当前系统中topActivity,然后获取到其app的包名,从而进行过滤

四、实现

直接来看代码:

LockService.java

package com.example.applock;import java.util.ArrayList;
import java.util.List;import android.app.ActivityManager;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.util.Log;/*** Created by jiangwei on 2014/12/23.*/
public class LockService  extends Service{private final String TAG = "LockService";private Handler mHandler = null;private final static int LOOPHANDLER = 0;private HandlerThread handlerThread = null;private final List<String> lockName = new ArrayList<String>();private boolean isUnLockActivity = false;//每隔100ms检查一次private static long cycleTime = 100;@Overridepublic void onCreate() {super.onCreate();handlerThread = new HandlerThread("count_thread");handlerThread.start();//这里只是做了一个例子:只对360手机卫士做锁机制lockName.add("com.qihoo360.mobilesafe");//开始循环检查mHandler = new Handler(handlerThread.getLooper()) {public void dispatchMessage(android.os.Message msg) {switch (msg.what) {case LOOPHANDLER:Log.i(TAG,"do something..."+(System.currentTimeMillis()/1000));/*** 这里需要注意的是:isLockName是用来判断当前的topActivity是不是我们需要加锁的应用* 同时还是需要做一个判断,就是是否已经对这个app加过锁了,不然会出现一个问题* 当我们打开app时,启动我们的加锁界面,解锁之后,回到了app,但是这时候又发现栈顶app是* 需要加锁的app,那么这时候又启动了我们加锁界面,这样就出现死循环了。* 可以自行的实验一下* 所以这里用isUnLockActivity变量来做判断的*/if(isLockName() && !isUnLockActivity){Log.i(TAG, "locking...");Intent intent = new Intent(LockService.this,UnLockActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);//调用了解锁界面之后,需要设置一下isUnLockActivity的值isUnLockActivity = true;}break;}mHandler.sendEmptyMessageDelayed(LOOPHANDLER, cycleTime);}};mHandler.sendEmptyMessage(LOOPHANDLER);}/*** 判断当前的Activity是不是我们开启解锁界面的app* @return*/private boolean isLockName(){ActivityManager mActivityManager;mActivityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity;String packageName = topActivity.getPackageName();//如果当前的Activity是桌面app,那么就需要将isUnLockActivity清空值if(getHomes().contains(packageName)){isUnLockActivity = false;}Log.v("LockService", "packageName == " + packageName);if("com.qihoo360.mobilesafe".equals(packageName)){return true;}return false;}/*** 返回所有桌面app的包名* @return*/private List<String> getHomes() {List<String> names = new ArrayList<String>();PackageManager packageManager = this.getPackageManager();//属性Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);for(ResolveInfo ri : resolveInfo){names.add(ri.activityInfo.packageName);System.out.println(ri.activityInfo.packageName);}return names;}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return Service.START_STICKY;}
}

这里主要就是开启一个轮询操作,然后每隔100ms去查询当前运行的Activity的包名。然后和我们需要进行加密的app进行比较。

当发现是加密的app的时候,就会弹出我们自己的解锁页面,然后我们退出(这里的退出就是简单的点击返回键,当然正常情况下是需要用户输入正确的密码才可以的,但是最后都是把这个activity给finish了)解锁页面。就进入了加密的app了

当然这里做的很简单,直接对360手机卫士进行加密的,其实我们应该会维护一个白名单,里面存储了需要加密的应用。

这里在做的过程中其实还是有一个问题需要注意的:

当我们解锁了,进入到应用之后,这时候会发现又弹出了我们的加锁页面,然后解锁了,又弹出来了。。。

这样无休止的操作,这是一个问题,其实问题很简单:

当我们解锁之后,就会进入360手机卫士,但是这时候我们还在轮询的检查,发现运行的还是360手机卫士,所以还会弹出我们的解锁页面。

这里我们可以这么处理:

就是添加一个变量,用来记录我们的解锁页面弹过一次了。当我们检测到当前的activity是桌面时,就是用户不在手机卫士的页面了,这时候我们需要将这个变量在清零,以便下次继续弹出解锁页面。

这里说的可能有点抽象,具体可以自己操作一下,就会发现问题的。

效果如下图:

好吧,上面就介绍了应用锁的实现原理。

五、如何通过应用锁来盗取账号

那么下面就来进入我们今天的主题吧

如何通过应用锁来进行账号的盗取?

我们现在知道一些应用在打开的时候都是需要登陆的

比如QQ:

那么我们怎么可以进行账号盗取呢?

其实很简单:

我们将我们的解锁页面布置成和QQ的登陆页面一样,然后监听文本框的输入内容,就可以轻松的记下用户名和密码了。

有人说盗取QQ没意思,那么还有我们经常用的支付宝,那个实现和这个是一样的,盗取支付宝账号就有意义了。哈哈~~

上面是说通过应用锁来进行账号的盗取。所以说自己的设备最好还是不要安装什么应用锁的app,特别是来历不明的应用。

上面说的都是通过应用锁这样的app.如果现在有一些坏人,他们会将上面的代码放到恶意的apk中,那么那就完蛋了。

六、总结

这篇文章就介绍了通过应用锁的实现原理,来进行账号的盗取。实现很简单,想法很大胆。所以我们现在能做的是,尽量少安装应用,如果真的要安装的话,那么就要安装可靠的app。关于上面的问题的解决办法:

个人感觉很难做到。不过以前看过一篇文章,说可以通过当前内存运行的大小以及应用运行时预期需要的内存大小,然后做比对,就可以判断当前应用到底是不是真实的app了。不过这种做法实现起来难度有点大。这里就详细讨论了。

项目下载地址

转载于:https://www.cnblogs.com/roccheung/p/5797282.html

Android中应用锁的实现之账号盗取相关推荐

  1. android中键盘锁的问题

    android中经常使用KeyguardLock来进行解锁,但是使用后需要调用reenableKeyguard()将锁释放,否则的话会导致其它的进程无法锁住屏幕,同样使用WakeLock唤醒屏幕后也需 ...

  2. Android中图案锁的实现

    原文地址:http://blog.csdn.net/liusiqian0209/article/details/50372448 很多品牌的Android手机都实现了图案解锁屏幕的功能,有些应用程序出 ...

  3. android可以有一个悬浮窗口在进入屏保状态显示,点击进入应用,Android如何实现锁屏状态下弹窗...

    前言 想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager设置 Window的 Flag,通过设置 Flag的显示优先级来让窗口显示在锁屏的上面. 接下来就是试验可能相关的 Windo ...

  4. android中注册的账号密码储存在,Android中使用SharedPreferences完成记住账号密码的功能...

    效果图: 记住密码后,再次登录就会出现账号密码,否则没有. 分析: SharedPreferences可将数据存储到本地的配置文件中 SharedPreferences会记录CheckBox的状态,如 ...

  5. android系统旁边有一个锁,Android中系统自带锁WalkLock与KeyguardLock用法实例详解

    本文实例讲述了Android中系统自带锁WalkLock与KeyguardLock用法.分享给大家供大家参考,具体如下: WalkLock - 顾名思义 唤醒锁 点亮屏幕用的 KeyguardLock ...

  6. Android 系统(272)---Android中的各种保活

    Android中的各种保活 目前市面上的应用,貌似除了微信和手Q都会比较担心被用户或者系统(厂商)杀死问题.本文对 Android 进程拉活进行一个总结. Android 进程拉活包括两个层面: A. ...

  7. Android端恶意锁屏勒索应用分析

    一.前言 5月12日,一场全球性互联网灾难悄然而至,一款名为WannaCRY的PC端恶意勒索软件利用NSA泄漏的危险漏洞"永恒之蓝",给100多个国家和地区10万台电脑造成了巨大的 ...

  8. 【Android安全】Android中的应用沙箱和UID | Android多用户

    Android中的应用沙箱和UID 参考: <Android安全架构深究(美)NIKOLAY ELENKOV> Linux 用户和用户组管理: https://www.runoob.com ...

  9. android 读取内部存储文件格式,Android中的数据储存之文件存储

    当我们在使用各种程序时,其实际上是在和各种数据打交道,当我们聊QQ,刷微博,看新闻,其实都是在和里面的数据交互 例如在聊天时发出的消息,以及在登录时输入的账号密码,其实都是瞬时数据,那什么是瞬时数据呢 ...

  10. 了解Android中的meta-data及其应用

    前言 在日常的Android开发中,AndroidManifest中总会出现一些<meta-data>标签,或是第三方SDK配置信息,或是系统配置,不禁让人思考<meta-data& ...

最新文章

  1. C语言不用strcmp函数比较字符串大小
  2. 实验一、词法分析实验
  3. CentOS7下安装ELK三件套
  4. Oracle\Sqlserver\Mysql\Sybase\DB2五类数据库通信协议
  5. kernel部分数据结构列表三(inode)
  6. ClickHouse内核分析-MergeTree的存储结构和查询加速
  7. python(20)之读写文件
  8. 2020年快手美妆行业数据价值报告
  9. 世界上任何一件事的五个模块
  10. mysql 设置 server id_MySQL中如何设置 auto_increment 重新计数 主键id从1开始
  11. 管理员回复留言php,最新WordPress评论邮件通知管理员及回复评论者(详细教程)...
  12. 博客中常用的Emoji表情整理,欢迎自取
  13. python的乐高积木——函数
  14. 血液透析机最全学习手册
  15. Newton tangent method
  16. LeCo-83.删除排序链表中的重复元素
  17. Java设计模式:1.1.认识六个原则(开闭,里氏替代,依赖颠倒)
  18. 多域名同一空间的处理实例附(ASP代码)
  19. 七夕节微信表白墙小程序源码/基于Laravel的表白墙微信小程序源码
  20. ubuntu系统 新硬盘挂载

热门文章

  1. 管理感悟:回字有几种写法的面试
  2. 由H264软编码可以看出,电脑的性能远远超过手机
  3. 语言混编之java调用c_Java通过JNI调用C语言库
  4. activiti idea 请假流程_使用idea进行activiti工作流开发入门学习
  5. C# 异步调用控件 跨线程调用控件 跨线程赋值
  6. c语言给出太多参数,C语言中不定参数的实现
  7. 双目估计方法_双目深度估计中的自监督学习概览
  8. java的gui的design模式怎么打开_手机越用越卡怎么办?打开这五个隐藏按钮,1分钟解决卡顿问题...
  9. php soap 用法,php soap用法
  10. Servlet(四):转发与重定向、路径问题