小紅書數美滑塊驗證碼JS逆向破解


數美滑塊

最近看了看數美滑塊,網上很多大佬都寫過了,有很多心得,同時也發現了一些問題。那么我們就從頭來搞一遍數美滑塊,也算是結合眾大佬的一個產出吧。

網址: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也能使用扣代碼來還原,那樣相對難一點,有需要可以交流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM