天天看點

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

作者:K哥爬蟲
【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

聲明

本文章中所有内容僅供學習交流使用,不用于其他任何目的,不提供完整代碼,抓包内容、敏感網址、資料接口等均已做脫敏處理,嚴禁用于商業用途和非法用途,否則由此産生的一切後果均與作者無關!

本文章未經許可禁止轉載,禁止任何修改後二次傳播,擅自使用本文講解的技術而導緻的任何意外,作者均不負責,若有侵權,請在公衆号【K哥爬蟲】聯系作者立即删除!

逆向目标

  • 目标:某度滑塊驗證碼、點選驗證碼、旋轉驗證碼,v1、v2 逆向分析
  • v1 旋轉驗證碼:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS90dXhpbmcuaHRtbD9haz0zM2M0ODg4NGI3ZGY4M2Q0MjMwZTA3Y2JjZDBkMDdmZCZiYWNrdXJsPWh0dHBzJTNBJTJGJTJGYWlxaWNoYS5iYWlkdS5jb20mdGltZXN0YW1wPTE2MzE0MzQ0MjUmc2lnbmF0dXJlPWM2ODRhODJiNzk4MjAyOTg3NWJmZDhlMGE2NjBiNzdm           
  • v2 旋轉驗證碼:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS90dXhpbmcuaHRtbD8mYWs9YzI3YmJjODlhZmNhMDQ2MzY1MGFjOWJkZTY4ZWJlMDY=           
  • v2 滑塊驗證碼:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS90dXhpbmcuaHRtbD8mYW1wO2FrPWMyN2JiYzg5YWZjYTA0NjM2NTBhYzliZGU2OGViZTA2           
  • v2 點選驗證碼:
aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS92Ni9nZXRQYXNz           

PS:v1、v2 是作者自己為了區分而命名的版本号,主要依據是核心 JS 檔案分為 mkd.js 和 mkd_v2.js 兩個版本,如下圖所示:

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

此外,在界面上也有所差別,v2 版本的旋轉、滑塊圖檔有很明顯的陰影、線條幹擾,如下圖所示:

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

上面給的位址中,點選驗證碼的位址有時候是點選,有時候會變成旋轉,估計是異常等級不同導緻的,此外,傳聞還有一種無感驗證,不過作者到處找也沒找到個位址,估計邏輯都是差不多的,無感驗證如下圖所示:

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

抓包分析

以下以 v1 旋轉驗證碼為例(v2 接口名稱不一樣,但邏輯是一樣的),第一次 viewlog 接口,請求的 ak 是固定值,當然不同場景不同網站是不一樣的,callback 回調值,_ 時間戳,傳回值 as、tk 都是後面會用到的。

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析
【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

然後是一個 getstyle 接口,其中的 tk 就是前面 viewlog 接口傳回的,傳回值裡 backstr 後續參數加密會用到,img 就是旋轉圖檔位址,info 是一些版權資訊。

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析
【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

旋轉驗證碼開始驗證,此時第二次出現 viewlog 接口,as 和 tk 參數是第一次 viewlog 傳回的,fs 參數需要我們逆向,包含了旋轉角度等資訊,如果旋轉角度正确且參數沒問題,則傳回值裡的 op 為 1,另外傳回的 ds 和 tk 後續還會用到。

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析
【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

上一步驗證走完後,并不意味着通過驗證了,後續還會有一個 viewlog/c 的接口需要進一步驗證,其中的 tk、ds 參數就是上一步傳回的,如果驗證失敗,傳回值 code 為 1,驗證成功,code 則為 0。

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析
【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析
【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

逆向分析 fs

接下來分析主要加密參數 fs,跟棧到 mkd.js:

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析
【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

可以看到 o 就是 fs,而 o 又是 r.rzData 經過加密後得到的,輸出一下 r.rzData,結構如下圖所示:

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

重要參數:

  • ac_c:一看就知道和旋轉的角度有關;
  • backstr:getstyle 接口傳回的;
  • cl:x,y 坐标以及時間戳,量一下就知道這個坐标是滑鼠點選下面那個滑動條按鈕的時候的坐标;
  • mv:滑鼠軌迹,滑鼠動一下就記錄一下坐标和時間戳;
  • cr:螢幕長寬高等資訊;
  • 其他值都是空或者0。

實際測試,cl 和 mv 都不校驗,寫死或者置空都行,當然想要自己僞造一下也是可以的,量一下滑動按鈕在螢幕中的位置,cl 根據這個位置随機生成就行了。重點看看 ac_c,直接搜尋即可定位:

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析
【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

可以看到這個值的計算方法為 parseFloat(o / a).toFixed(2),a 是定值 212,實際上就是滑動條能夠滑動的最大長度,o 是滑動的距離,如果我們識别出來的是旋轉角度 angle,則 ac_c 計算方法如下:

var o = angle * 212 / 360
var ac_c = parseFloat(o / 212).toFixed(2)

// 也可以直接寫成:
var ac_c = parseFloat(angle / 360).toFixed(2)           

r.rzData 搞定後,就隻有個 r.encrypt() 方法了,直接跟進去就是我們熟悉的 AES 算法,其中 iv 是 viewlog 接口傳回的 as 值加上一個定值 appsapi0,其他就不用多說了。至此加密參數就搞完了,還是非常簡單的。

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析
【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

