文章目录
前言
声明:
仅供学习交流。如若侵权,请联系删除。
练习网址: aHR0cHM6Ly9wYXNzcG9ydC5mYW5nLmNvbS8=
一、明确需求
1.首先明确需求,过滑块需要逆向的参数。如下图所示,分别是start,end,i,t,gt,challenge,其它值大概率是固定。
2.明确完需要逆向的参数后,接下来找,抓包全局搜索搜一下gt的值,发现是由这个数据包返回的gt和challenge。经过对比,第一张图的gt和challenge参数就是这个数据报的返回值。接下来看别的参数。
3.通过堆栈,找其它参数,我们从第一个堆栈点进去下断点,接下来就是细心找参数生成的地方
这里发现这个r是已经加密过后的,继续往上跟
到这里你会看到参数加密的位置,首先看下start和end怎么来的,看下L,看着像滑动轨迹,往上找一找,看到mouseup等关键字,打断点,进入d函数能看到最后是mouseup,应该是你手动滑动鼠标松开的那个时间点,end的值就是这个mouseup的时间戳。
4.伪造轨迹
get_slider_track(distance)这个函数伪造轨迹 distance就是你识别的缺口坐标,可以用cv2或者ddddocr识别。效果如下图
4.接下来看i参数和t参数
copy一下i参数生成逻辑这一块代码放到node.js执行下,缺啥补啥 里面的n定义 我们直接用浏览器里的环境
然后经过x.compress()处理,得到i参数
5.剩最后一个t参数同样的方法缺啥补啥,t参数效果图如下
二、验证参数
1.引入库
代码如下(示例):
import random
import re
import time
import execjs
import requests
import logging
import ddddocr
2.对滑块进行请求
完整代码如下(示例):
def get_slider_track(distance):
track = []
start = {
'x': 0,
'y': 300,
't': int(time.time()*1000),
'e': 'mousedown'
}
track.append(start)
x,y,t = start['x'],start['y'],start['t']
while distance >= x:
x += random.choices([0, 1, 2], weights=[0.3, 0.4, 0.3], k=1)[0]
y -= random.choices([0, 1, 2], weights=[0.3, 0.4, 0.3], k=1)[0]
t += random.randint(0, 20)
track.append({
'x': x,
'y': y,
't': t,
'e': 'mousemove'
})
end = {
'x': x,
'y': y,
't': t + 30,
'e': 'mouseup'
}
track.append(end)
return track
#滑块
url = url
response_img = requests.post(url, headers=headers)
gt = response_img.json()['gt']
challenge = response_img.json()['challenge']
logger.info(f'获取参数gt:{gt}\tchallenge:{challenge}')
#获取js文件
params2 = {
"c": "index",
"a": "getType",
"gt": gt,
"challenge": challenge ,
"time": time.time()*1000,
"callback": "fangcheck_1715062955718",
"_200226": ""
}
r2 = requests.get(url, headers=headers, params=params2)
#获取滑块图片
params3 = {
"c": "index",
"a": "jigsaw",
"gt": gt,
"challenge": challenge,
"callback": "fangcheck_1714978340942",
"_200226": ""
}
baseurl = url
response_url = requests.get(url, headers=headers, params=params3)
bg_url = baseurl + re.findall('"url":"(.*?)",',response_url.text)[0]
tp_url = baseurl + re.findall('"surl":"(.*?)"',response_url.text)[0]
bg = requests.get(url=bg_url,headers=headers).content
tp = requests.get(url=tp_url,headers=headers).content
with open('./backgroundImg.png','wb') as f,open('./sliderImg.png','wb') as f1:
f.write(bg)
f1.write(tp)
#识别图片
det = ddddocr.DdddOcr(det=False,ocr=False,show_ad=False)
with open('sliderImg.png', 'rb') as f:
target_bytes = f.read()
with open('backgroundImg.png', 'rb') as f:
background_bytes = f.read()
res = det.slide_match(target_bytes, background_bytes, simple_target=True)
print(res)
# 轨迹
slide_track = get_slider_track(sliend)
start = slide_track[0]['t']
end = slide_track[len(slide_track)-1]['t']
i = execjs.compile(open('./房天下i参数.js','r',encoding='utf-8').read()).call('return_i')
t = execjs.compile(open('./房天下t参数.js','r',encoding='utf-8').read()).call('return_t',slide_track)
#验证滑块
params = {
"c": "index",
"a": "codeDrag",
"start": start,
"end": end,
"i": i,
"t": t,
"gt": gt,
"challenge": challenge,
"callback": "fangcheck_1715061680163",
"_200226": ""
}
r4 = requests.get(url,headers=headers, params=params)
print(r4.text)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8d19c0cf884c4df1b5b29b80bc1f7719.png)
最终效果图
总结
写本文的目的是巩固,学习交流。记录搬砖的那些日子。