免责声明:本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
逆向目标
- 目标:百度旋转验证码
- 主页:https://wappass.baidu.com/#/password_login
- 接口:https://passport.baidu.com/viewlog
- 逆向参数:
- Get Param
- ak: 1e3f2dd1c81f2075171a547893391274
- as: 02a62d7d
- fs: 太长,略
- tk: 太长,略
- Get Param
逆向过程
四个参数中,ak是固定的,as和tk是接口返回的,所以只需要找出fs的生成方法即可。
从调用栈中进入相关代码进行调试:

然后文件中搜索fs =
,发现fs是经过encrypt方法加密生成,如下图:

encrypt方法简单的封装了一下aes加密算法,接受一个参数i,是一个JSON字符串,进入这个方法,代码如下:

其中的key是t,而t则是由as和固定的字符串appsapi0
拼接而成,i则是传入进来的JSON字符串。所以只需要解决这个JSON字符串是如何生成的,也就知道fs是如何生成的了。
全局搜索rzData
,找到一处定义的地方,如下图:

可以看到simu是检测到webdriver,这里默认为0就行。
看下关键的ac_c,ac_c是由i.percentage赋值。

跟进去看下:

其中o是旋转的角度,a是固定值212。
rzData中还有一个backstr,来自于其它请求。

至于其它的字段,比如cl,mv等不影响旋转验证码的验证。自此,整个fs的逆向过程就完成了。
旋转角度的识别
关于旋转验证码的识别,网上找的模型,地址如下:https://github.com/chencchen/RotateCaptchaBreak
测试
测试结果如下:

op为1表示验证通过,为0则表示验证失败。
若需要完整代码,扫描加微信。
