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

1、前言

最近玩王者荣耀,下载了一个辅助样本,结果被锁机了,固然破解它很简单,这个后面会详细分析这个样本,可是由于这个样本引起出的欲望就是解析Android中锁屏密码算法,而后用一种高效的方式制做锁机恶意样本。如今的锁机样本原理强制性太过于复杂,没意义。因此本文就先来介绍一下android中的锁屏密码算法原理。java

 

2、锁屏密码方式

咱们知道Android中现结单支持的锁屏密码主要有两种:mysql

一种是手势密码,也就是咱们常见的九宫格密码图android

一种是输入密码,这个也分为PIN密码和复杂字符密码,而PIN密码就是四位的数字密码比较简单。git

固然如今也有一个高级的指纹密码,这个不是本文研究的范围了。咱们只看手势密码和输入密码算法解析。github


3、密码算法分析

咱们如何找到突破口,其实很简单,在设置锁屏密码界面,用工具分析获取当前的View类,而后一步一步跟入,最终回到了一个锁屏密码工具类:LockPatternUtils.Java,由于每一个版本可能实现逻辑不同,这里我用5.1的源码进行分析了,找到这个类以后,直接分析便可。算法

第1、输入密码算法分析

首先咱们来分析一下输入密码算法分析:sql

这里看到有一个方法:passwordToHash方法,参数为用户输入的密码和当前用户对应的id,通常设备不会有多个用户,因此这里通常userId默认值就是0,下面就是最为核心的加密算法了:原文密码+设备的salt值,而后分别MD5和SHA-1操做,转化成hex值再次拼接就是最终保存到本地的加密密码了。而这里如今最重要的是如何获取设备对应的salt值了,这个能够一步一步跟踪代码:数据库

查看getSalt方法,他首先会根据字段key为:lockscreen.password_salt,进行从一个地方获取salt值,若是发现这个值为0,就随机生成一个,而后将其保存到那个地方去,最后会将salt转化成hex值便可。如今须要找到这个地方,继续跟踪代码:数组

这里猜测应该是保存到一个数据库中了,继续跟踪代码:数据结构

这里是经过SM中获取一个服务来进行操做了,以前咱们已经把SM都玩烂了,像这种获取服务,最终实现逻辑都是在XXXService类中,因此这里应该是LockSettingsService.java类中,找到这个类,查看他的getLong方法:

其实到这里就很是确定是数据库保存的了,继续跟踪代码:

这里果真是保存到一个数据库中,咱们继续查看LockSettingStorage.java类:

这里看到了,数据库名字叫作:locksettings.db,那么他保存在哪里呢?继续看这个类:

这里看到有两个key文件,那么这个就是用来保存加密以后的手势密码和输入密码的信息到本地,下次开机解锁就须要读取这个文件内容进行密码比对了。这里看到一个目录是system了,因此数据库和这两个key文件极可能保存到该目录下了:/data/system/,不过为了确保,咱们直接用find命令去根目录下搜索这个数据库文件也是能够的。最终肯定是该目录:

这里可能会提示找不到find命令,这时候须要安装busybox工具了,才能使用这个命令了。找到这个数据库文件就好办了,直接取出来,而后用SQLite工具进行查看便可,固然也能够直接在手机中查看。我为了方便仍是弄出来看:

这里看到了这个表格字段,而且获取到这个值了,那么下面就要用这个值来验证咱们的分析是否正确,咱们首先给设备设置一个简单的输入密码,这里直接输入简单的"1234"了,而后会在/data/system目录下生成一个密码加密key文件:/data/system/password.key,这时候咱们将改文件导出来:

下面我就用就简单的Java代码手动的实现这个算法,看看分析是否正确,加密算法都不用本身写,直接从上面的源码中拷贝出来就能够了:

而后这里的salt值是咱们从数据库中拿到的,不过要记得进行hex转化一下:

而后咱们用"1234"密码去生成加密以后的信息:

运行直接看结果:

这里发现内容和上面的password.key内容彻底一致了,也就验证了,咱们的分析彻底符合,到这里咱们就分析完了输入密码的加密算法,总结一点就是:MD5(输入明文密码+设备的salt).Hex+SHA1(输入明文密码+设备的salt).Hex;就是最终的加密内容了。而这里最重要的是如何获取设备的salt值,这个其实也简单,咱们能够用反射机制进行获取,新建一个简单的Android工程:

这样咱们就不用去查看数据库获取salt值了,这样方便快捷:

这个是数据库中的long类型值转化成hex以后的值。

 

第2、手势密码算法分析

下面继续来分析手势密码,代码依然在LockPatternUtils.java中:

这个算法比较简单,就是九宫格图案转化成字节数组,而后在SHA1加密便可,关于九宫格再也不多说了,从0开始顺时针计数到8,相似以下:

这里看代码,有行和列之分,因此好比L形状的手势密码应该是:00 03 06 07 08,这样组成的五个长度的字节。这里为了验证手势密码是否正确,咱们设置一个简单的手势密码:

而后在/data/system目录下生成一个密码文件:/data/system/gesture.key,弄出来用二进制工具查看,否则可能会看到的是乱码,这里用的是010Editor工具查看:

为了最大化的还原算法,咱们依然把源码代码拷贝出来,而后定义一个手势九宫格类,构造出这个手势的点数据:

这个是源码的加密算法,下面在构造出手势点数据:

手势点应该是:00 01 02 05 08,打印看看结果:

很是的激动发现,如出一辙,这样就完美的分析完了,Android系统中锁屏密码加密算法了。这里再一次总结一下两种方式锁屏密码算法:

第一种:输入密码算法

将输入的明文密码+设备的salt值,而后操做MD5和SHA1以后在转化成hex值进行拼接便可,最终加密信息保存到本地目录:/data/system/password.key中

第二种:手势密码算法

将九宫格手势密码中的点数据转化成对应的字节数组,而后直接SHA1加密便可。最终加密信息保存到本地目录中:/data/system/gesture.key中

 

4、锁屏密码破解

上面分析完了Android锁屏密码加密算法原理,下面就来简单分析一下,如何破解Android中锁屏密码。

第一种:输入密码算法

这个若是是针对于PIN类型密码,只是简单的四位数字密码,那么全部的组合也就是10000个,这时候咱们只须要将这10000个密码经过加密算法进行加密生成一个密码库便可很容易破解。若是是复杂的输入密码那么就没这么简单了,这个或许就须要很是恶心的暴力破解了,随着密码长度增长,破解时间会很大。不过通常用户密码不会很长的。

 

第二种:手势密码算法

这个其实网上已经有人给出了一个密码库了,由于九宫格的图案能够所有算出,而后将其转化成字节数据,在用加密算法加密就能生成一个手势密码库了。具体信息能够自行网上搜索了。

 

到这里,有的同窗会有一些坏的想法了,好比捡到一个手机或者是查看老婆手机密码,是否能够直接破解它的密码呢?大体思路应该很简单,首先把设备root,由于咱们看到上面分析会发现若是想读key文件,必须有root权限的,固然root操做在对应的系统版本上仍是有方法操做的。假如root成功了,那么这时候就获取他的salt值,而后利用密码库开始暴力破解便可。固然这个是悄无声息的不会被发现的破解,不过你root了其实已经被发现了哈哈,假如你是捡到一个手机,其实没这么费劲了,直接删除key文件,这时候你随便输入一个密码都能解锁了,这个由于系统在检查密码的时候发现key文件不存在,就认为这个设备没有密码锁,因此你输入什么均可以解锁了。

惋惜到这里上面说的都是扯淡的,由于你在这一系列的操做前,你必须有一个承认,那就是设备链接容许框,咱们在将手机首次链接到电脑的时候会弹出一个受权框,若是你不受权,那么什么都干不了。除非这时候利用伟大的漏洞过了这一关,不过通常是办不到的。那么如今的问题是,你捡到了一个手机,固然高兴的插入到电脑破解的时候会发现,先解锁,而后才能看到受权框,因此就悲剧了。你什么都干不了。就老老实实的把手机还给人家,作一个伟大的良民才是正道。

 

注意:

对于这个加密算法系统是不会在某个系统版本改变的,由于你想若是加密算法变了,加入4.4用户升级到5.0,结果发现加密算法变了,手机解锁失败,用户会疯的,我页查看了2.3的代码,算法是如出一辙的。因此就把算法整理了一份Java工程放到github上,感兴趣的同窗能够下载查看或者直接使用操做便可。变的多是设备的salt值,或者数据库文件等发生变化。可是加密算法是不会改变的。

 

加密算法源码:https://github.com/fourbrother/AndroidScreenOffPwd

 

5、总结

我相信你们读完这篇文章都是火烧眉毛的想手动尝试一下,在操做以前必定要记住,先拿到你设备的salt值,这个方式有两种,一种是查看/data/system/locksetting.db文件,一种是用反射获取。而后就要注意的是源码版本,本文介绍的是5.1版本以及5.1设备进行操做,因此你操做的时候必定要注意版本,不过版本不同,这样的算法不会变的。

相关文章
相关标签/搜索