【带你去你不知道的地方】之一:破解支付宝 Android APP 手势密码

【带你去你不知道的地方】是一个专门写安全的系列。第一篇有关于支付宝 Android APP 的文章写于 2014 年 7 月 10 日,当时是写在另一个平台上的,现在迁移过来。同时,Ricky 从 2017 年年中开始,会不断地接触一些安全的东西,到时候会从易到难写一些跟 hacker 有关的安全文章放到这个系列里,敬请期待。

在此申明:以下文章涉及的代码与分析内容仅供 Android 系统安全知识的学习和交流使用,任何个人或组织不得使用文中提到的技术和代码做违法犯罪活动,否则由此引发的任何后果与法律责任本人概不负责。

昨晚(2014 年 7 月 10 日)在某 hacker 网站上看到一篇名为《支付宝钱包手势密码破解实战(root后可直接绕过手势密码)》的教程,今早心血来潮就验证了一番,发现非常有效!!

如果你有一定的破解经验,请直接阅读该文章后面附上的原文;如果你没有破解经验,我将非常浅显、一步一步地告诉你应该怎么做。

首先你需要准备:

  1. 一台已 ROOT 的安卓手机(我采用的手机是联想 A60 手机,乐蛙 OS,基于 2.3.5,已 ROOT);
  2. SQLiteExpert,一个用于读写 SQLite 数据库的软件(SQLiteExpert 下载地址:官网下载,注意:SQLite Expert Professional (trial version) 是收费版本;SQLite Expert Professional 是免费版本,请下载免费版本);
  3. APKIDE,APK 反编译与重编译软件(APKIDE 下载地址:百度云盘备用链接);
  4. android-sdk-windows,Android 的 SDK 开发工具,如果你对 Android 编程有一定了解相信你对它不会感到陌生(下载地址请自行百度,就是一个压缩包,解压后会有一堆文件,无需安装,用 APKIDE 重新编译 APK 时需要用到);
  5. 360 手机助手或者腾讯应用宝,用于读出手机中的支付宝的 SQLite 数据库(我用的是 360 手机助手,这个就不用我贴下载地址了吧);
  6. 支付宝钱包 8.1.0.043001 版,我们将基于这个 APK 进行破解,该版本的支付宝于 2014 年 6 月 4 日发布(支付宝钱包 8.1.0.043001 版下载地址:百度云盘备用链接)。
md5sum :

3a1fee6115d9c075a31320737b8539c5 ApkIDE最新3.3.3少月增强版20160730.rar
9fac860d8e47b326491ae2b84b46f14c com.eg.android.AlipayGphone_154224.apk

若哪一天下载链接不幸失效,请在下方评论说明,我会及时更新,谢谢。

好,准备好了你已 ROOT 的安卓手机,下载好了上面的软件,我们开始!!

1、首先在手机上安装好支付宝钱包 8.1.0.043001 版,登录并设置支付宝的手势密码,如下图所示:

登录并设置支付宝的手势密码
登录并设置支付宝的手势密码

2、现在,把你的手机接到电脑上,打开360手机助手,点击 “ 文件 ”,如下图所示:

打开360手机助手,点击 “ 文件 ”
打开360手机助手,点击 “ 文件 ”

3、定位到支付宝的安装目录 \data\data\com.eg.android.AlipayGphone,如下图所示:

定位到支付宝的安装目录 \data\data\com.eg.android.AlipayGphone
定位到支付宝的安装目录 \data\data\com.eg.android.AlipayGphone

4、这些都是支付宝软件下的数据库。我们可以右键单击上面的数据库文件,执行 “ 导出 ” 到电脑的操作,同时用 SQLiteExpert 工具打开所有的 db 文件,分析发现 alipayclient.db 数据库中的 userinfo 表中保存了用户名、输入错误次数、手势密码等详细信息,如下图所示:

用 SQLiteExpert 工具打开 alipayclient.db 文件
用 SQLiteExpert 工具打开 alipayclient.db 文件

