Android端某商用验证码破解

查看 96|回复 9
作者:DS_FLY100   
一、前言
先说些废话···本人大学学的专业偏硬件,毕业后从事的第一份工作就是和逆向有关,当时没有同事教,都是自己看书,看论坛,发帖求助,一点点学习到今天。着实不易,所以想写点东西,一是为了有干货体现自己的能力,二是希望能帮助大家,如果大家能从我的帖子学习到一点知识,我也算功德无量拉~~~
本次是对Android端的某商用验证码的破解,主要介绍思路和一些踩过的坑。文笔不好多多见谅,有不对的地方请大佬斧正,有侵权请管理删帖。多谢~
二、抓包分析流程


11.png (55.16 KB, 下载次数: 1)
下载附件
2020-6-8 15:43 上传

如上图所示,登录请求上面有四个请求,第一个请求,请求了两个明文字符串,这里主要分析第二个请求和第三个请求,第二个请求如下:


22.png (65.91 KB, 下载次数: 1)
下载附件
2020-6-8 15:48 上传

请求体中是一段加密数据,从这段数据上看,可以稍微做一点点猜测,这段数据可能是两端字符串拼接的,前面那段也用了base64编码。
三、反编译寻找加密代码段
JADX反编译apk,搜索 base64.  结果如下:


33.png (74.68 KB, 下载次数: 1)
下载附件
2020-6-8 15:54 上传

因为这个apk是用了这个验证码的SDK,所以在SDK包名下的这个base64参与的地方,应该就是和加密有关的地方。直接跟过去如下:


44.png (46.55 KB, 下载次数: 1)
下载附件
2020-6-8 15:57 上传


可以发现这里用了RSA加密,有些和密钥相关的方法。
右键  查找用例, 发现只有一个地方调用了这个和密钥有关的函数,继续跟过去,如下:


55.png (33.59 KB, 下载次数: 1)
下载附件
2020-6-8 16:01 上传

这里发现这个sdk 混淆的还是可以的 全是 00oo00的函数名,看起来挺费劲的,所以大家要耐心点,我这边为了使这个加密流程更清晰,就把相关函数扣下来,并把所有函数名都重命名了。具体如下:


66.png (53.41 KB, 下载次数: 1)
下载附件
2020-6-8 16:10 上传

可以看到这个函数传了两个字符串参数,然后最后输出的结果是两个字符串的拼接,这就符合我们上面的猜想了。虽然原SDK混淆的厉害,但是调用加密还是用了加密库,一个RSA加密,一个AES加密,所以这里我命名时候就用了RSAEncrypt 和 AESEncrypt。这样比较好区分···
四、分析传参模拟加密
把加密参数抠出来并且重命名后,接下来就是分析传参了,传的两个字符串到底是啥~,然后知道传参后,就能调用这个加密函数完成加密模拟了。
这里提供两个方法,一个是打断点,动态调试。第二个是hook大法。这里图省事,就直接用xposed  hook这个函数。hook代码如下:


77.png (49.03 KB, 下载次数: 1)
下载附件
2020-6-8 16:25 上传

hook结果为:  第一个参数为 抓包时候第一个请求返回的两个字符串,第二个参数为一个16个字节的字符串,这里需要继续弄清楚这个16字节的字符串是如何生成的, JADX 右键这个加密函数,查找用例,结果如下:


88.png (16.42 KB, 下载次数: 1)
下载附件
2020-6-8 16:31 上传

可以发现这个第二个参数 ,是由上面那个传参 16的函数生成的,ctrl+左键跟到那个传参16的函数去:


99.png (18.3 KB, 下载次数: 1)
下载附件
2020-6-8 16:33 上传

可以发现就是一个随机数。可以在我们模拟的流程中,直接照抄这段代码。
分析到这里已经完成了所有了加密流程的分析(SDK中还是调用了很多混淆的函数,照抄就行,想好看点就修改下函数名)
五、发送请求,验证结果
在登录之前有四个请求,其中第二个和第三个请求携带了加密数据,经过分析发现第三个请求和第二个请求用了同一套加密。第三个请求的传参也是通过xposedhook就行,传输了一些手机信息和鼠标点击坐标等。下面就是模拟这四个请求验证我们模拟的加密了。


1o.png (59.66 KB, 下载次数: 1)
下载附件
2020-6-8 16:40 上传

如上图所示,发送post请求时候,携带我们模拟的加密数据。返回值如下:


111.png (14.65 KB, 下载次数: 1)
下载附件
2020-6-8 16:46 上传

可以发现和正常操作的返回值是一样的。后续的登录接口也能返回正常的数据,不会报错了。至此我们就通过模拟同样的加密,过掉了此款商用验证码。
六、总结及踩坑
这个验证码,区别于传统的滑块验证,没有校验移动轨迹,只是通过校验加密参数来校验是否是正常访问。所以通过模拟同样的加密就可以过掉了。下面介绍一下我遇到的坑,大家下次遇见可以借鉴一下:
1、base64 模式的问题,这个sdk用的是base64.(str,4),如果用其他的可能会出错(eclipse或IDEA导入的base64jar包)
2、不同平台RSA公钥解析问题,同样的字符串,在android和windows解析出来的RSA公钥不同。这点卡了我非常久的时间。windows下默认的是sun JDK  Android上默认的是OpenJDK 。 我当时在Eclipse模拟加密一直报错,就是这个RSA公钥解析的问题。
3、混淆情况下函数名问题,如果照抄混淆的函数名,会和很多变量名一样,会报错,大家在理清流程的时候可以把代码扣出来,然后修改函数名和变量名。一定要耐心~~~
本文只是提供一个思路,具体的样本和验证码厂商就不公布了。谢谢理解。如果大家能点个赞给个热心那就更棒了!!! 多谢~
最后加上国际惯例:
本文仅供学习使用,如果用于非法用途,自行承担后果~

下载次数, 函数

ericgao   

不错啊,加油!顶一个
DS_FLY100
OP
  


ericgao 发表于 2020-6-8 17:26
不错啊,加油!顶一个

多谢拉!
DS_FLY100
OP
  


hesqiang 发表于 2020-6-8 17:34
不错,顶一个。。。

多谢拉!
小飞虫   

加油!顶一个
A00   

不错啊,加油,大家一起交流
wwb66668   

感谢楼主的分享~
lxm138198   

还没看懂,慢慢琢磨!!
dxaw2458   

看不懂系列   顶一个
扬州八怪   

膜拜大神谢谢分享
您需要登录后才可以回帖 登录 | 立即注册

返回顶部