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;
}
})