其中的 gestureErrorNum 字段应该就是保存了手势密码输入错误的次数了,很明显这里已经被加密了。

5、打开 APKIDE 软件,我们需要对它进行一番设置。点击 “ 工具 ” → “ 配置与选项 ”,打开如下图所示的界面。Java SDK 默认安装后会自动读取到路径,无需配置,如果你没有安装 Java SDK 请去下一个;Android SDK 安装路径指向你解压出来的 android-sdk-windows 文件夹即可。

打开 APK IDE 软件,我们需要对它进行一番设置
打开 APK IDE 软件,我们需要对它进行一番设置

6、点击软件左上方的 “ 项目 ” → “ 打开 APK 文件 ”,去打开支付宝钱包 8.1.0.043001 版,软件将会执行反编译操作,这将需要一点时间,如下图所示:

点击软件左上方的 “ 项目 ” -> “ 打开 APK 文件 ”
点击软件左上方的 “ 项目 ” -> “ 打开 APK 文件 ”

其他相关文章:

编译出来的均为 smali 语言文件,如果你对 smali 语言并不熟悉请参阅这里:

7、在搜索内容中输入:setgestureErrorNum,让我们来看看代码的哪些地方调用了这个方法,从而找到判断手势密码输入错误的地方,进而修改源代码进行绕过。搜索截图如下图所示:

在搜索内容中输入:setgestureErrorNum,让我们来看看代码的哪些地方调用了这个方法
在搜索内容中输入:setgestureErrorNum,让我们来看看代码的哪些地方调用了这个方法

8、调用到 setgestureErrorNum 方法的地方仅有 4 个类,经过类名的判断以及综合分析(没错,如何审阅代码的过程这里一律略过,我们直奔主题 → →),发现 AlipayPattern.smali 文件的 settingGestureError 函数比较可疑,可疑的函数代码以及注释如下:

.method public settingGestureError(Lcom/alipay/mobile/framework/app/ui/BaseActivity;Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo;I)V
.locals 1
new-instance v0,Ljava/lang/StringBuilder;
# 初始化 StringBuilder 实例
invoke-direct {v0}, Ljava/lang/StringBuilder;->()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;
#调用 toString 函数转换成字符串类型,赋给 v0
move-result-object v0
invoke-virtual {p2, v0},Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo;->setGestureErrorNum(Ljava/lang/String;)V
# 调用 setGestureErrorNum 设置未加密的错误次数字符串
invoke-static {},Lcom/alipay/mobile/framework/AlipayApplication;->getInstance()Lcom/alipay/mobile/framework/AlipayApplication;
move-result-object v0
invoke-static {v0},Lcom/alipay/mobile/framework/service/ext/dbhelper/SecurityDbHelper;->getInstance(Landroid/content/Context;)Lcom/alipay/mobile/framework/service/ext/dbhelper/SecurityDbHelper;
move-result-object v0
invoke-virtual {v0, p2},Lcom/alipay/mobile/framework/service/ext/dbhelper/SecurityDbHelper;->addUserInfo(Lcom/alipay/mobile/framework/service/ext/security/bean/UserInfo;)Z
# 调用 SecurityDbHelper.addUserInfo 函数加密、更新数据库
return-void
.end method

9、通过上述代码注释我们知道,修改 p3 的值为 0 即可去除支付宝只能尝试输入 5 次手势密码的限制,代码修改如下图所示:

修改 p3 的值为 0 即可去除支付宝只能尝试输入 5 次手势密码的限制
修改 p3 的值为 0 即可去除支付宝只能尝试输入 5 次手势密码的限制

10、修改完毕代码,按 ctrl + s 保存,点击 “ 编译 ” → “ 编译生成 APK ”,在下方的 “ 输出 ” 框里会看到编译结果,编译结果如下图所示:

按 ctrl + s 保存,点击 “ 编译 ” → “ 编译生成 APK ”,在下方的 “ 输出 ” 框里会看到编译结果
按 ctrl + s 保存,点击 “ 编译 ” → “ 编译生成 APK ”,在下方的 “ 输出 ” 框里会看到编译结果

