
宣告
本文章中所有內容僅供學習交流使用,不用于其他任何目的,不提供完整代碼,抓包內容、敏感網址、資料介面等均已做脫敏處理,嚴禁用于商業用途和非法用途,否則由此產生的一切后果均與作者無關!
本文章未經許可禁止轉載,禁止任何修改后二次傳播,擅自使用本文講解的技術而導致的任何意外,作者均不負責,若有侵權,請在公眾號【K哥爬蟲】聯系作者立即洗掉!
逆向目標
- 目標:某驗三代、四代點選類驗證碼(文字、字序、圖示、九宮格)逆向分析
- 三代主頁:
aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vc2hvdw== - 四代主頁:
aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v
通訊流程
介面相關:

完整流程:

三代抓包情況
通過抓包發現,register-click-official 介面會回傳 challenge 和 gt 值,為 get.php 介面的關鍵請求引數:

get.php 會回傳 c 和 s,同樣后面會用到,這個介面的 w 值與三代無感不同,可以置空:

點擊按鈕進行驗證,會彈出文字點選框,此時抓包到第一個 ajax.php 介面,雖然只回傳了驗證碼型別,沒什么關鍵引數,但是不請求會報錯,點擊文字進行驗證后,抓到第二個 ajax.php 介面,回傳驗證結果及 validate 引數的值,該值登錄介面會用到:

三代逆向分析
w 引數逆向
從 ajax.php 介面處跟堆疊或者直接搜索特征碼 "\u0077" 即可定位到 w 引數值生成的位置,位于 click.3.0.7.js 檔案的第 5839 行:

p + l = w,關鍵代碼:
var l = n[$_CACJJ(716)]()
, h = X[$_CADAG(338)](ae[$_CACJJ(130)](o), n[$_CADAG(711)]())
, p = w[$_CADAG(776)](h)
先來看看 l 引數,跟到 n[$_CACJJ(716)] 中去,this[$_CBFJA(711)](e) 為十六位隨機字串,跟到 this[$_CBFJA(711)] 中將演算法扣下來即可:

因此 t 是將十六位隨機字串加密后得到的,這里為 RSA 加密,從原型鏈中跟進去即可找到公鑰和模值,將代碼扣下來或者直接用庫都行,至此 l 值分析完了,接下來是 h 值,n[$_CADAG(711)]() 同樣是十六位隨機字串,h 引數的加密方法為 X[$_CADAG(338)],跟進去打斷分析會發現是 AES 加密,初始向量 iv 為 0000000000000000:

o 值的關鍵引數如下:
- passtime:圖片加載時間
- a:點選文字位置
- pic:背景圖片鏈接
- tt:將 c、s、滑鼠資訊等進行加密,某些值可以固定,加密方法直接扣下來即可
h9s9: "1816378497":該鍵值對每天變化,扣法往期文章講過- rp:將 gt、challenge、passtime 經過 MD5 加密
將 h 經過 w[$_CADAG(776)] 方法加密后得到 p,跟進去扣下來即可,三代圖示、語序除了 a 的寫法,其他邏輯都是一樣的,
結果驗證

四代抓包情況
抓包,load 介面回傳值如下:

- captcha_type:驗證碼型別,文字點選為 word
- gct_path:gct4 檔案路徑
- lot_number:生成 pow_msg、w 的關鍵引數
- pow_detail:bits、datetime、hashfunc 都與 w 引數有關
- payload:verify 請求引數
- process_token:verify 請求引數
- ques:各文字圖片的鏈接
點擊驗證后,verify 介面回傳校驗結果及 login 請求引數:

- result:校驗結果,成功即 success,失敗為 fail
- captcha_id:驗證碼 id
- captcha_output:login 請求引數
- gen_time:login 請求引數
- lot_number:login 請求引數
- pass_token:login 請求引數
login 介面驗證登錄成功則回傳:

四代逆向分析
w 引數
與三代文字點選一樣,四代的 w 引數同樣直接搜索 "\u0077" 即可定位到,r 為 w 引數的值:

r 引數定義在第 6096 行,內容如下:
var r = (0, d[$_CBHIU(47)])(f[$_CBHHP(47)][$_CBHIU(541)](e), i)
跟進到 d[$_CBHIU(47)] 中,(0, d[$_DIEHV(186)])(c) + u 即 w 值:

u 定義在第 11461 行:
u = new l[($_DIEIo(47))]()[$_DIEIo(1443)](i)
由上可知,u 是將 i 經過加密后得到的值,i 定義在上面一行,跟進去會發現是十六位隨機字串,u 的加密方式為 RSA,公鑰和模值如下,將加密演算法扣下來或者直接用庫都可:

(0, d[$_DIEHV(186)])(c) 是將 c 進行了加密處理,c 定義在第 11462 行:
var c = s[a][$_DIEIo(1488)][$_DIEIo(1443)](e, i);
i 上文講了,為十六位隨機字串,e 中 device_id、lot_number 由 load 介面回傳,userresponse 為點選坐標,pow_msg 為 "1|0|md5|" + datetime + "|" + captcha_id + "|" + lot_number + "||" + 16位亂數,pow_msg 經過 MD5 加密即為 pow_sign,"f019":"1024281898" 為動態變化的鍵值對,在往期四代滑塊的文章中均有詳細介紹,其他值固定即可:

接下來跟進到 s[a][$_DIEIo(1488)][$_DIEIo(1443)] 中,c 為 AES 加密,扣代碼或者直接用庫:

四代圖示、字序、九宮格除了 userresponse 的寫法,其他邏輯都是一樣的,
結果驗證


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/548704.html
標籤:Python
