js hook


Hook技術又叫鈎子函數,在系統沒有調用該函數之前,鈎子程序就捕獲該消息,鈎子函數先得到該函數的控制權,這時鈎子函數既可以改變該函數的執行行為,還可以強制結束消息的傳遞,簡單來說。就是把系統的程序拉出來,來變成我們自己執行的片段

在js中,系統程序可以指瀏覽器api(比如瀏覽器指紋)也可以指代碼中實現的一些方法

分類:手動hook,自動hook

 

Hook步驟:

1。尋找hook的點

2。編寫hook邏輯

3。調試

最常用的是hook cookie和eval

 

通用hook公式

函數hook

 

old_func=func

func=function(argument){
  my task;//可以是一些打印的操作

  //返回函數調用

  return old_func.applay(argument)
}

//修改原生的方法,偽裝沒有被hook

func.prototype....=...

 

函數hook三部曲:賦值,重寫,原型鏈

 

對象中屬性的hook方式

old_attr=obj.attr

Object.defineProperty(obj,'attr',{
  get:function(val){
    console.log (val)

    return old_attr
},

  set:function(val){

     console.log(val)

      return .....

}
})

 

為什么能實現hook?

客戶端擁有js的最高解釋權,可以決定在任何的時候注入js服務器而無法左右,只能通過 檢測和混淆手段令hook難度加大,但是卻無法阻止hook

hook的目的:找到函數入口以及一些參數的變化,便於分析js邏輯

 

Hook演示實戰

找到設置cookie設置的函數入口

下面的是一個最簡單的獲得設置cookie入口函數的hook代碼Object.defineProperty(document, 'cookie', {

    get: function () {
debugger;
return;
},
set:function (val) {
debugger;
return;
}
})
網站
http://www.python-spider.com/challenge/2

在hook之前,我們需要先打上script斷點,斷點完成之后刷新網頁,再打開控制台輸入代碼,回車,

 

 

 

 現在我們把script斷點放開

點擊右上角的三角形,讓他繼續運行

 

 有個無限debugger,我們右鍵nerver Pasuse here就可以了 ,繼續點那個三角形

 

 點了之后會有個卡頓的時間,正常現象,最后出現這個界面

 

 我們看到現在已經正常進入到我們hook的部分了。現在對右邊對callback里面對調用戰進行點擊,找到入口函數

點開第二個就找到了,代碼亂碼的格式化一下(cookie都是document.cookie方法生成的)

 

  這就找到的cookie的設置入口

 

Hook eval函數

eval_bk=eval


eval=function(val){
debugger;
return eval_bk(val)

}

 //修改原生的方法,偽裝沒有被hook
eval.toString=function(){

 

return 'function eval() { [native code] }'

}

 

 

 

 第二種就是正常情況下object.defineproty只能綁定一次,重復綁定的時候會報錯,

像這樣

 

 官方文檔說設置什么為true,就可以再次綁定,反正在暫時不會

如果網站的邏輯全部用這個方法綁定,他定義在你hook之前,你直接hook就會報錯,。如果在你hook之后,他定義的時候就會報錯,但是網站不會給你拋出異常信息,而是給你個蜜罐。讓你進入到蜜罐里,最后解析出錯誤的邏輯

 

 

 

1 局部函數對hook

function a() {
function b(a) {
return a
}

//hook b的argument a為5的時候大斷點
b_bk = b;
b = function (val) {
if (val === 5) {
debugger;
}
return b_bk()

}

b(1);
b(2);
eval('b(' + 5 + ')')
}



2 全局變量的 hook
實際上就是相當於window.xxx

比方說全局變量a

Object.defineProperty(window, 'a', {

    get: function () {
debugger;
return;
},
set:function (val) {
debugger;
return;
}
})


免責聲明!

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



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