某滑塊加密過程及逆向方法總結
分享一下某平臺滑塊的加密過程及逆向方法
該文章主要提供交流學習使用, 請勿利用進行不當行為
如本篇文章侵犯了貴公司的隱私,請聯絡我立刻刪除!
如因濫用解密技術而產生的風險與本人無關
滑塊在逆向的過程中會遇到很多問題,不僅僅是識別滑塊的驗證碼圖片哈~
很多驗證碼平臺都採用了相似的方式, 所以思路是相通的, 主要是各家的加密方式和加密程度不同罷了
沒有絕對完美的防禦,攻防永遠都是成本和利潤的博弈
我們先來看第一個關卡
圖片混淆
上圖中第一個圖片是伺服器傳過來的, 第二個圖片是通過演算法還原後的
驗證碼圖片通常在服務端通過一定的演算法和對應的token進行剪下和貼上, 然後在js程式碼進行canvas的還原渲染(通常使用drawImage方法)
每個語言都有自己的圖片處理庫,進行等效的剪下和貼上即可, 比如python可以採用pillow的crop和paste進行剪下和貼上的動作來還原
第一個關卡過去了之後, 我們來到了第二個關卡:
加密引數預生成
獲取驗證碼的同時, 會同時請求介面獲取一個加密字串,這個加密字串會最後的時候作為引數傳入
想要獲取這個加密字串呢, 需要先生成一個lid(此時應該有人已經猜到是哪個平臺了..),生成方法也在js中直接提取就好了,是時間戳+隨機等長的字串(用到了Math.random)
然後基於lid進行一定的封裝,加上一個固定的key和其他固定的引數,再走一下加鹽編碼即可(鹽值也是在js中寫死的)
然後進行第一次請求, 會傳回一個新的lid, 再基於這個新的lid重新封裝, 加入一些瀏覽器的屬性引數,再重新進行加鹽編碼(鹽值與上一個請求相同),然後進行第二次請求, 最終獲得加密引數:
ok~ 一切順利~ 約德爾人萬歲~
我們來到了第三個關卡:
驗證碼缺口座標破解
這裡給出三種常用的辦法:
-
opencv識別破解
-
第三方打碼平臺識別破解
-
自己訓練模型識別破解
具體的實現這裡就不過多贅述了~ 每種方法都是可行的
好的, 那麼我們來到了最後一個關卡了:
核心加密引數生成
我們在滑動之後, 通常會觸發介面請求, 會有很多引數, 比如剛才預生成的加密引數
其中通常還會有另一個核心的加密引數,一般來說很長,其中夾雜著瀏覽器指紋, 使用者的行為軌跡,座標點等各種資訊, 同時也是加密最嚴重的引數
一般來說這個引數都有一個初始化操作, 比如這個樣子:
會把一些當前時間戳,版本號,referer, 加密版本號, token等作為引數穿進去
其中也會校驗是否使用了selenium之類的自動化工具
初始化之後呢, 到了我們的重頭戲:行為軌跡
總共收集了兩個行為軌跡
一個是使用者開始滑塊後的所有移動軌跡, 會收集到一個全域性列表裡, 然後等到最後一次性迴圈觸發
一個是使用者的各種滑鼠鍵盤事件,滑鼠移動事件觸發的間隔事件較長
這裡可以人為收集幾次成功的行為軌跡,分析一下對方的行為軌跡演算法,然後模擬生成即可, 生成之後的行為軌跡大概準確率有80%以上吧, 需要注意兩個地方:
-
過程中採用了大量的隨機值, 對方的模型也會檢測是否足夠隨機, 所以, 需要加入各種random來微調座標
-
軌跡事件傳入的時候也會傳入時長,兩個行為軌跡的時長是有關聯的, 對方的模型也會檢測兩個行為軌跡之間的關聯性
只要注意這兩點, 相信你也可以寫出一個足夠擬真的更好的行為軌跡生成器~
OK,準備工作已經做好了, 只要呼叫介面傳引數即可:
最後的準確率大概在50%左右吧, 其實還有一定的優化空間~
另外多說一句,js程式碼通常會做不同程度的混淆, 您可以採用正則替換,ast反混淆, 直接硬懟等方式解決~