6.2 Android手机屏幕锁解锁技术

随着移动通信技术的发展,手机及智能终端成为人们工作和生活中必不可少的设备,其内置的操作系统能达到类似于计算机的功能,且拥有许多移动通信特有的应用和服务,如微信、移动支付等。Kantar Worldpanel的最新报告显示,搭载Android系统的移动终端数量在中国的主要城市呈现强劲的增长态势。

与此同时,利用智能手机实施犯罪的情况及由此造成的损失与日俱增。手机取证正是打击此类犯罪和收集犯罪证据的有力手段。通过查看涉案智能手机上的相关数据,能为案件的侦破提供关键的证据和线索。但是,在实际取证过程中,由于有些智能手机使用了屏幕锁技术,导致在进行电子数据取证时困难重重。

本节将对Android系统的各种屏幕锁的原理进行详细分析,并有针对性地讲解相应的解锁方法。

6.2.1 Android屏幕锁的分类

0238-1

图6-7 屏幕锁定方式

在Android系统中,屏幕锁定方式包括“无”、“滑动”、“人脸解锁”、“图案”、“PIN”和“密码”6种,如图6-7所示。其中,“无”和“滑动”两种方式属于无保护状态,无须解锁即可进入系统进行操作;“人脸解锁”是一种误差较大的识别方式,通过相近的脸、照片、视频等方式即可解锁。本节主要讲解已root Android系统的“图案”、“PIN”、“密码”3种屏幕锁的解锁方法。

6.2.2 图案锁定及解锁

在Android设备上通过图案来锁定屏幕是最为常用的一种安全措施,用户可以通过设置锁定图案对设备的用户界面进行锁定。图案锁定设置界面如图6-8所示。

0239-1

图6-8 设置解锁图案

1.图案锁定原理

Android设备的锁定界面由一个3×3矩阵(共9个点)组成,设定图案必须满足两个基本要求:一是图案必须包括至少4个点(Android 2.3.3之前的版本为至少3个点);二是每个点只能被使用1次,最多使用9个点。

Android图案解锁在设备中的存储方式是将图案上的点进行编码,然后将编码通过散列算法SHA1进行加密,最后存储在系统文件夹“data”中,如图6-9所示。

0239-2

图6-9 图案密码转换存储过程

0239-3

图6-10 图形编码

2.图案锁定解锁

了解Android图案密码的建立过程之后,可通过以下3个步骤来解锁图案屏幕锁。

01 获取密文文件

运行“adb pull /data/system/gesture.key gesture.key”命令将密码文件下载到本地,或者运行“adb shell cp /data/system/gesture.key /sdcard/gesture.key”命令将密码文件复制到SD卡中,如图6-11所示。使用Ultraedit打开该文件,可以看见十六进制数据,由此可知,该数据和之前采用编码加密的数据是一样的。

0240-1

图6-11 密文存储文件

02 研究编码规则

从图形编码来看,各奇数位数字都为0,偶数位数字不重复排列,并对这个排列进行单次SHA1运算。通过计算可知,由于奇数位确定,偶数位不重复(从0到8),则根据之前的图案锁定规则,可以设置的锁定图案总数是一定的。4个节点的密码个数为3024(9×8×7×6);5个节点的密码个数为15120;6个节点的密码个数为60480;7个节点的密码个数为181440;8个和9个节点的密码个数为362880;密码总数为985824个。可见,密码的可选范围不大,解锁相对比较容易。

6.2.3 PIN和密码锁定及解锁

在Android设备上较强的加密方式还有使用PIN和密码进行屏幕锁定。这两种屏幕锁定方式在Android 2.2之后的版本中可以使用。解锁界面如图6-12所示,左边为密码解锁界面,右边为PIN解锁界面。

0240-2

图6-12 解锁界面

1.PIN和密码原理

两种解锁方式必须满足以下两个基本要求:输入的字符不能少于4个数字(PIN)、输入的字符不能少于4个且必须包含至少1个字母(密码);输入的字符必须少于17个。

Android系统将通过这两种方式生成的密文存储在/data/system/password.key文件中,如图6-13所示。该文件中存储了一组SHA1的Hash值和一组MD5的Hash值,共72字节。

0241-1

图6-13 密文文件内容

与图案散列加密不同的是,这两种屏幕锁定方式在散列加密时加入了salt值,该值存放在/data/data/com.android.providers.settings/databases/settings.db文件中。打开SQLite数据库文件settings.db,可以看到secure表中有字段lockscreen.password_salt,该字段的值就是散列加密中用到的salt值。系统会使用如下代码段将用户输入的PIN或者密码的明文转换成密文,然后存储在password.key 文件中。

public byte[] passwordToHash(String password){ 
    if(password == null){ 
      return null; 
    } 
    String algo = null; 
    byte[] hashed = null; 
    try{ 
      byte[] saltedPassword = (password + getSalt()).getBytes(); 
      byte[] sha1 = MessageDigest.getInstance(algo = "SHA-1").digest(saltedPassword); 
      byte[] md5 = MessageDigest.getInstance(algo = "MD5").digest(saltedPassword); 
      hashed = (toHex(sha1) + toHex(md5)).getBytes(); 
    }catch(Exception e){ 
      Log.w(TAG, "Failed to encode string because of missing algorithm:" + 
algo); 
    } 
return hashed; 

具体的转换方式为:将输入的密码和salt值拼接,分别进行SHA1散列和MD5散列,将40字节的SHA1散列和32字节的MD5散列拼接后存储在password.key文件中。

2.PIN和密码解锁

在理解两种锁定方式的加密原理之后,形成一套行之有效的解锁方法就不是一件难事了。获取屏幕解锁密码需要经过以下3步。

01 获取 /data/system/password.key文件,并将其中的SHA1或MD5散列密文取出。

02 获取 /data/data/com.android.providers.settings/databases/settings.db文件,并将其中的salt值取出。

03 使用Hashcat、PasswordsPro等工具进行解密。解密的时间取决于锁定密码的强度,密码的位数越多,解密的时间就越长。

6.2.4 更多解锁方法

除了使用上述屏幕锁解锁方法之外,还有其他解锁方法。

1.锁定清除

当密码比较复杂,在短时间内无法解锁,并且取证工作对于手机某些文件夹中的文件没有完整性要求时,可以通过删除或替换/data/system文件夹中的对应密文存储文件gesture.key或password.key达到解除屏幕锁定的目的。删除了对应密文存储文件之后,使用任意密码都能解锁屏幕;替换了对应密文存储文件之后,使用替换密文对应的解锁方式就能解锁屏幕。

2.锁定绕过

Android系统通过KeyguardLock类控制锁屏服务的开启和关闭。调用该类的方法disableKeyguard可以关闭锁屏服务,从而达到不输入密码就绕过锁屏界面的目的,示例如下。

KeyguardManager manage = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);
//获取当前屏幕状态 
If(manage.inKeyguardRestrictedInputMode()){ 
                KeyguardLock keyguard = manage.newKeyguardLock(getLocalClassName());
                Keyguard. disableKeyguard (); 
                } 
//如果处于锁定状态,通过disableKeyguard函数绕过锁定 

将以上代码编译成开机自启动的APK程序,安装到被锁定的手机上,重启之后将不再显示锁屏界面,而是直接进入系统。

3.JTAG接口

要想在没有被root的Android智能终端上获取相应的解锁信息,需要先使用JTAG接口将手机内存芯片中的数据dump到本地计算机,然后找出对应的密文文件gesture.key和password.key,并通过关键字找出lockscreen.password_salt的值,最后就可以使用6.2.3节介绍的方法解锁了。