1. 程式人生 > 實用技巧 >cookie動態js生成破解

cookie動態js生成破解

2019年末逆向複習系列之努比亞Cookie生成逆向分析


轉載於https://zhuanlan.zhihu.com/p/93858575?from_voters_page=true

逆向背景

努比亞俱樂部的逆向有意思在它的Cookie是動態生成的,是由Js生成Cookie的案例,並且這個網站還有前端反除錯的機制,對於新手爬蟲工程師來說很值得學習和研究。

分析流程與逆向破解

我們以這個連結為例努比亞-牛仔俱樂部,訪問並開啟開發者工具,讀者會發現並沒有遇到什麼異常情況。


等等,我們這次講的是生成Cookie,我們首先需要把該網站的快取、Cookie清除才行,不過我們先分析分析它們的Cookie的關鍵點。


看到Cookie的組成,覺得acw_sc__v2acw_sc__v3引數比較可疑,這個疑問我們先存在,之後再看看。
之後我們照例在Application->Clear Storage清除資料。


清除完之後我們依舊開啟開發者工具重新重新整理頁面進行訪問,可以發現,網站彈出debugger

知識點1:前端反除錯

隨著現在爬蟲課程的普及,越來越多人都掌握了基本的爬蟲用法,類似利用開發者工具尋找網站介面或者進行除錯逆向尋找加密方法,對於網站本身來說,如何簡單又有效地減緩這種行為是應該考慮的,所以一些網站在程式碼中注入了檢測開發者工具是否開啟的Js程式碼,這樣,當我們想要開啟開發者工具的時候我們就會陷入網站的無限迴圈的debugger地獄

,而且這樣還會造成Js的記憶體洩漏,你可以在遇到這種情況的時候檢查你的chrome頁面程序,會發現記憶體佔用量越來越高,可你什麼都沒幹?所以,對於這種反除錯手段,我們需要學習如何繞過。

1. 繞過debugger地獄

我們首先檢視右邊的Call Stack呼叫棧,我們一一分析,可以追溯到如圖所示的地方。


關鍵程式碼是這樣的,也就是一開始會執行_0x4db1c這個函式(初步理解是上文所說的檢測開發者工具是否開啟的函式,之後setInterval函式是每隔一定時間執行)

_0x4db1c();
setInterval(function() {
_0x4db1c();
}, 4000);

我們再看_0x4db1c

的函式,它停在_0x355d23這個函式上面


面對這樣的情況,我們可以直接在Console裡面對這個函式進行重寫


重寫好之後我們執行下,會發現這個頁面就直接生成好Cookie去訪問頁面了,這樣達不到我們之前想研究它Cookie生成的邏輯的目的。


目前我們繞過了debugger反除錯,那我們該怎麼獲取生成Cookie的邏輯呢?我們接著分析

2. 破解Cookie生成邏輯

為了我們分析的方便,我們可以直接把這個debugger的程式碼儲存下來,在我們原生代碼中刪除debugger的邏輯之後進行除錯。


我們直接開啟這個html檔案,我們會發現網頁一直卡在Sources不動,為什麼會出現這種情況?


仔細分析程式碼,發現有些Regexp的檢測程式碼,根據以往的經驗可能是檢測程式碼是否長開?防止有人本地除錯?我們使用壓縮後的程式碼,大家可以用Js壓縮/解壓工具進行壓縮


果然,壓縮之後還是正常的,那麼可以驗證我們剛才的想法了。


我們刪除debugger相關的程式碼,也就是

_0x4db1c();
setInterval(function() {
_0x4db1c();
}, 4000);

開啟網頁後發現頁面一直在閃?html程式碼不長,我們再仔細看看,注意到一個細節setTimeout


setTimeout是延後幾秒執行一次,我們看一下’\x72\x65\x6c\x6f\x61\x64\x28\x61\x72\x67\x32\x29’是什麼意思,我們把它放在Console裡看看。


可以看到,setTimeout執行reload函式,我們看看reload函式

function reload(x) {
            setCookie("acw_sc__v2", x);
            document.location.reload();
 } 

裡面的邏輯是先設定Cookie再過載頁面,所以我們這裡一直閃的原因是先執行setTimeout再過載頁面又執行setTimeout,所以又是一個迴圈地獄,我們刪除setTimeout這段程式碼就行。等等,我們再看看上面Console中的結果reload(arg2),然後到reload函式中,acw_sc__v2是由arg2這個函式得來的,好,我們現在明白了哪個地方生成的Cookie了,我們在html程式碼中搜索arg2,然後對它打上斷點。

3. 分析加密演算法

我們先總體看下arg2函式的構成


也就是需要_0x23a392_0x5e8b26這個兩個關鍵引數,_0x23a392來自arg1的方法生成,它們都是有_0x55f3這同一個方法,所以我們的思路就清晰了。
我們先看看_0x55f3這個方法,並且做一些除錯,可以發現_0x55f3通過傳入的引數不同使用不同的方法,有些類似於控制流平坦化

知識點2:控制流平坦化

直接上圖


首先_0x5e8b26這個引數我們多次除錯後發現是個變數,可以先確定,"3000176000856006061501533003690027800375",當然我們也可以直接搜尋_0x5e8b26


而我們獲取到_0x23a392_0x5e8b26之後進行加密的方法如下


大致的加密就是如上這樣,因為整體程式碼量也不大,可以直接改寫或者使用python載入Js都行。

4. 總結思路

這次的案例主要是可以學習到兩點,第一點就是我們懂得有些網站會進行前端反除錯,手段之一就是會檢測開發者工具是不是開啟,而且如果我們把程式碼拿到本地,竟然還會檢測原生代碼是否是展開的?第二點我們需要習慣這種程式碼混淆的方式,有些網站會用_0xxxx等無意義的符號進行混淆,以及使用16進位制來做混淆噁心我們,我們想要還原的話直接把程式碼放到Console裡面執行一下就可以了,因為Js也能讀取原始的16進位制碼。

程式碼實戰

有了上面這個分析流程,我們就可以開始Coding了,以下是acw_sc__v2加密的流程。
獲取arg1引數的程式碼


獲取arg2引數的程式碼


測試的程式碼,先訪問官網動態獲取Cookie再在請求頭的Header中加入這個acw_sc__v2引數去過載URL訪問官網。

複習要點

從這個複習的案例我們可以總結下思路:

    1. 如何繞過前端反除錯?
    2. 別害怕混淆的程式碼,程式碼雖然混淆,但是邏輯還是一樣的。