數美滑塊
最近看了看數美滑塊,網上很多大佬都寫過了,有很多心得,同時也發現了一些問題。那么我們就從頭來搞一遍數美滑塊,也算是結合眾大佬的一個產出吧。
網址:https://www.ishumei.com/trial/captcha.html
1、首先進入網站抓包
請求register注冊信息,我們能從中獲取到滑塊圖片信息,計算出滑動距離
2、驗證信息
滑動滑塊,查看包信息,可以看到會有一個fverify的驗證信息,如果正確的話riskLevel返回值為PASS,失敗為REJECT
查看一些加密參數信息,參數很多,主要難點應該就是扣這個加密了
3、加密參數分析
進入堆棧打上斷點,再次滑動滑塊,網站斷住,很好,向上查找堆棧,倒數第二個堆棧上打上斷點,因為此處看到了參數中的"aw"等參數,斷開之前的斷點,重新滑動
此時已經斷住了,在此處進行參數賦值,重新打上斷點,分析加密
進入函數后在函數return結尾打上斷點,運行,可以看到DES字樣,初步判定為DES加密
網上找了一段DES加密的實現驗證一下
import base64
import random
import time
from pyDes import des, ECB
def pad(b):
"""
塊填充
"""
block_size = 8
while len(b) % block_size:
b += b'\0'
return b
def get_encrypt_content(message, key, flag):
"""
接口參數的加密、解密
"""
des_obj = des(key.encode(), mode=ECB)
if flag:
content = pad(str(message).replace(' ', '').encode())
return base64.b64encode(des_obj.encrypt(content)).decode('utf-8')
else:
return des_obj.decrypt(base64.b64decode(message)).decode('utf-8')
與網站加密結果一致,判定為DES加密,分析幾次滑動參數發現,有很多固定值。變化的值只有nm、dy、rid(從注冊函數獲取)、dl
分析他們得來源,再次回到第一個斷點,發現來源
對來源進行分析,可以找到參數賦值函數
進入函數在return打上斷點,重新滑動
此處就是slide對應得加密參數,分析下nm、dy、dl參數
dl: 滑動距離
nm: 滑動軌跡 數組信息分別為x,y,t的值
dy: 滑動時間,可通過滑動軌跡的t獲取
那么最后的問題就是兩點:
1、獲取滑動距離
2、生成滑動軌跡
1、滑動距離獲取(給出對應的url就行)
def get_distance(fg, bg):
"""
計算滑動距離
"""
r = requests.get(fg_url, verify=False)
fg = BytesIO(r.content)
r = requests.get(bg_url, verify=False)
bg = BytesIO(r.content)
target = cv2.imdecode(np.asarray(bytearray(fg.read()), dtype=np.uint8), 0)
template = cv2.imdecode(np.asarray(bytearray(bg.read()), dtype=np.uint8), 0)
result = cv2.matchTemplate(target, template, cv2.TM_CCORR_NORMED)
_, distance = np.unravel_index(result.argmax(), result.shape)
return distance
2、滑動軌跡生成(建議自己去百度)
def get_random(distance):
'''
# 滑動軌跡模擬、上下的抖動
:param distance:
:return:
'''
ge = []
ge.append([0, 0, 0])
for i in range(10):
x = 0
y = random.randint(-1, 1)
t = 100 * (i + 1) + random.randint(0, 2)
ge.append([x, y, t])
for items in ge[1:-5]:
items[0] = distance // 2
for items in ge[-5:-1]:
items[0] = distance + random.randint(1, 4)
ge[-1][0] = distance
return "{}".format(ge).replace(" ", ""), ge[-1][2]
此后所需要的就是使用DES加密了。
4、結果展示
成功率81%,滑動軌跡還是得優化,以上DES也能使用扣代碼來還原,那樣相對難一點,有需要可以交流。