窥探支付宝钱包android客户端的屏幕加密解锁

本文探讨了支付宝钱包Android客户端的屏幕加密解锁机制。通过反编译和分析,发现屏幕密码存储在aplipayclient.db数据库中,采用MD5加密。作者提到MD5解密的困难,并分享了在尝试解密过程中遇到的问题及解决方案,包括adb服务器问题和文件权限问题。
摘要由CSDN通过智能技术生成

近来,阿里的支付宝钱包蛮火的嘛,特别是余额宝,屌丝们的理财神器,我也是屌丝啊哈哈。。。

让我觉得比较赞的是支付宝钱包的界面做的还不错,故想研究一下。

apktool反编译过后,觉得页面也就那样,各种各样的嵌套。之前看过 gameHacker的  Android屏幕解锁图案破解

所以我也来研究一下支付宝钱包的android客户端v7.6.0.1028(以下简称钱包apk)。


(一)思路,先找到钱包apk的屏幕密码的存放位置。

根据初步判断,钱包apk的屏幕密码gesture.key不是放在 android系统 /data/system 下,而是放在某个数据库文件中。如下图:


     

aplipayclient.db就是存放屏幕密码的数据库。各位网友可以修改钱包apk的屏幕密码,对比一下修改前后 /data/data/com.eg.android.AlipayGphone下的

文件的修改时间,就会发现哪一个db是存放钱包apk屏幕密码的数据库了。


aplipayclient.db是android 内置sqlLite数据库文件,用SQLiteSpy打开该文件。



好了,gesturePwd就是我们要找的屏幕密码。


(二)加密方式

该密码字符串采用的是怎么样的加密方式。先分析一下,

钱包apk的屏幕图案是个九宫格,应满足三个要求:

1.至少四个点;
2.最多九个点;
3.无重复点。

举个例子:图形“2”(参考上图),android默认的屏幕则是字符串“000102050403060708”,经过SHA1加密后得到密文是“333d9f31c209ce1217bc165c5baa7307b06bbf87

故钱包apk的屏幕密码不是采用SHA1加密方式。

经过反编译,在classes\com\alipay\mobile\security\securitycommon\SecurityUtil.smali 文件中找到了加密方式--MD5.如下图:




具体的反编译过程,就不细说了。各种反编译工具,本次crack用的工具是APK改之理(APK IDE)。



(三)解密

大家都知道MD5的解密难度,要想暴力破解谈何容易。

我所知有效的两种破解方法:

1.在线破解网站,把MD5密文收录进数据库提供查询,如:www.md5.com   

2.单机多线程暴力破解工具--MD5Crack V3.0    经过我的测试,觉得还蛮好用的,能快读破解一些相对简单的MD5.


本文只是窥探,不是破解。用java写了一个测试类,

import java.security.MessageDigest;


public class MD5 {
	
	public static String MD5(String inStr) {
		MessageDigest md5 = null;
		try {
			md5 = MessageDigest.getInstance("MD5");
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
		char[] charArray = inStr.toCharArray();
		byte[] byteArray = new byte[charArray.length];

		for (int i = 0; i < charArray.length; i++)
			byteArray[i] = (byte) charArray[i];

		byte[] md5Bytes = md5.digest(byteArray);

		StringBuffer hexValue = new StringBuffer();

		for (int i = 0; i < md5Bytes.length; i++) {
			int val = ((int) md5Bytes[i]) & 0xff;
			if (val < 16)
				hexValue.append("0");
			hexValue.append(Integer.toHexString(val));
		}

		return hexValue.toString();
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(MD5("000102050403060708"));
	}

}

输出的结果3d0440c66434d6d7a4f12ca4048d60e7并不与我们第一步获取的密码 一致啊,难道是加密方式错了???


后面想了想,试了试,钱包apk的屏幕密码不是“000102050403060708” ,而是“012543678”,再一次运行测试类得到密文“fe7ebe14c415675533965150bf650bbc”


OK!正确!懂得了android屏幕密码的原理,在支付宝钱包上得到发挥了,这算是学以致用了,嘿嘿。。。







后记:

在探索的过程中,遇到了几个小问题,现一并贴上方便初学者。

(一)

adb server is out of date.  killing...  
ADB server didn't ACK  
* failed to start daemon *  


adb 不管执行 shell devices 还是logcat 都会报错

其原因是 adb server没启动。


5037端口被占用了,查看一下。

netstat -ano | findstr "5037"  

打开任务管理器关掉4236 这个进程(该死的企鹅)。ok!


(二)

使用adb pull命令从android系统中读取文件失败。显示:Permission denied

原因:是由于文件权限原因引起的。

使用 android sdk中的adb shell ls –l命令查看android系统中的文件权限为:


应该有两种方式读取文件:

1    使用su命令,用超级用户登路,然后chmod命令。这个没试。

2    把gesture.key的内容读取到sdcard下某一个文件222.txt,然后读取pull  222.txt文件。


(三)

暴力破解android屏幕图案,直接用超级用户删除/data/system/gesture.key 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值