javascript
【瑞数5】浅谈某普期刊JS逆向的环境检测点
【瑞數5】淺談某普期刊JS逆向的環境檢測點
- 前言
- JS加載流程
- 第一個JS
- 第二個JS
- 第三個JS
- AST簡單解混淆
- 環境檢測
- 前奏
- 異步執行JS流程
- 高潮
- 運行結果
- 總結
- 鳴謝
前言
這幾天把某期刊的rs5環境檢測看差不多了,所以寫篇文章簡單聊下rs5會檢測到的一些環境。我所用的方法基于瀏覽器“沙箱”的,可以做到邊調試邊補環境。
如果有想看算法運行邏輯的同學,出門左轉看十一姐的文章。
RPC方案可以看看這個視頻(陳不不大佬出品)。
PS:我菜所以不會分析算法邏輯…
本文以某普期刊的高級檢索接口作為示例,地址:aHR0cDovL3Fpa2FuLmNxdmlwLmNvbS9RaWthbi9TZWFyY2gvQWR2YW5jZT9mcm9tPWluZGV4
JS加載流程
第一步當然是,輸入網址,F12,打上script斷點調試,回車!
訪問網頁先是返回一個這樣的html代碼,而不是維普首頁的內容。并返回給我們一個Cookie,GW1gelwM5YZuS=xxxxxx。玩過某數都知道,我們需要在這個頁面得到一個GW1gelwM5YZuT參數,然后寫在cookie中,再次訪問網址,即可得到首頁的內容。
第一個JS
第一個JS是生成$_ts參數。我建議大家先copy一份源代碼以供后續本地調試。
然后這個JS的鏈接是在html頁面里的,用正則可以很快的匹配到。
第二個JS
我們點擊跳過斷點,進入第二個JS。JS在$_ts里push很多參數,供后續使用。這個JS也是比較重要的,然后這個JS是在html頁面里的,是一個閉包函數。JS運行結束時會用eval函數進入第三個JS。
然后html標簽的meta,它的content參數,后續也是有使用到的。
第三個JS
這里就是eval函數入口。我們直接搜索]](_$ 字符串就能很快定位到這里了。打上斷點看一下。沒做過的同學可以自己試試各種方法去找到這里哈,博主用了hook cookie的方式找到了這里,貼上hook代碼(直接從v神插件里偷代碼,大佬的代碼用起來就是舒服,嘿嘿~)。
- 可以看到_$ya就是第三個JS了,并且這里的 $_ts已經init完成了。
- 這時候,我把3份JS都保存到本地了,供后續本地調試。
- 本地調試的時候,可以把入口注釋掉,然后手動eval 格式化好的代碼,這樣調試會更輕松一些。
- 博主這邊不依賴Node環境,使用vm2模塊構建沙箱進行調試,然后Promise需要手寫,否則V8運行會報錯。
AST簡單解混淆
第三份JS是重點需要調試并且查看代碼是如何檢測環境的。我們可以用AST簡單的脫個混淆。我是直接在調試的時候把這個數組值的拿出來,然后用AST直接匹配替換(這個混淆數組是由一個函數得到的,這里就不放出來了,很好找到)。效果如圖~
環境檢測
前奏
前奏是指上述3個js執行完畢之后,會得到一個比較短的cookie(是可以直接訪問的首頁,檢測比較松),以及三個環境值,在localStorage里,分別是 nd、cDro、YWTU
這部分的dom檢測比較松,沒什么坑,很容易補出來。
這里它創建了一個div節點,并使用了div.getElementsByTagName(“i”)方法獲取了一個值。不懂的同學可以去菜鳥教程里看看,或者在瀏覽器里輸入這些代碼查看返回值等。 并且還檢測了msCrypto以及ActiveObject。
每次調用xhr的open方法時,都會走向這里。他創建了一個a 標簽,并對a標簽href進行賦值。這里有做參數值校驗,并和location里的參數進行比對,但是是有差異的,如果有問題會導致后面搜索接口里的得到的拼接url錯誤。
我們去瀏覽器hook下 createElement 這個方法,然后進到這個地方的代碼看下a標簽下的 href、pathname 等參數,將環境補的一模一樣即可。
用 dir(標簽a) 就能得到標簽下的值了,下圖是a標簽下的值
與 location下的值還是有差異的,這里是有用的,對應的值必須要補的完全一樣,然后這里其實有個小細節,通過對a標簽的href進行賦值,a標簽下的host hostname 等一些參數也會根據href的值來進行賦值,然后rs6也是有檢測這個標簽的。
這里就是使用了document.getElementsByTagName方法獲取到了html頁面里 meta 節點,得到了content參數,然后把這個節點刪除掉了。
這里是把頁面上 head下的所有script節點全部刪除
檢測了document.documentElement.style
頁面上還有2個這樣的函數,是在script節點下的,別漏掉了。這里的方法會再頁面write一個節點出來,并刪除所有script節點。
write了一個節點,若沒有body節點,則會創建body節點并在body節點下加入一個子節點。
在這里獲取他的名字 and 值
rs5 檢測了location document navigator 等重要環境值,以及原型鏈toString檢測。當我們使用代理(proxy)的時候(自行百度,不做介紹),就能監測到他使用了哪些環境變量。這里就不一一列舉了,偏多~ 但是必須一致,否則會導致運行軌跡變化。
異步執行JS流程
前奏部分執行完畢后,開始異步執行最后的JS。這部分是得到localStorage里的 ff、f0 、f1 、fh1 環境變量,最后得到完整的cookie, 長度位279位。
下面是前奏的JS代碼中,添加的一些異步方法(巨坑!!)
這里檢測了navigator.getBattery方法,然后navigator.getBattery()后異步執行_$mg方法。
這里就是_$mg方法執行過程中會調用的一個地方,這里的 sy 再后續會用到,這里的level是一個環境值。Ap是BatteryManager。
然后是window.addEventListener 添加類型為 load 的監聽事件,一共7個,在這過程中就有用到上面提到的 sy 參數, 若為undefined,就會導致JS運行軌跡變化。 異步執行方法的順序需要注意!
然后再執行監聽事件JS中,再次添加setTimeout 來實現異步執行JS。
_$_w就是setTimeout , 后面則是要執行的方法。
高潮
這部分尤其殘暴。檢測了各種節點操作,添加刪除,尋找子節點 等等
這部分關系到 fh1 參數的形成。_$UC 是后續進行加密時會用到的數組。 創建div節點,通過設置innerHTML添加子節點,然后將div 加入到 body節點下。通過不斷修改style來改變節點的高度、寬度,若修改style后的 寬、高 與一開始的寬高不一致,就把style樣式的名稱存入數組。
檢測了 window 下的 matchMedia
這里是個小細節,window instanceof Window 結果是true。
這里就是webgl指紋了
還有很多坑,需要同學們自己去踩了才知道。博主這篇文章只放了一些踩到的坑~ 并不是全部。再多說一點,就不禮貌了~
運行結果
附上運行結果
其中ff是動態的(環境檢測)。f0,f1在不同瀏覽器下會不一樣,2個值的變化取決于 canvas指紋、webgl指紋,fh1可能在別的瀏覽器中不存在。YWTU(每份JS生成的不同),cDro都是靜態的。
2022.7.7 補充
目前鼠標事件分析的七七八八了,比較重要的是move、leave、enter、down。至于事件流程,大家先在代碼中找到賦值數組的位置,然后在瀏覽器上進行斷點,查看是哪個鼠標事件觸發之后會走到這。最后經過一系列的鼠標事件過后,cookie的xxxT參數以及url的后綴長度都會和瀏覽器一致。下面是運行結果測試,大致已經算是完結了,撒花~
2022.7.21 補充
由于沙箱是v8環境,我之前用execjs庫運行js,無法動態緩存一些環境,所以是手動在v8環境中調用獲取值來進行訪問測試。然后就在今天,群里的泰迪佬告訴我py_mini_racer這個庫是可以執行js并緩存環境的(在這里感謝下泰迪佬,愛你么么)。測試下來,執行速度還不錯,連續訪問了20次都返回了200狀態碼。安利一波~
2022.8.29 補充
用了v神的插件之后,就自己寫了個hook 瀏覽器dom節點的腳本,能實現dom節點自吐調用了哪些函數和值,寫的還不是很好。然后順帶hook了鼠標事件之后我才發現,這樣去定位js代碼調用鼠標事件的位置會更快一點。當然如果用控制流去判斷,也能定位到位置,這樣去查看調用堆棧會更清晰些。hook 腳本代碼已經放在新出的文章里了~
總結
-
補環境當中,若遇到執行時的參數有問題,導致的運行軌跡變化,需要去瀏覽器上定位相同代碼位置查找問題、或翻JS代碼找到參數賦值的地方。
-
補環境的話,主要在意的就是在控制流循環下運行的順序是否與瀏覽器上的一致。
PS:博主主要就是在這里比對瀏覽器的運行順序,進行問題排查(可以排查大部分,還有一些需要自己去想辦法找)。
-
博主文章寫的少,可能排版看起來不舒服,還請見諒~
-
本篇文章僅供學習參考,如有侵權,請立即聯系博主刪除。未經博主允許請勿私自轉發文章~
鳴謝
在這里感謝陳不不大佬,在JS逆向之路上提供了不少幫助~
有興趣的小伙伴們可以看看他在B站上發的視頻,對JS逆向提升有一定的幫助~
總結
以上是生活随笔為你收集整理的【瑞数5】浅谈某普期刊JS逆向的环境检测点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LC振荡器稳定度与品质因数的关系
- 下一篇: gradle idea java ssm