demo比较简单,逆向难点:rsa加密,图片验证码
我们模拟登录,请求一下
红框内是我们提交的参数,password看上去应该是rsa加密,captcha是验证码,keysTime是一个时间戳,account是手机号。
全局搜索一个参数,点进去找找加密位置。
找到加密位置,下断点,再次请求后,开始调式。
搜索g_param,找到time生成方法,看上去像是写在网页里面,在网页上搜索一下。
果然是保存在网页中,上面应该是rsa公钥,一举两得,下面接着逆向password。
搜索password,找到加密位置。
继续跟进。
这里有两种方法:1,把加密方法全部扣下来 2,安装node第三方库node-jsencrypt
,建议使用第二种,方便省事。
到此为止加密参数就算全部解析完毕,下面讲验证码。
因为验证码不算复杂,用ddddocr识别即可,识别率还可以。
首先我们把网页中的信息提取出来:key、key_time、图片链接
import requests
from lxml import etree
session = requests.session()
headers = {
'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
}
def get_params():
url = 'https://www.yiban.cn/login?go=https%3A%2F%2Fwww.yiban.cn%2F'
res = session.get(url,headers=headers).text
html = etree.HTML(res)
key = html.xpath('//div[@class="login-cont"]/ul/@data-keys')[0] # 秘钥
time = html.xpath('//div[@class="login-cont"]/ul/@data-keys-time')[0] #时间戳
img = html.xpath('//img[@class="captcha"]/@src')[0]
img_url = 'https://www.yiban.cn/' + img # 图片链接
img_res = requests.get(img_url).content
flie_name = './img/VerifyCode.png' # 路径
# 保存验证码
with open(flie_name, 'wb') as f:
f.write(img_res)
print(key,time,img_url)
return key, time
拿到上面数据之后,该加密的加密,该识别的识别
import ddddocr
import requests
from lxml import etree
import execjs
from loguru import logger
logger.add("./logs/yiban.log", rotation='00:00', level="WARNING", encoding='utf-8')
session = requests.session()
headers = {
'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
}
def recognize(image):
ocr = ddddocr.DdddOcr()
with open(image, 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
return res
def spider(user,pwd):
url = 'https://www.yiban.cn/login/doLoginAjax'
key,time = get_params()
captcha = recognize('./img/VerifyCode.png') # 识别验证码
logger.debug(f'验证码:{captcha}')
with open('yiban.js','r') as f:
f_data = f.read()
js_data = execjs.compile(f_data).call('EncryptPassword',key,pwd) # js加密
logger.debug(f'密码加密:{js_data}')
data = {
'account': user,
'password':js_data,
'captcha': captcha,
'keysTime': time,
}
res = session.post(url,headers=headers,data=data).json()
logger.debug(f'结果:{res}')
时间戳后台会验证,所以要一定用session
因为我没注册账号,为了测试,随便填写的手机号,报以下错误,说明逆向思路没问题。
如果不用session,结果会怎样呢?
不多解释,不懂的,可以看下我那篇讲解session的文章,大家找一下。
import ddddocr
import requests
from lxml import etree
import execjs
from loguru import logger
logger.add("./logs/yiban.log", rotation='00:00', level="WARNING", encoding='utf-8')
session = requests.session()
headers = {
'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
}
def recognize(image):
ocr = ddddocr.DdddOcr()
with open(image, 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
return res
def get_params():
url = 'https://www.yiban.cn/login?go=https%3A%2F%2Fwww.yiban.cn%2F'
res = session.get(url,headers=headers).text
html = etree.HTML(res)
key = html.xpath('//div[@class="login-cont"]/ul/@data-keys')[0] # 秘钥
time = html.xpath('//div[@class="login-cont"]/ul/@data-keys-time')[0] #时间戳
img = html.xpath('//img[@class="captcha"]/@src')[0]
img_url = 'https://www.yiban.cn/' + img # 图片链接
img_res = requests.get(img_url).content
flie_name = './img/VerifyCode.png' # 路径
# 保存验证码
with open(flie_name, 'wb') as f:
f.write(img_res)
logger.debug(f'key:{key},key_time:{time},img_url:{img_url}')
return key, time
def spider(user,pwd):
url = 'https://www.yiban.cn/login/doLoginAjax'
key,time = get_params()
captcha = recognize('./img/VerifyCode.png')
logger.debug(f'验证码:{captcha}')
with open('yiban.js','r') as f:
f_data = f.read()
js_data = execjs.compile(f_data).call('EncryptPassword',key,pwd)
logger.debug(f'密码加密:{js_data}')
data = {
'account': user,
'password':js_data,
'captcha': captcha,
'keysTime': time,
}
res = requests.post(url,headers=headers,data=data).json()
logger.debug(f'结果:{res}')
user = '18576543215'
pwd = '######'
spider(user,pwd)