目錄
- 一、RS4特點
- 二、網站請求流程特點
- 三、網站加載js的順序
- 四、正式邏輯的研究
- 1、cookie如何定位?
- 2、扣函式缺啥補啥注意事項?
- 3、如何獲取`$_ts動態變數`值?
- 4、如何定位`MmEwMD后綴`?
- 5、5代和4代有何區別?
一、RS4特點
-
服務器回應狀態碼202或者412回傳第一個cookie_s;然后js混淆生成了第二個cookie_t,只有攜帶有效的cookie_t才能正確請求頁面狀態碼才是200

-
如何區分是幾代版本,看
cookie_t的第一個數字,絕大多數通過該數字就可以確定是幾代

-
cookie_t大致有兩種:
FSSBBIl1UgzbN7N80T,FSSBBIl1UgzbN7N443T,其區別含義443(https)、80(http)其實是服務器的埠號 -
加載vm的1萬多行代碼入口特性用正則匹配是:
ret=\S{4}\.call\(\S{4},(\S{4})\);

二、網站請求流程特點
-
1、第一次請求:
回傳狀態碼202,與回應cookie_SFSSBBIl1UgzbN7N80S


- 回應原始碼只有光禿禿的內容,大致分為三部分見圖說明,目前看到的這些js邏輯先了解下,重要的記住是它會生成一個全域變數
動態$_ts,在vm代碼里面會用到$_ts的變數;而meta里的動態content內容也是在vm代碼里面需要使用到的

-
2、第二次請求:只攜帶
cookie_S請求了外鏈js檔案,之后js生成了cookie_T,回應狀態碼200,也是此次學習需要關注的地方,此處cookie是FSSBBIl1UgzbN7N80T

-
3、第三次請求:攜帶
cookie_S與cookie_T再次請求urlA,回傳狀態碼200

-
4、之后當你打開谷歌開發者工具,就會自動debugger住,這是遇到該類網站看到的流程差不多就是這樣

三、網站加載js的順序
- 1、首先監聽script斷點,然后并清除瀏覽器快取,再然后重繪網頁,不停的下一步直到看到圖下的js停下,
這是第一步加載了外鏈的js檔案代碼,并賦給了$_ts物件

- 2、繼續往下除錯,跳到如圖下,
這是第二步,執行一段js,我們稱之為主邏輯代碼;它主要做了兩件事,一件是將外鏈的js代碼亂碼還原成VM里的一萬多行的代碼,另一件則是給全域變數window.$_ts賦了很多屬性變數;

- 3、搜索call,找到了VM代碼的入口,此時外鏈的js內容被解密成VM的一萬多行代碼,即這里的
_$KF;通過eval加載_$KF,即可進入第三步,則看到了VM的一萬多行的代碼,VM代碼的主要作用就是生成cookie(加載動態的content以及動態的$_ts來生成),差不多就是這么個順序


四、正式邏輯的研究
1、cookie如何定位?
-
有3種方法:① cookie當然是hook來得最快 ② watch監聽document.cookie逐步除錯找cookie生成位置 ③ 找到cookie的偽裝數字索引等,全域搜索打斷點找,本文采用hook的方式

-
堆疊回溯,找到了生成cookie的位置,這將是我們逆著扣函式的起點位置

-
再堆疊回溯,找到了vm代碼的入口位置,這也是很多大佬喜歡hook eval的地方,在這個位置你可以找到
window.$_ts所有已生成的的值,常常已此處為節點,獲得window.$_ts變數,然后再扣vm代碼函式邏輯

2、扣函式缺啥補啥注意事項?
-
注意事項1:雖然網頁每次都是動態的變化js,但是改變的僅僅是變數混淆的名稱,代碼函式執行邏輯都是固定不變的,所以只需要先將js用fiddler替換為靜態的然后扣邏輯 -
注意事項2:要么保存一份靜態的網頁進行扣代碼(能保證函式的變數一直不變,但是控制流依然很多,慢慢除錯大力出奇跡),或者對保存的靜態網頁通過ast還原后再加載扣(ast還原后的代碼網上找一找,此方法扣代碼解決了控制流,減少滑鼠的累),在這里強烈推薦Nanda的公眾號 -
逆著來缺啥補啥,以此為入口去扣代碼就行了,然后記住下面的2個重點關注的注意事項

-
注意事項1:meta content內容又在何處被取出來并使用了,要記住那個函式傳參的位置,留一個入口,動態傳content內容

-
注意事項2:全域變數$_ts是一個橋梁,在原始碼第一部分自執行js處生成,在vm代碼中被多處使用,需要注意的是在vm代碼里有沒有被賦給哪個全域變數,比如在一開始var _$W6 = _$gM["$_ts"],$_ts賦給了_$W6,所以后面我們凡是找到與_$W6相關的變數使用,都要記筆記標記下,因為是動態的,所以下次我們需要傳的也是這些變數

-
比如此處用到了
_$W6._$Cl, _$W6._$Ms, _$W6._$GX, _$W6._$rj這4個變數,那么一定要記筆記此處是用的$_ts的4個變數值,下次我們要換的也是這4個變數的值

-
那確定了
$_ts動態變數是哪些,我們留下來的入口就如下了

3、如何獲取$_ts動態變數值?
-
每次加載網頁回傳時,首先用正則找到call的點,然后以此處為斷點;處理邏輯有兩件事需要做:
- ① 取出window.$_ts,
通過索引或其它方法按位置去取前面我們需要的動態變數屬性 - ② 將VM代碼的內容取出來賦給一個臨時變數(
需要通過正則取一個順序變數代碼,自己摸索下,有4個屬性變數與ts相關的需要進行順序判斷)
- ① 取出window.$_ts,
-
還有些關鍵點需要自己去探索,鎖定ts動態量探索,差不多就是圖片中的這個意思

4、如何定位MmEwMD后綴?
-
① 可以參考這篇文章講的簽名邏輯,后綴定位其實是改變了xhr.open替換成了VM代碼里面的函式,而后綴生成主要是
后綴轉陣列 + 套了一層cookie加密邏輯,摳出cookie邏輯基本后綴也差不多了 -
② 其它:了解下XMLHttpRequest 物件,作用是用于在后臺與服務器交換資料,其主要特點如下

-
xhr=new XMLHttpRequest():創建 XMLHttpRequest 物件

-
xhr.open("GET",url,false):初始化HTTP請求引數,但是并不發送請求,第三個引數為true表示腳本會在 send() 方法之后繼續執行,而不等待來自服務器的回應,false在請求失敗時是否執行其余的代碼無關緊要時使用 -
xhr.setRequestHeader(name, value):設定請求頭 -
xhr.send():發送一個 HTTP 請求,引數可選,如果沒有引數則是get請求 -
xhr.onreadystatechange = function(){if (xhr.readyState == 4 && xhr.status == 200) {.......}}事件句柄觸發后則執行相應函式(僅在狀態為 4 時,我們才執行代碼)

5、5代和4代有何區別?
- 5代和4代的核心加密邏輯差不多,摳出4代,5代也沒問題;唯一有問題的在于128位陣列里面有些指紋的邏輯需要細細研究;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/395144.html
標籤:其他
