Android中应用锁的实现之账号盗取

一、前言

前几天忙着公司的活,最近又可以歇歇了,休息不能不做事呀?今天就来研究一下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;

    @Override
    public 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;
	}

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public 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了。不过这种做法实现起来难度有点大。这里就详细讨论了。

项目下载地址

时间: 2024-08-03 15:19:02

Android中应用锁的实现之账号盗取的相关文章

android中键盘锁的问题

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

Android中图案锁的实现

原文地址:http://blog.csdn.net/liusiqian0209/article/details/50372448 很多品牌的Android手机都实现了图案解锁屏幕的功能,有些应用程序出于保护的目的也使用了图案锁(比如支付宝),本文将介绍一种图案锁的实现方式,这种实现的一个优势在于方便扩展和自定义,我们先看一下效果图. 首先是连线阶段,整个连线为两部分:第一部分是点和点之间的固定线段,第二部分是最后一个点到鼠标移动位置的自由线段. 接下来是连线结束之后,需要判断图案是否正确,我这里

Android中锁屏密码算法解析以及破解方案

一.前言 最近玩王者荣耀,下载了一个辅助样本,结果被锁机了,当然破解它很简单,这个后面会详细分析这个样本,但是因为这个样本引发出的欲望就是解析Android中锁屏密码算法,然后用一种高效的方式制作锁机恶意样本.现在的锁机样本原理强制性太过于复杂,没意义.所以本文就先来介绍一下android中的锁屏密码算法原理. 二.锁屏密码方式 我们知道Android中现结单支持的锁屏密码主要有两种: 一种是手势密码,也就是我们常见的九宫格密码图 一种是输入密码,这个也分为PIN密码和复杂字符密码,而PIN密码

《Android源码设计模式解析》读书笔记——Android中你应该知道的设计模式

断断续续的,<Android源码设计模式解析>也看了一遍,书中提到了很多的设计模式,但是有部分在开发中见到的几率很小,所以掌握不了也没有太大影响. 我觉得这本书的最大价值有两点,一个是从设计模式的角度去理解Android源码,结合着日常开发中的常用类,对设计模式的理解会更加的深刻:另外一个好处就是了解常用模式,再看其他人写的代码的时候,更容易理解代码思路.下面是我的读书笔记和一些思考,设计模式只整理我认为重要的部分. 建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常

Android逆向之旅---Android中如何获取在非Root设备中获取应用隐私数据

一.前言 今天在开发的过程中遇到一个问题,就是关于AndroidManifest.xml中的allowBackup属性,也算是自己之前对这个属性的不了解,加上IDE的自动生成代码,没太注意这个属性,但是没想到这个属性会直接导致隐私数据的丢失.下面就来看一下这个属性的影响到底有多大.他的作用是什么? 二.Android中的allowBackup属性 1.allowBackup安全风险描述Android API Level 8及其以上Android系统提供了为应用程序数据的备份和恢复功能,此功能的开

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

一.前言 5月12日,一场全球性互联网灾难悄然而至,一款名为WannaCRY的PC端恶意勒索软件利用NSA泄漏的危险漏洞“永恒之蓝”,给100多个国家和地区10万台电脑造成了巨大的损失.到2017年为止,全球手机用户总量已经突破50亿,而作为占比超过50%的android系统中,同样有许许多多类似WannaCRY的勒索软件正在危害我们的财产安全. 接下来,以一款主流的Android端恶意锁屏勒索应用为例,结合人工分析的方式,深入剖析勒索应用的恶意行为.知己知彼,才能更好的防患于未来.   二.运

Android中微信抢红包插件原理解析和开发实现

一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导致了.或许是网络的原因,而且这个也是最大的原因.但是其他的不可忽略的因素也是要考虑到进去的,比如在手机充电锁屏的时候,我们并不知道有人已经开始发红包了,那么这时候也是让我们丧失了一大批红包的原因.那么关于网络的问题,我们开发者可能用相关技术无法解决(当然在Google和Facebook看来的话,他们

Android 中实现分享和第三方登陆---以新浪微博为例

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38781957 第三方登陆和分享功能在目前大部分APP中都有,分享功能可以将自己觉得有意义的东西分享给身边的朋友,而第三方登陆可以借助已经有巨大用户基础的平台(如QQ和新浪微博)的账号,让用户在使用自己APP的时候不用注册,直接使用第三方账号登陆,从而避免了注册的过程(其实是服务器端帮你注册),这对于吸引更多的用户非常有意义.下面我们就以新浪微博为例,讲解如何实现分享功能和第三方登陆.首先你

详解Android中那些酷炫返回方式的实现

Android手机都会有返回键,不管是实体键,还是虚拟键.Android用户主要也都是通过这个返回键操控页面返回方式的,不比IOS逼格甚高的只保留一个操作键.这种方式是最普遍的返回方式,还有一种也是比较常见的,那就是页面内部自己响应.绝大多数APP每个页面的设计图顶部左侧都会有一个返回键图标,偶尔也有奇葩的设计放在底部左侧,点击这个图标即finish掉当前页面.简单的介绍完了最常见的两种方式,下面为大家介绍两种更友好的交互方式. 拿大家比较常用的三款社交软件的交互来说.腾讯微博的返回方式除去上述