近来,阿里的支付宝钱包蛮火的嘛,特别是余额宝,屌丝们的理财神器,我也是屌丝啊哈哈。。。
让我觉得比较赞的是支付宝钱包的界面做的还不错,故想研究一下。
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