文章目录
- 概要
- 整体架构流程
- 小结
概要
提示:仅供学习,不得用做商业交易,如有侵权请及时联系
逆向:某组织服务平台(滑块验证)
URL:aHR0cHM6Ly94eGdzLmNoaW5hbnBvLm1jYS5nb3YuY24vZ3N4dC9uZXdMaXN0
目的:滑块验证
点击搜索,触发滑块验证
整体架构流程
提示:分析-调试-猜想-实现-执行
一、获取滑块图片信息:
由于图片是base64形式,所以我们需要通过base64将图片转换:
bgImgBs64 = base64.urlsafe_b64decode(bgImgBs64)
slImgBs64 = base64.urlsafe_b64decode(slImgBs64)
关于识别滑块滑动的距离,直接上代码:
import requests,cv2
import numpy as np
def identify_gap(bg, tp):
"""
bg: 背景图片
tp: 缺口图片
out: 输出图片
"""
# 读取背景图片和缺口图片
bg_img = cv2.imdecode(np.frombuffer(bg, np.uint8), cv2.IMREAD_GRAYSCALE)
tp_img = cv2.imdecode(np.frombuffer(tp, np.uint8), cv2.IMREAD_GRAYSCALE) # 缺口图片
yy = []
xx = []
for y in range(tp_img.shape[0]):
for x in range(tp_img.shape[1]):
r = tp_img[y, x]
if r < 200:
yy.append(y)
xx.append(x)
tp_img = tp_img[min(yy):max(yy), min(xx):max(xx)]
# 识别图片边缘
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)
# 转换图片格式
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
# 缺口匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
# # 绘制方框
th, tw = tp_pic.shape[:2]
tl = max_loc # 左上角点的坐标
br = (tl[0] + tw, tl[1] + th) # 右下角点的坐标
cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
cv2.imwrite('distinguish.jpg', bg_img) # 保存在本地
# 返回缺口的X坐标
print(f'value: {tl[0]}')
return max_loc[0]
将a,b参数提取出来,后面需要用到
二、逆向加密参数
通过启动器断点,然后往上跟栈,找到加密参数:
这里a的值是通过滑块滑动距离进行的rsa加密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
def RsaEncrypt(plaintext):
key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCsYUGHMhjSzdMqn9JzPfKs9JbxXTPtHofTv7reV0HrEz4brnE6ZJpNn5s934KO3L4QDF7ELHysIiounhhpF1bewW9jKdcpZA5M1CkGHKcwpLA2liaqOlt/0Mf3ui9jxR9AHxUMFVGfJ6Q4+cEmDBUAEOXlxqk4ZjGpubwGNk9XQIDAQAB"
key_bytes = base64.b64decode(key)
public_key = RSA.importKey(key_bytes)
cipher = PKCS1_v1_5.new(public_key)
bits_len = int(public_key.size_in_bits() / 1024 * 100)
ciphertext = b""
for i in range(0, len(plaintext), bits_len):
ciphertext += cipher.encrypt(plaintext[i: i + bits_len].encode())
result = base64.b64encode(ciphertext).decode('utf-8')
return result
this.encodedata加密我们直接跳进去看看发现就是一段自写的js
# a,b,c参数加密
def encodedata(str):
js = '''
var h = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function encodedata(t) {
var a, i, e, s, n, l = "", c = "", o = "", r = 0;
do {
e = (a = t.charCodeAt(r++)) >> 2,
s = (3 & a) << 4 | (i = t.charCodeAt(r++)) >> 4,
n = (15 & i) << 2 | (c = t.charCodeAt(r++)) >> 6,
o = 63 & c,
isNaN(i) ? n = o = 64 : isNaN(c) && (o = 64),
l = l + h.charAt(e) + h.charAt(s) + h.charAt(n) + h.charAt(o),
a = i = c = "",
e = s = n = o = ""
} while (r < t.length);
return l
}
'''
result = execjs.compile(js).call('encodedata',str)
return result
三、验证滑块
最后赋上结果图:
小结
提示:学习交流群:v:wzwzwz0613拉进群