Js逆向必備技能之-動態hook找入口
- 2020 年 2 月 25 日
- 筆記
今天我們來講一下 hook找入口方法,動態調試動態hook。
先介紹一下 Object.defineProperty Object.defineProperty(obj, prop, descriptor) obj:必需。目標對象 prop:必需。需定義或修改的屬性的名字 descriptor:必需。目標屬性所擁有的特性 此方法可以重寫js對象方法屬性。
首先我們寫個基本的hook:
Object.defineProperty(document, 'cookie', { get: function() { debugger; return ""; }, set: function(value) { debugger; return value; }, });這樣的話我們就可以hook cookie的讀寫,只要接下來的程式碼讀寫cookie就會斷點斷下來。讓他的混淆程式碼無所遁形 ,我們來演示一下

我們在控制台執行hook程式碼之後,他讀取cookie被hook劫持到我們的函數裡面了,這樣我們就能從右邊的調用堆棧去看看他操作cookie的地方。輕鬆分析
這裡我們拿某個網站舉例測試,因為他很多反爬混淆比較典型

隨便劃一下,他有個提交 我們看一下提交的內容

他這個post沒有任何欄位只有一串加密後的字元串,這樣我們就不能搜關鍵字了,這裡Google瀏覽器給我們提供了一個功能,查看調用堆棧

這裡我們可以看到從點擊到提交所有調用過程,我們點第一跳到他的程式碼段再點左下角格式化

一般人看到一臉懵逼,我們先下斷點,再滑動一下手工去解一下看看

我們可以看到f是XMLHttpReque對象,f[_0xd5fe("0x548", "iunZ")]是send發送數據,具體邏輯就是post發送window._tt_log_val 欄位到伺服器

很明顯這個欄位就是加密後的字元串,我老方法搜一下這個._tt_log_val ,這裡我用的是qq瀏覽器

沒有任何的地方,是不是感覺無從下手,他這裡我們暫時猜測是動態生成的欄位名稱動態設置的,我們可以利用hook來找入口,既然他可以寫這個欄位 我們可以hook這個欄位,只要他提交這個肯定要生成賦值,我們在他賦值之前hook。
Object.defineProperty(window, '_tt_log_val', { get: function() { debugger; return ""; }, set: function(value) { debugger; return value; }, });
然後我們滑動的時候他提示這個 屬性重定義,不管怎麼觸發的 他肯定在操作這個欄位,我們看他的位置

我們下個斷點看看他怎麼操作的

可以看到他用了一點小聰明,Object.defineProperty他利用這個對象進行的賦值操作,我們找一下具體哪裡。

字元串拼接,中間是取加密後的演算法,剩下的就是看他這個方法怎麼計算的,無論是摳演算法還是其他方式,我們就很輕鬆分析他。至於扣程式碼我們程式調用,由於篇幅關係,後面單獨講怎麼扣程式碼為我們所用。