11、如果编译不通过说明你的 Java SDK 或是 Android SDK 没有配置好,请返回第 5 步重试。现在我们将重新编译好的 APK 安装到手机,你会发现大功告成!!如下图所示,让我们来测试一下:

先输入一个错误的手势密码
先输入一个错误的手势密码
软件提示你有 5 次机会
软件提示你有 5 次机会
再输入一个错误的手势密码
再输入一个错误的手势密码
软件还是提示你有 5 次输入的机会
软件还是提示你有 5 次输入的机会

Enjoy yourself !!

如下图所示,支付宝的手势密码其实就是数字 0 到 8、最短 4 位,最长 9 位的纯数字密码。采用暴力破解法对于现在的手机来说 so easy,用电脑穷举 4 位到 9 位的纯数字密码,也不到一分钟。如果你看到这里有一点点进一步的破解思路请接着往下看原文!!

支付宝的手势密码其实就是数字 0 到 8、最短 4 位,最长 9 位的纯数字密码
支付宝的手势密码其实就是数字 0 到 8、最短 4 位,最长 9 位的纯数字密码

这里点到为止,如需深挖,还请大家多多加油!!

如果你是资深写安卓程序的程序猿相信你对 DDMS(Dalvik Debug Monitor Service)并不陌生,APKIDE 也是可以开启 DDMS 的,只需点击 “ 工具 ” → “ Dalvik Debug Monitor Service ” 即可启动。

“ 工具 ” → “ Dalvik Debug Monitor Service ” 即可启动
“ 工具 ” → “ Dalvik Debug Monitor Service ” 即可启动

APKIDE 是一个很棒的安卓反编译与重编译工具,在这里真的要感谢一下原作者,没有你的辛勤付出就没有如此方便的反编译工具!!


 

原文:支付宝钱包手势密码破解实战(root 后可直接绕过手势密码)

随着移动互联网的普及以及手机屏幕越做越大等特点,在移动设备上购物、消费已是人们不可或缺的一个生活习惯了。随着这股浪潮的兴起,安全、便捷的移动支付需求也越来越大。因此,各大互联网公司纷纷推出了其移动支付平台。其中,用的比较多的要数腾讯的微信和阿里的支付宝钱包了。就我而言,平时和同事一起出去 AA 吃饭,下班回家打车等日常生活都已经离不开这两个支付平台了。

正所谓树大招风,移动支付平台的兴起,也给众多一直徘徊在网络阴暗地带的黑客们又一次重生的机会。因为移动平台刚刚兴起,人们对移动平台的安全认识度还不够。就拿我身边的很多朋友来说,他们一买来手机就开始 root,之后卸载预装软件,下载游戏外挂等等。今天,我们就以破解支付宝钱包的手势密码为例,来深入了解下 Android 系统上的一些安全知识,希望能引起人们对移动平台安全的重视。

手机硬件以及破解的支付宝版本:

红米TD版 MIUI-JHACNBA13.0(已越狱)、支付宝钱包 8.1.0.043001 版

其他工具软件:

APKIDE、Smali.jar、Ddms、SQLiteExpert、应用宝

准备阶段:

安装完支付宝钱包之后,运行软件,我这里选择淘宝帐号登录,界面如下图所示:

本文隐藏内容 登陆 后才可以浏览

后记

如上所述,通过修改支付宝钱包数据库来达到破解目的的方法是需要在已经 root 过的手机上才能使用的。设想一下这种情况,我的手机已经 root,并且手机被盗。那么,除了手机上的艳照有可能泄露之外,小偷还可以通过修改支付宝的手势密码来登录我的支付宝,因此,造成直接的金钱损失也不是没有可能。

一般来说,普通用户日常使用的手机尽量不要去 root,也不要随便去下载来历不明的软件和外挂。

 

本文完。如有疑问,欢迎在下方留言;如本文有什么错误,欢迎在下方留言指正,谢谢。

这篇文章对你有帮助吗?

相关文章

发表评论?

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据