日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【瑞数5】浅谈某普期刊JS逆向的环境检测点

發布時間:2024/3/12 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【瑞数5】浅谈某普期刊JS逆向的环境检测点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【瑞數5】淺談某普期刊JS逆向的環境檢測點

  • 前言
  • JS加載流程
    • 第一個JS
    • 第二個JS
    • 第三個JS
  • AST簡單解混淆
  • 環境檢測
    • 前奏
    • 異步執行JS流程
    • 高潮
  • 運行結果
  • 總結
  • 鳴謝

前言

這幾天把某期刊的rs5環境檢測看差不多了,所以寫篇文章簡單聊下rs5會檢測到的一些環境。我所用的方法基于瀏覽器“沙箱”的,可以做到邊調試邊補環境。
如果有想看算法運行邏輯的同學,出門左轉看十一姐的文章。
RPC方案可以看看這個視頻(陳不不大佬出品)。

https://www.bilibili.com/video/BV1PS4y127Mn

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神插件里偷代碼,大佬的代碼用起來就是舒服,嘿嘿~)。

init_cookie(document.cookie) function init_cookie(cookie){var cache = (cookie || "").trim();if (!cache){cache = ''}else if (cache.charAt(cache.length-1) != ';'){cache += '; '}else{cache += ' '}Object.defineProperty(Document.prototype, 'cookie', {get: function() {var r = cache.slice(0,cache.length-2);v_console_log(' [*] document -> cookie[get]', r)return r},set: function(c) {v_console_log(' [*] document -> cookie[set]', c)var ncookie = c.split(";")[0].split("=");if (!ncookie[1]){return c}var key = ncookie[0].trim()var val = ncookie[1].trim()var newc = key+'='+valvar flag = false;var temp = cache.split("; ").map(function(a) {if (a.split("=")[0] === key) {flag = true;return newc;}return a;})cache = temp.join("; ");if (!flag) {cache += newc + "; ";}return cache;}}); }

  • 可以看到_$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標簽下的 hrefpathname 等參數,將環境補的一模一樣即可。

document.hookCreateElement = document.createElement; document.createElement = function(tagName){if(tagName === "a"){debugger;}return document.hookCreateElement(tagName); }

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逆向的环境检测点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。