1. 程式人生 > 實用技巧 >某滑塊加密過程及逆向方法總結

某滑塊加密過程及逆向方法總結

分享一下某平臺滑塊的加密過程及逆向方法

該文章主要提供交流學習使用, 請勿利用進行不當行為

如本篇文章侵犯了貴公司的隱私,請聯絡我立刻刪除!

如因濫用解密技術而產生的風險與本人無關

滑塊在逆向的過程中會遇到很多問題,不僅僅是識別滑塊的驗證碼圖片哈~

很多驗證碼平臺都採用了相似的方式, 所以思路是相通的, 主要是各家的加密方式和加密程度不同罷了

沒有絕對完美的防禦,攻防永遠都是成本和利潤的博弈

我們先來看第一個關卡

圖片混淆

上圖中第一個圖片是伺服器傳過來的, 第二個圖片是通過演算法還原後的

驗證碼圖片通常在服務端通過一定的演算法和對應的token進行剪下和貼上, 然後在js程式碼進行canvas的還原渲染(通常使用drawImage方法)

每個語言都有自己的圖片處理庫,進行等效的剪下和貼上即可, 比如python可以採用pillow的crop和paste進行剪下和貼上的動作來還原

第一個關卡過去了之後, 我們來到了第二個關卡:

加密引數預生成

獲取驗證碼的同時, 會同時請求介面獲取一個加密字串,這個加密字串會最後的時候作為引數傳入

想要獲取這個加密字串呢, 需要先生成一個lid(此時應該有人已經猜到是哪個平臺了..),生成方法也在js中直接提取就好了,是時間戳+隨機等長的字串(用到了Math.random)

然後基於lid進行一定的封裝,加上一個固定的key和其他固定的引數,再走一下加鹽編碼即可(鹽值也是在js中寫死的)

然後進行第一次請求, 會傳回一個新的lid, 再基於這個新的lid重新封裝, 加入一些瀏覽器的屬性引數,再重新進行加鹽編碼(鹽值與上一個請求相同),然後進行第二次請求, 最終獲得加密引數:

ok~ 一切順利~ 約德爾人萬歲~

我們來到了第三個關卡:

驗證碼缺口座標破解

這裡給出三種常用的辦法:

  1. opencv識別破解

  2. 第三方打碼平臺識別破解

  3. 自己訓練模型識別破解

具體的實現這裡就不過多贅述了~ 每種方法都是可行的

好的, 那麼我們來到了最後一個關卡了:

核心加密引數生成

我們在滑動之後, 通常會觸發介面請求, 會有很多引數, 比如剛才預生成的加密引數

其中通常還會有另一個核心的加密引數,一般來說很長,其中夾雜著瀏覽器指紋, 使用者的行為軌跡,座標點等各種資訊, 同時也是加密最嚴重的引數

一般來說這個引數都有一個初始化操作, 比如這個樣子:

會把一些當前時間戳,版本號,referer, 加密版本號, token等作為引數穿進去

其中也會校驗是否使用了selenium之類的自動化工具

初始化之後呢, 到了我們的重頭戲:行為軌跡

總共收集了兩個行為軌跡

一個是使用者開始滑塊後的所有移動軌跡, 會收集到一個全域性列表裡, 然後等到最後一次性迴圈觸發

一個是使用者的各種滑鼠鍵盤事件,滑鼠移動事件觸發的間隔事件較長

這裡可以人為收集幾次成功的行為軌跡,分析一下對方的行為軌跡演算法,然後模擬生成即可, 生成之後的行為軌跡大概準確率有80%以上吧, 需要注意兩個地方:

  1. 過程中採用了大量的隨機值, 對方的模型也會檢測是否足夠隨機, 所以, 需要加入各種random來微調座標

  2. 軌跡事件傳入的時候也會傳入時長,兩個行為軌跡的時長是有關聯的, 對方的模型也會檢測兩個行為軌跡之間的關聯性

只要注意這兩點, 相信你也可以寫出一個足夠擬真的更好的行為軌跡生成器~

OK,準備工作已經做好了, 只要呼叫介面傳引數即可:

最後的準確率大概在50%左右吧, 其實還有一定的優化空間~

另外多說一句,js程式碼通常會做不同程度的混淆, 您可以採用正則替換,ast反混淆, 直接硬懟等方式解決~