旋轉角度識别

這裡推薦一個國外大佬的 RotNet 項目,可以用于預測圖像的旋轉角度以糾正其方向,還有基于此項目開發的,Nanda 大佬的 RotateCaptchaBreak、另一個大佬的 rotate-captcha-crack 等,連結如下:

  • https://github.com/d4nst/RotNet
  • https://github.com/chencchen/RotateCaptchaBreak
  • https://github.com/Starry-OvO/rotate-captcha-crack

深度學習大佬可以基于這些項目進一步訓練,像我這種對這方面一竅不通的當然是選擇打碼平台了,雲碼打碼還不錯,隻不過官網隻放出了 v1 版本沒有陰影幹擾的,找他們客服可以拿到 v2 版本有陰影幹擾的類型,這裡就不多說了,免得被認為是打廣告了哈哈哈。

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

v2 版本分析

v2 版本和 v1 版本基本上差不多,差別在于 rzData 的結構不太一樣,ac_c 的計算方法不一樣,以及 AES 的 IV 不一樣,先看 AES 的 IV,v2 版本是 as 值加上固定值 appsapi2:

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

然後再看看 rzData,common 字段下基本上就是 v1 的 rzData 的格式,captchalist 下,至少有 spin-0(旋轉)、`puzzle-0(滑塊)、click-0(點選)三種,ac_c 依舊是旋轉角度占比、滑動占比以及點選坐标資訊,其他的依舊是寫死或者置空就行。

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

然後就是 ac_c 的計算方法了,首先是旋轉驗證碼,直接搜尋 ac_c:

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

往上跟棧,有個 percent 的地方,一個三目表達式,e 是固定值 290,e - 52 = 238,238 也就是滑動條能夠滑動的最大長度:

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

如果我們識别出來的是旋轉角度 angle,則 ac_c 計算方法如下:

var distance = angle * 238 / 360
var ac_c = Number((distance / (290 - 52)).toFixed(2))

// 也可以直接寫成:
var ac_c = Number((angle / 360).toFixed(2))           

而對于滑塊驗證碼就有所不同,同樣是這個地方的三目表達式,但是要走後面的邏輯:

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

如果我們識别出來的是滑動距離 distance,則滑塊 ac_c 的計算方法如下:

var ac_c = Number((distance / 290).toFixed(2))           

同樣對于點選驗證碼來說,也不一樣,ac_c 的值是點選的 xy 坐标以及時間戳:

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

其他問題

前面我們說了百度的驗證應該有兩次,對于第二次驗證,也就是 v1 的 viewlog/c 接口,v2 的 cap/c 接口,即便你第一次校驗通過了,這個 c 接口校驗也有可能不通過,出現這種情況的原因是通過的時間太短了,随機 time.sleep 1-3 秒即可,如果時間太短,c 接口可能會報以下驗證錯誤:

{'code': 1, 'isRectified': False, 'msg': 'Verification Failed'}           

還有一種情況就是提示存在安全風險,請再次驗證,出現這種情況你會發現去浏覽器手動滑也是一樣的,是以在本地加個再次驗證的邏輯就行了,一般來說第二次驗證就能通過。

{'code': 0, 'msg': 'success', 'data': {'f': {'feedback': 'https://www.baidu.com/passport/ufosubmit.html', 'reason': '存在安全風險,請再次驗證'}}}           

然後就是請求 header 裡沒有 Referer 或者 Referer 不正确的話,會報錯:

// v1 沒有 Referer
{'code': 1, 'msg': 'Unregistered Host'}
// v1 Referer 不正确
{'code': 1, 'msg': 'Invalid Request', 'data': []}
// v2 沒有 Referer 或者 Referer 不正确
{'code': 100600, 'msg': 'Unauthorized Host'}           

還有一個小技巧,如果你想自己驗證一下旋轉的角度對不對,怎麼去測量這個角度呢?我們可以借助一些做圖軟體,簡單點兒的比如美圖秀秀,建立一個畫布,然後直接将驗證碼圖檔拖進去,就可以自由旋轉了,旋轉的時候軟體會自動标注出旋轉的角度,如下圖所示:

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

結果驗證

【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析
【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析
【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析
【驗證碼逆向專欄】某度滑塊、點選、旋轉驗證碼 v1、v2 逆向分析

爬蟲工具站

K哥新上線了一個爬蟲工具站,歡迎測試:https://www.kgtools.cn/

!!!粉絲回饋!!!

為慶祝K哥爬蟲公衆号原創内容破百,粉絲數過萬,特舉辦粉絲回饋活動!

感謝快代理對本次活動的大力支援!

活動規則

  1. 關注K哥爬蟲公衆号
  2. 于公衆号本文評論區發表評論,搖号抽出幸運粉絲
  3. 禁止重複評論

活動獎品

一等獎: 快代理包月套餐 + 知識星球 + K哥爬蟲定制馬克杯 (1名)

二等獎: 快代理包周套餐 + 知識星球 + K哥爬蟲定制馬克杯 (3名)

三等獎: K哥爬蟲定制馬克杯 (5名)

四等獎: 現金紅包 6.6 (10名)

活動時間

活動開始時間:2023年7月7日

活動截止時間:2023年7月14日

開獎時間:2023年7月17日