JS hook 3種方法
本文所有教程及源碼、軟件僅為技術(shù)研究。不涉及計(jì)算機(jī)信息系統(tǒng)功能的刪除、修改、增加、干擾,更不會(huì)影響計(jì)算機(jī)信息系統(tǒng)的正常運(yùn)行。不得將代碼用于非法用途,如侵立刪!
JS hook 3種方法
環(huán)境
win10
node
方法一:
直接全部重寫原函數(shù)
function xxx(){
console.log("1111");
}
xxx = function(){
console.log("2222");
}

覆蓋修改瀏覽器環(huán)境
window.alert = function(){console.log("重寫了alert方法!")};
setInterval = function(){console.log("重寫了setInterval方法!")};

方法二:通過(guò)Object.defineProperty替換一個(gè)對(duì)象的屬性
屬性里可能存的是方法,也可能存的就是一個(gè)值(值有兩個(gè)方法getter、setter)
//下面是一個(gè)示例:這個(gè)示例演示了hook全局的cookie設(shè)置點(diǎn)
(function() {
? ?//嚴(yán)謹(jǐn)模式 檢查所有錯(cuò)誤
? ?'use strict';
? ?//document 為要hook的對(duì)象 ? 這里是hook的cookie
var cookieTemp = "";
? ?Object.defineProperty(document, 'cookie', {
?//hook set方法也就是賦值的方法
?set: function(val) {
? ?//這樣就可以快速給下面這個(gè)代碼行下斷點(diǎn)
? ?//從而快速定位設(shè)置cookie的代碼
? ?console.log('Hook捕獲到cookie設(shè)置->', val);
? ?cookieTemp = val;
? ?return val;
?},
?//hook get方法也就是取值的方法
?get: function()
?{
? return cookieTemp;
?}
? ?});
})();
方法三:new Proxy 不常用
Proxy 用于修改某些操作的默認(rèn)行為,等同于在語(yǔ)言層面做出修改,所以屬于一種“元編程”(meta programming),即對(duì)編程語(yǔ)言進(jìn)行編程。
Proxy 可以理解成,在目標(biāo)對(duì)象之前架設(shè)一層“攔截”,外界對(duì)該對(duì)象的訪問(wèn),都必須先通過(guò)這層攔截,因此提供了一種機(jī)制,可以對(duì)外界的訪問(wèn)進(jìn)行過(guò)濾和改寫。Proxy 這個(gè)詞的原意是代理,用在這里表示由它來(lái)“代理”某些操作,可以譯為“代理器”。
JS hook 時(shí)機(jī)
1.在控制臺(tái)注入的hook,刷新網(wǎng)頁(yè)就失效了
解決:在網(wǎng)頁(yè)加載第一個(gè)js的位置,第一行下斷點(diǎn),然后在控制臺(tái)手動(dòng)注入hook,適用于快速調(diào)試 問(wèn)題:有可能注入hook的時(shí)機(jī)還是會(huì)晚一點(diǎn),因?yàn)橄聰帱c(diǎn)的js位置不一定是第一個(gè)加載的
2.利用Fiddler的替換響應(yīng),注入hook
這種時(shí)機(jī)比較靠前
3.油猴插件(不推薦,容易被檢測(cè))
本文僅供學(xué)習(xí)交流使用,如侵立刪!