edit_note帖子
94
stars积分
50,475
event加入
2015-01-21
技术讨论
教你破解支付宝手势密码
schedule发表于 2015-01-22 10:43:00
visibility查看 1,273
chat_bubble回复 2
#1 楼主
随着移动互联网的普及以及手机屏幕越做越大等特点,在移动设备上购物、消费已是人们不可或缺的一个生活习惯了。随着这股浪潮的兴起,安全、便捷的移动支付需求也越来越大。因此,各大互联网公司纷纷推出了其移动支付平台。其中,用的比较多的要数腾讯的微信和阿里的支付宝钱包了。
正所谓树大招风,移动支付平台的兴起,也给众多一直徘徊在网络阴暗地带的黑客们又一次重生的机会。因为移动平台刚刚兴起,人们对移动平台的安全认识度还不够。就拿我身边的很多朋友来说,他们一买来手机就开始root,之后卸载预装软件,下载游戏外挂等等。今天,我们就以破解支付宝钱包的手势密码为例,来深入了解下android系统上的一些安全知识,希望能引起人们对移动平台安全的重视。
在此申明:以下文章涉及的代码与分析内容仅供android系统安全知识的学习和交流使用,任何个人或组织不得使用文中提到的技术和代码做违法犯罪活动,否则由此引发的任何后果与法律责任本人概不负责。
实验环境:
小米4TD版
MIUI-JHACNBA13.0(已ROOT)
支付宝钱包8.1.0.043001版
使用工具:
APK IDE
Smali.jar
Ddms
SQLite Expert
应用宝
程序分析
准备阶段:
安装完支付宝钱包之后,运行软件,我这里选择淘宝帐号登录,界面如图1所示。
登录之后,设置手势密码,如图2所示
完成上述两步之后,退出支付宝进程。用腾讯应用宝定位到支付宝的安装目录\data\data\com.eg.android.AlipayGphone,查看目录结构如图3所示。
实战开始 - 破解手势密码错误次数**
使用APK IDE对支付宝的安装包进行解包分析。解包完成之后,搜索setgestureErrorNum字样,结果如图5所示
经过大致分析,User*Dao.smali文件中的addUser*函数比较可疑,截取其中一段设置手势密码错误次数的代码如下:
{v0}, Lcom/alipay/mobile/framework/service/ext/security/bean/User*;->getGestureErrorNum()Ljava/lang/String;
move-result-object v1
#调用getGestureErrorNum函数获得未加密的错误次数,并保存到v1寄存器
invoke-virtual {v0}, Lcom/alipay/mobile/framework/service/ext/security/bean/User*;->getUserId()Ljava/lang/String;
move-result-object v2
#调用getUserId函数获得user id,并保存到v2寄存器
invoke-static {v2}, Lcom/alipay/mobile/security/gesture/util/GesutreContainUtil;->get8BytesStr(Ljava/lang/String;)Ljava/lang/String;
move-result-object v2
#获取user id的前8个字节,保存到v2寄存器
invoke-static {v1, v2}, Lcom/alipay/mobile/common/security/Des;->encrypt(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
move-result-object v1
#以user id的前8字节作为key,调用des加密错误次数字符串,并保存到v1寄存器
invoke-virtual {v0, v1}, Lcom/alipay/mobile/framework/service/ext/security/bean/User*;->setGestureErrorNum(Ljava/lang/String;)V
#调用setGestureErrorNum函数,将加密的字符串保存[/code]通过对上述代码的分析得知,第一次getGestureErrorNum的调用取出的错误次数应该是未加密的字符串,添加log代码验证,代码如图6所示
保存修改的smali文件,重新编译打包,安装完成之后,输入错误的手势密码,log输出数字依次递增。最后一次输入正确的手势密码,错误次数重新归0。LogCat捕捉到的日志如图7所示。
程序分析到这里,我不禁猜测,在错误次数未加密前,把v1寄存器的值设置为字符串“0”是不是就可以骗过支付宝而可以无限次的输入手势密码了呢?于是乎,我又开始了下面的验证,代码如图8所示。
编译打包,重新安装支付宝,输入错误的手势密码,发现5次错误之后程序还是让我们重新登录。看来我们这里设置错误次数已经晚了,于是乎,继续搜索调用addUser*函数来加密gestureErrorNum的地方。其中,AlipayPattern.smali文件的settingGestureError函数引起了我的注意。函数代码如下:
.method public settingGestureError(Lcom/alipay/mobile/framework/app/ui/BaseActivity;Lcom/alipay/mobile/framework/service/ext/security/bean/User*;I)V
.locals 1
new-instance v0, Ljava/lang/StringBuilder; #初始化StringBuilder实例
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {v0, p3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
#p3是一个I类型的整型变量,调用StringBuilder. append赋值
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0 #调用toString函数转换成字符串类型,赋给v0
正所谓树大招风,移动支付平台的兴起,也给众多一直徘徊在网络阴暗地带的黑客们又一次重生的机会。因为移动平台刚刚兴起,人们对移动平台的安全认识度还不够。就拿我身边的很多朋友来说,他们一买来手机就开始root,之后卸载预装软件,下载游戏外挂等等。今天,我们就以破解支付宝钱包的手势密码为例,来深入了解下android系统上的一些安全知识,希望能引起人们对移动平台安全的重视。
在此申明:以下文章涉及的代码与分析内容仅供android系统安全知识的学习和交流使用,任何个人或组织不得使用文中提到的技术和代码做违法犯罪活动,否则由此引发的任何后果与法律责任本人概不负责。
实验环境:
小米4TD版
MIUI-JHACNBA13.0(已ROOT)
支付宝钱包8.1.0.043001版
使用工具:
APK IDE
Smali.jar
Ddms
SQLite Expert
应用宝
程序分析
准备阶段:
安装完支付宝钱包之后,运行软件,我这里选择淘宝帐号登录,界面如图1所示。
登录之后,设置手势密码,如图2所示
完成上述两步之后,退出支付宝进程。用腾讯应用宝定位到支付宝的安装目录\data\data\com.eg.android.AlipayGphone,查看目录结构如图3所示。
实战开始 - 破解手势密码错误次数**
使用APK IDE对支付宝的安装包进行解包分析。解包完成之后,搜索setgestureErrorNum字样,结果如图5所示
经过大致分析,User*Dao.smali文件中的addUser*函数比较可疑,截取其中一段设置手势密码错误次数的代码如下:
{v0}, Lcom/alipay/mobile/framework/service/ext/security/bean/User*;->getGestureErrorNum()Ljava/lang/String;
move-result-object v1
#调用getGestureErrorNum函数获得未加密的错误次数,并保存到v1寄存器
invoke-virtual {v0}, Lcom/alipay/mobile/framework/service/ext/security/bean/User*;->getUserId()Ljava/lang/String;
move-result-object v2
#调用getUserId函数获得user id,并保存到v2寄存器
invoke-static {v2}, Lcom/alipay/mobile/security/gesture/util/GesutreContainUtil;->get8BytesStr(Ljava/lang/String;)Ljava/lang/String;
move-result-object v2
#获取user id的前8个字节,保存到v2寄存器
invoke-static {v1, v2}, Lcom/alipay/mobile/common/security/Des;->encrypt(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
move-result-object v1
#以user id的前8字节作为key,调用des加密错误次数字符串,并保存到v1寄存器
invoke-virtual {v0, v1}, Lcom/alipay/mobile/framework/service/ext/security/bean/User*;->setGestureErrorNum(Ljava/lang/String;)V
#调用setGestureErrorNum函数,将加密的字符串保存[/code]通过对上述代码的分析得知,第一次getGestureErrorNum的调用取出的错误次数应该是未加密的字符串,添加log代码验证,代码如图6所示
保存修改的smali文件,重新编译打包,安装完成之后,输入错误的手势密码,log输出数字依次递增。最后一次输入正确的手势密码,错误次数重新归0。LogCat捕捉到的日志如图7所示。
程序分析到这里,我不禁猜测,在错误次数未加密前,把v1寄存器的值设置为字符串“0”是不是就可以骗过支付宝而可以无限次的输入手势密码了呢?于是乎,我又开始了下面的验证,代码如图8所示。
编译打包,重新安装支付宝,输入错误的手势密码,发现5次错误之后程序还是让我们重新登录。看来我们这里设置错误次数已经晚了,于是乎,继续搜索调用addUser*函数来加密gestureErrorNum的地方。其中,AlipayPattern.smali文件的settingGestureError函数引起了我的注意。函数代码如下:
.method public settingGestureError(Lcom/alipay/mobile/framework/app/ui/BaseActivity;Lcom/alipay/mobile/framework/service/ext/security/bean/User*;I)V
.locals 1
new-instance v0, Ljava/lang/StringBuilder; #初始化StringBuilder实例
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {v0, p3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
#p3是一个I类型的整型变量,调用StringBuilder. append赋值
move-result-object v0
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0 #调用toString函数转换成字符串类型,赋给v0
全部回复 (2)
2015-01-22 19:52:00
沙发
不会是坑吧
2015-01-23 00:52:00
板凳
的舞曲第五期
登录 后才能回复
flag举报帖子