Android逆向分析(1)

安卓5.1系统版本下输入密码算法分析

    首先可以根据锁屏密码界面,使用工具获取到当前的view,之后一步步跟进后会得到一个密码工具类:LockPatternUtils.java类,进入到源码后,能够发现一个关于密码的算法方法:

Android逆向分析(1)

    这个方法参数应该为用户的输入密码和用户的id值,核心的加密算法应该为:原文密码 + 设备的salt值,然后在分别进行MD5和SHA-1操作,转化为hex值之后再进行拼接,得到的就是最后保存在本地数据库中的加密内容,而这之中的getSalt方法就显得尤为重要.

Android逆向分析(1)    查看以上方法代码,首先根据字段key为LOCK_PASSWORD_SALT_KEY从一个地方获取salt值,如果是零,就随机生成一个,然后将其保存在那个地方,然后将salt转化成为hex,之后继续分析,要找到这个存储KEY值的地方.

Android逆向分析(1)    继续跟踪代码:

Android逆向分析(1)

    通过在ServiceManager中获取一个服务来进行操作,在Android中,像这种获取服务的方式最终实现逻辑都是在XXXService类中,这里就是LockSettingsService.java类中查看他的getLong方法,可以确定是存在数据库中保存的密码数据,继续跟踪代码:

Android逆向分析(1)

    能够在上述代码中准确的判断是存在了数据库中,并得到了一定的关键信息,继续查看LockSettingsStorage.java类,可以找寻到截个关键的代码片,能够知道数据库名叫:locksettings.db,并且可以找到下面代码:

Android逆向分析(1)

    可以看到有两个key文件,他们都是用来保存加密之后的手势或是输入密码的,将信息存到本地,下次开机的时候在读取这个文件内容进行密码对比,看到一个目录是system,所以根据对手机系统目录的熟悉与猜测,很可能key文件与数据库就存在/data/system/目录下,为了证实可以直接使用find命令去根目录搜索,也可以root手机,获取权限后下载RE文件管理器,在手机中查看,命令输入为:# fing / -name locksettings.db 如果提示说找不到find命令,这时需要安装busybox工具,才能使用此命令.之后你会很容易的找到这个数据库文件,找到后就可以很容易的进行查看,如果想要对我们之前分析的东西想进行查证:

Android逆向分析(1)

    这里的salt是我们从数据库中取到的,记得要进行hex转化,然后用"1234"原文密码去生成加密之后的信息.运行后可以发现,产生的log信息内容与password.key完全一致,也就验证了上述的分析完全正确,可以总结的一点是:MD5(输入明文密码+设备的salt).Hex+SHA1(输入明文密码+设备的salt).Hex就是最终的加密内容.而这里最重要的是如何获取设备的salt的值,当然也可以使用反射的机制来进行获取,可以新建一个简单的android项目:

Android逆向分析(1)

    这样就不需要去查看数据库获取salt值了,方便快捷.以上是所有分析android 5.1系统下输入密码的逆向算法分析总结.么么哒