JS HOOK 程式碼段

*感悟人生*發表於2024-11-04

1、定位header關鍵字

(function(){
    let headerCache = window.XMLHttpRequest.prototype.setRequestHeader;
    window.XMLHttpRequest.prototype.setRequestHeader = function(key, value){
        console.log('Hook set header %s => %s', key, value);
        // 定位到所需的header關鍵字
        if (key === "Sign"){
            debugger;
        }
        return headerCache.apply(this, arguments);
    }
})();

2、定位cookie關鍵字

// 定位cookie關鍵字
(function() {
    "use strict";
    var cookieTemp = "";
    Object.defineProperty(document, "cookie", {
        writable: false, // 表示能否修改屬性的值,即值是可寫的還是隻讀
        configurable: false, // 表示能否透過 delete 刪除屬性、能否修改屬性的特性,或者將屬性修改為訪問器屬性
        set: function(val) {
            if (val.indexOf("cookie的引數名稱") != -1) {
                debugger ;
            }

            cookieTemp = val;
            return val;
        },

        get: function() {
            return cookieTemp;
        }
    })
}
)();

// 定位cookie關鍵字  上面不能用時更換成這個    enumerable:true,configurable:true,   https://www.cnblogs.com/lifengjuan/p/17722573.html
(function() {
    "use strict";
    var cookieTemp = "";
    Object.defineProperty(document, "cookie", {
        enumerable:true,
        configurable:true,
        set: function(val) {
            if (val.indexOf("_yq_bid") != -1) {
                debugger ;
            }

            cookieTemp = val;
            return val;
        },

        get: function() {
            return cookieTemp;
        }
    })
}
)();

// 捕獲cookie
(function(){
    // 嚴格模式,檢查所有錯誤
    'use strict'
    // document 為要hook的物件 ,屬性是cookie
    Object.defineProperty(document,'cookie',{
        // hook set方法也就是賦值的方法,get就是獲取的方法
        set: function(val){
            // 這樣就可以快速給下面這個程式碼行下斷點,從而快速定位設定cookie的程式碼
            debugger;  // 在此處自動斷下
            console.log('Hook捕獲到set-cookie ->',val);
            return val;
        }
    })
})();

3、定位URL關鍵字

// 定位url關鍵字
(function () {
    var open = window.XMLHttpRequest.prototype.open;
    window.XMLHttpRequest.prototype.open = function (method, url, async) {
        if (url.indexOf("key") != -1) {
            debugger;
        }
        return open.apply(this, arguments);
    };
})();

4、定位JSON.stringify、JSON.parse 用於請求或者響應是密文

// 定位JSON.stringify、JSON.parse,一般用於請求和響應是密文
// 請求是密文
(function() {
    var _stringify = JSON.stringify;
    JSON.stringify = function(ps) {
        console.log("Hook JSON.stringify ——> ", ps);
        debugger;
        return _stringify(ps);  // 不改變原有的執行邏輯
    }
})();

// 響應是密文
(function() {
    var _parse = JSON.parse;
    JSON.parse = function(ps) {
        console.log("Hook JSON.parse ——> ", ps);
        debugger;
        return _parse(ps);  // 不改變原有的執行邏輯
    }
})();

5、定位鍵盤、滑鼠的動作

// F12的鍵碼為 123,可以直接全域性搜尋 keyCode == 123, == 123 ,keyCode
document.onkeydown = function() {
    if (window.event && window.event.keyCode == 123) {
        // 改變鍵碼
        event.keyCode = 0;
        event.returnValue = false;
        // 監聽到F12被按下直接關閉視窗
        window.close();
        window.location = "about:blank";
    }
}
;


// 監聽滑鼠右鍵是否被按下方法 1, oncontextmenu事件 document.oncontextmenu = function () { return false; };

// 監聽滑鼠右鍵是否被按下方法 2,onmousedown事件 document.onmousedown = function(evt){ // button屬性是2 就代表是滑鼠右鍵 if(evt.button == 2){ alert('監聽到滑鼠右鍵被按下') evt.preventDefault() // 該方法將通知 Web 瀏覽器不要執行與事件關聯的預設動作 return false; } }

// 監聽使用者工具欄調起開發者工具,判斷瀏覽器的可視高度和寬度是否有改變,有改變則處理, // 判斷是否開了開發者工具不太合理。 var h = window.innerHeight, w = window.innerWidth; window.onresize = function(){ alert('改變了視窗高度') }


// 滑鼠 (function() { //嚴謹模式 檢查所有錯誤 'use strict'; // hook 滑鼠選擇 Object.defineProperty(document, 'onselectstart', { set: function(val) { console.log('Hook捕獲到選中設定->', val); return val; } });


// hook 滑鼠右鍵 Object.defineProperty(document,'oncontextmenu',{ set:function(evt){ console.log("檢測到右鍵點選"); return evt } }); })();

6、載入器

//在載入器後面下斷點  執行下面程式碼
// 這裡的f 替換成需要匯出的函式名
//在你要的方法載入前下斷點 執行 window.isz=true
//在你要的方法執行後程式碼處下斷點  執行 window.wbpk_  拿到所有程式碼  注意後面有個逗號
window.zhiyuan = f;
window.wbpk_ = "";
window.isz = false;
f = function(r){
    if(window.isz)
    {
        // e[r]裡的e 是載入器裡的call那裡
        window.wbpk_ = window.wbpk_ + r.toString()+":"+(e[r]+"")+ ",";
    }
    return window.zhiyuan(r);
}



// hook
// 如果只是呼叫模組,不用模組裡面的方法, 那麼直接獲取呼叫模組的時候所有載入過的模組,進行拼接
function o(t) {
    if (n[t])
        return n[t].exports;
    var i = n[t] = {
        i: t,
        l: !1,
        exports: {}
    };
    console.log("被呼叫的 >>> ", e[t].toString());
    //  這裡進行拼接,bb變數需要在全域性定義一下
    // t 是模組名, e[t] 是模組對應的函式, 也就是key:value形式
    bb += `"${t}":${e[t].toString()},`
    return e[t].call(i.exports, i, i.exports, o),
    i.l = !0,
    i.exports
}
bz = o;

 

7、document下的createElement()方法的hook,檢視建立了什麼元素

(function() {
    'use strict'
   var _createElement = document.createElement.bind(document);
   document.createElement = function(elm){
   // 這裡做判斷 是否建立了script這個元素
   if(elm == 'body'){
        debugger;
   }
    return _createElement(elm);
}
})();

相關文章