js逆向6-jshook,js扣代碼


###

我發現一個事情,不管什么語言,代碼的調用鏈,還有代碼的作用域都是非常重要的內容,都需要好好的理解才行,包括js,還是python,

###

為什么要hook?

很簡單,如果你遇到了cookie加密,那你就要找到cookie加密函數入口,那你就要hook,

####

 

###

####

 hook就是重寫的一個概念,

###

hook,有手動hook,自動hook,

hook,有函數hook,屬性hook,

###

hook步驟,

1,尋找hook點,也就是你要知道你hook的目標是什么?

2,編寫hook邏輯,

一般在js逆向里面,hook,就是為了打印一些信息,或者是做一個debugger,

3,調試,

 

###

函數hook公式

####

步驟

1,賦值,可以使用func_bak  = func,先把老的函數接收一下,

2,重寫,然后再添加我們的邏輯,把原來的老的邏輯還是放進去,這樣不影響老的邏輯

3,修改原型鏈,偽裝一下,否則可能會被檢測到被hook了,

有些時候,通過打印一個函數的toString,可能判斷出來和原來的不一致,我們hook了之后會被識別出來,那么就修改他的原型鏈,然后偽裝一下,讓他識別不出來是被hook了,

 

 

###

對象中屬性的hook公式

舉例:比如你要hook,document.cookie

 ###

document.cookie_bak = document.cookie;

Object.defineProperty(document,"cookie",{
    get:function () {
        debugger;
        return document.cookie_bak
    }

})

###

我們hook這個document.cookie,

先賦值,

再重寫屬性,

然后加入我們的代碼,然后回車,看到返回document的時候就證明,我們hook成功了,

然后我們再去執行document.cookie就可以進入debug,我們就可以看到他是在哪里打印cookie的, 

然后我們可以找堆棧,看哪里調用的這個函數,就找到了函數入口,

 

 

 

#####

hook實戰

 

 

通過第二題和第九題來演示,

 

第一步,登陸網站,然后打開F12,打開script斷點,

 

 

###

第二步,打開斷點,刷新頁面,會直接進入這一題的js代碼里,這個時候因為打開了js斷點,所以執行第一行js的時候就會斷住,

 

 

第三步:注入hook代碼,在console控制台輸入代碼,

 ###

Object.defineProperty(document,"cookie",{
    get:function () { debugger; return; }, set:function () { debugger; return; } })

###

這是一個最簡單的hook,document.cookie 

我們不想保留這個document.cookie 的內容,我只想要知道函數入口,我們想要在設置cookie的一瞬間,然后把他斷住,我們知道是哪里設置的就可以了,

這個思路很重要,

所以我們不需要把老的屬性接收了,也就是不需要這一句,document.cookie_bak = document.cookie;

 

第四步:然后取消這個script斷點,開始繼續往下走, 

 

 

 

第五步,我們看到就斷住了,我們不斷的下一步,一直到我們set這個地方,我們可以往上找堆棧,就可以找到設置cookie的地方, 

如果有無限debugger就過掉

 

 設置cookie的地方就斷住了,

 

 往上找堆棧,這就是設置cookie加密的地方,

 

 

 

優化一下

 ###

Object.defineProperty(document,"cookie",{
    get:function () {
        debugger;
        return;
        
    },
    set:function (val) {
        debugger;
        return;

    }

})

這樣可以看到傳進來的val,

 

 

###

JS課程常見問題1 :

關於 比賽平台第二題/練習平台第二題/練習平台第三題 等一系列cookie加密無法hook 到 cookie 或者無法找到混淆代碼或者沒有無限debugger了的原因及解決方案的統一答疑:

標准處理方案:

1. 請大佬先排除一切干擾因素【建議開啟 chrome瀏覽器的無痕模式,關閉所有的瀏覽器插件以排除干擾,避免一些不必要的麻煩】

2. 清除檢測點。即:清除 cookie中檢測的位置,比如 練習平台中第二題的 sign,比賽平台中第二題的 m 【這里注意不要清除名為 sessionid 的cookie,否則登錄狀態會掉!】

3. 打上script斷點,然后刷新頁面,這個時候頁面應該就會斷住了,之后如果是低版本的chrome瀏覽器,就可能會已經看到混淆的js了,這個時候注入hook腳本就能hook到cookie了

4. 如果這個時候,沒有看到混淆的js,就是證明chrome版本較高或者有一些其他因素,導致在頁面刷新過程中還存在其他js組件,導致頁面停留在上一頁,此時注入的hook腳本還在上一頁中,所以注入的hook腳本是會失效的。那么這個時候需要用F8,跳到下一個斷點,跳幾下,直到看到混淆的js之后,再注入hook腳本即可。

 

 ####

 

hook本身是一個非常高深的技術,

案例;

python-,第二題,第九題,

###

 

###

 

###

 

 

 

 對局部變量進行hook,

 

hook的代碼是很靈活的,

但是要依賴對js代碼的理解,對調用鏈的理解,你理解了,才可以寫出hook,

而且要對hook的原理也要非常知道才行,

 

####

驗證碼的原理

比如,返回一個圖片,讓你點擊圖片的字體的驗證碼

原理

1,首先服務器返回一個圖片

2,服務器怎么知道是返回給我們的是哪一個圖片呢,需要在瀏覽器記錄一個cookie,刷新驗證碼圖片的時候,會把原來的cookie刪除,新增一個,

3,然后用戶點擊了圖片中的字體,會發給服務器兩個東西,一個是cookie,一個是字體在圖片的坐標,然后服務器就會判斷這個圖片的坐標是否正確,然后返回結果,會把之前的cookie刪除

####

上面只是最簡單的例子

還有可能是什么,不是使用cookie,是使用的js,

而且還可能對傳值進行了加密傳輸,

但是萬變不離其宗,本質就是先下發驗證碼,和客戶端建立聯系,然后上傳驗證碼的結果校驗,然后返回結果,

####

但是知道了驗證碼的邏輯之后,怎么破解呢?

還是需要使用機器學習的方式建立模型,來破解這個驗證碼的問題,

####

 

 

 

 

 

 

###

match第二題

這道題是一道假動態的cookie。每次運行時,會加載不同的cookie生成方式,但是最后生成的算法一樣的,所以我們只需要扣出一套代碼來即可通用

第一步,通過hook找函數入口,先用hook cookie的代碼找到生成cookie的代碼,

 

第二步,還是扣代碼,缺什么補什么,

這個時候你可能運行的時候,發現運行的時候卡死了,這樣你就進行不下去了,怎么辦?

說明你進入了一個死循環了,會導致你的內存飆升,導致內存爆炸,你的瀏覽器就崩潰了,要找到是哪里導致的,

一般是兩個原因,一個是瀏覽器指紋,一個是格式化校驗,

怎么判斷是否是瀏覽器指紋?

現在我們復制這些代碼放到瀏覽器下面的控制台輸出。來觀察是否是瀏覽器檢測

如果正常沒有卡死,說明是瀏覽器檢測,如果還是卡死了,說明是格式化檢測

我們發現回車之后再次進行回車,已經沒有反應,說明肯定是格式化檢測了,

 

怎么判斷是格式化校驗呢?

笨方法就是一步一步的debug,看哪里的問題,

搞js逆向是一個非常需要耐心的活,很墨跡,

這個硬扣代碼就是比較繁瑣,而且還考驗你對js的理解,

 

這個第二題,有更好的方法,不需要硬扣,硬扣這應該是一個高級別的題目,扣代碼很困難,

 

###

中等難度的js混淆,ob混淆,只要是有耐心,扣代碼就能摳出來,

怎么提升js逆向的技術?聽課只能給你提供一個思路,要想提高js逆向的能力,只能是實踐,這是一個完全絕對的經驗性的東西,

不要上來就扣,你要知道這個是一個動態js,先搞清楚原理,

 

####

 

####

 

####

  

 

 

####


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM