免责声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在微信公众号【小白逆向】联系作者立即删除!
前言
此次将尝试对登录框进行逆向处理,并且使用dddd进行验证码识别。
逆向目标
-
某加速登录:登录密码加密 -
逆向首页:aHR0cDovL3d3dy4xNXl1bm1hbGwuY29tL3BjL2xvZ2luL2luZGV4 -
逆向接口:aHR0cDovL3d3dy4xNXl1bm1hbGwuY29tL3BjL2xvZ2luL2NoZWNr -
脱敏处理(base64编码) -
涉及知识点:rsa、验证码是识别
网络抓包分析
1、打开调试面板了后,在三个输入框中随便输入信息。
在网络面板中找到check结尾的包。
2、u[password]
的结果为加密的,u[veryCode]
为输入的验证码,并且还有一个_csrfToken
也是类似加密的形式
u[password]
逆向分析思路
1、根据发起程序进入,断下断点
2、扣取相关加密代码
3、环境补充,本地还原
x-apiKey逆向分析
1、在initiator
中,进入index
的文件中
2、在其上几行位置,找到rsa加密代码,并断下断点
var public_key="00bdf3db924714b9c4ddd144910071c282e235ac51371037cf89fa08f28b9105b6326338ed211280154c645bf81bae4184c2b52e2b02b0953e7aa8b25a8e212a0b";
var public_length="10001";
var rsa = new RSAKey();
rsa.setPublic(public_key, public_length);
var res = rsa.encrypt($('#password').val());
3、重新提交表单,断住后进入rsa.encrypt
函数
进入函数后,在rsa.js
文件中,这里扣取整个文件的代码,然后将步骤2中的代码复制到扣取的代码的最后,改写下var res = rsa.encrypt("sadfajl");
,运行调试
4、根据报错信息,在控制台输入相关函数,进入函数中将整个js文件扣取下来放到最前面,一直重复整个过程即可
扣取的js文件大致有: rsa.js、jsbn.js、rng.js、prng4.js
报错navigator
未定义的话,在文件的最开头定义navigator即可
navigator = {
appName: "Netscape"
}
5、代码扣取成功运行截图
_csrfToken分析
经过反复验证,_csrfToken在一定时间下是保持不变的。同时它来源于index文件件中,所以可以使用正则进行匹配出来。
数据获取流程
-
获取验证码图片进行验证码识别; -
获取_csrfToken; -
密码加密; -
携带相关数据,发起请求。
总结
代码示例,不能直接运行:
# **************************************
# --*-- coding: utf-8 --*--
# @Time : 2022-12-10
# @Author : white
# @FileName: 某加速.py
# @Software: PyCharm
# **************************************
import requests
import execjs
import io
import re
import ddddocr
def sign():
'''登录操作'''
# 先请求token以及cookie,请求验证码时,要带上这两者,后端会将验证码与token关联起来
get_Token_cookie()
url = 'http://www.15yunmall.com/pc/login/check'
data = {
"u[loginType]": "name", # phone代表手机号, name代表用户名
"u[phone]": username,
"u[password]": get_pwd(),
"u[veryCode]": get_code(),
"u[token]": "",
"_csrfToken": _csrfToken
}
res = session.post(url, headers=headers, data=data)
# print(res.request.headers)
status_code = {
'31': '恭喜,登陆成功。',
'32': '登陆失败。',
'33': '用户名或密码错误。',
'35': '该用户已被管理员锁定。',
'311': '该账号已绑定设备,请在绑定的设备登陆。',
'20001': '验证码填写错误!'
}
# 返回的字符串中被添加了特殊字符,导致不能直接比较
# xefxbbxbf这个是我通过将返回的字符进行二进制编码后得到的
n = b'xefxbbxbf'.decode('utf-8')
num = res.text.replace(n, '')
for k, v in status_code.items():
if k == num:
print('响应结果:', v)
# print(num)
sign()
成功截图:
代码已在github开源:
https://github.com/puboop/reverse/
原文始发于微信公众号(小白逆向):【逆向系列】7-某加速验证码识别-密码加密逆向