1. cookie 通用hook
Cookie Hook 用于定位 Cookie 中關(guān)鍵參數(shù)生成位置贞岭,以下代碼演示了當(dāng) Cookie 中匹配到了 v 關(guān)鍵字士复, 則插入斷點(diǎn)
(function () {
var cookieTemp = '';
Object.defineproperty(document, 'cookie', {
set: function (val) {
if (val.indexOf('v') != -1) {
debugger
}
console.log('Hook捕獲到cookie設(shè)置->', val);
cookieTemp = val;
return val;
},
get: function () {
return cookieTemp;
},
});
})();
2. header 參數(shù)通用hook
(function () {
// 頭部參數(shù) 請求對象當(dāng)中的 設(shè)胃請求頭部參數(shù)
var org = window.XMLHttpRequest.prototype.setRequestHeader;
window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) {
// 關(guān)鍵字 在請求當(dāng)中發(fā)現(xiàn)有鍵是Authorization 斷點(diǎn)
if (key == 'Authorization') {
debugger;
}
return org.apply(this, arguments);
}
})();
3. hook過debugger
// 先保留原 constructor
// 1. 比如判斷是否有該debugger詞語级解,替換為同等長度的空格(避免判斷長度)
Function.prototype.constructor_ = Function.prototype.constructor;
Function.prototype.constructor = function (a) {
// 如果參數(shù)為 debugger胁编,就返回空方法
if(a == "debugger") {
return function (){};
}
// 如果參數(shù)不為 debugger锐墙,還是返回原方法
return Function.prototype.constructor_(a);
};
2. 如果是定時(shí)器的debugger采用以下語句
// 先保留原定時(shí)器
var setInterval_ = setInterval
setInterval = function (func, time){
// 如果時(shí)間參數(shù)為 0x7d0皿哨,就返回空方法
// 當(dāng)然也可以不判斷,直接返回空机隙,有很多種寫法
if(time == 0x7d0)
{
return function () {};
}
// 如果時(shí)間參數(shù)不為 0x7d0蜘拉,還是返回原方法
return setInterval_(func, time)
}
// eval("debugger;");
4. hook URL
URL Hook 用于定位請求 URL 中關(guān)鍵參數(shù)生成位置,以下代碼演示了當(dāng)請求的 URL 里包含 login 關(guān)鍵字時(shí)有鹿,則插入斷點(diǎn):
(function () {
var open = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function (method, url, async) {
if (url.indexOf("login") != -1) {
debugger;
}
return open.apply(this, arguments);
};
})();
5. hook JSON.stringify
JSON.stringify() 方法用于將 JavaScript 值轉(zhuǎn)換為 JSON 字符串旭旭,在某些站點(diǎn)的加密過程中可能會遇到,以下代碼演示了遇到 JSON.stringify() 時(shí)葱跋,則插入斷點(diǎn):
(function() {
var stringify = JSON.stringify;
JSON.stringify = function(params) {
console.log("Hook JSON.stringify ——> ", params);
debugger;
return stringify(params);
}
})();
6. hook JSON.parse
JSON.parse() 方法用于將一個(gè) JSON 字符串轉(zhuǎn)換為對象持寄,在某些站點(diǎn)的加密過程中可能會遇到,以下代碼演示了遇到 JSON.parse() 時(shí)娱俺,則插入斷點(diǎn):
(function() {
var parse = JSON.parse;
JSON.parse = function(params) {
console.log("Hook JSON.parse ——> ", params);
debugger;
return parse(params);
}
})();
7. hook eval
JavaScript eval() 函數(shù)的作用是計(jì)算 JavaScript 字符串稍味,并把它作為腳本代碼來執(zhí)行。如果參數(shù)是一個(gè)表達(dá)式荠卷,eval() 函數(shù)將執(zhí)行表達(dá)式模庐。如果參數(shù)是 Javascript 語句,eval() 將執(zhí)行 Javascript 語句油宜,經(jīng)常被用來動態(tài)執(zhí)行 JS掂碱。以下代碼執(zhí)行后,之后所有的 eval() 操作都會在控制臺打印輸出將要執(zhí)行的 JS 源碼:
(function() {
// 保存原始方法
window.__cr_eval = window.eval;
// 重寫 eval
var myeval = function(src) {
console.log(src);
console.log("=============== eval end ===============");
debugger;
return window.__cr_eval(src);
}
// 屏蔽 JS 中對原生函數(shù) native 屬性的檢測
var _myeval = myeval.bind(null);
_myeval.toString = window.__cr_eval.toString;
Object.defineProperty(window, 'eval', {
value: _myeval
});
})();
8. hook Function
以下代碼執(zhí)行后验庙,所有的函數(shù)操作都會在控制臺打印輸出將要執(zhí)行的 JS 源碼:
(function() {
// 保存原始方法
window.__cr_fun = window.Function;
// 重寫 function
var myfun = function() {
var args = Array.prototype.slice.call(arguments, 0, -1).join(","),
src = arguments[arguments.length - 1];
console.log(src);
console.log("=============== Function end ===============");
debugger;
return window.__cr_fun.apply(this, arguments);
}
// 屏蔽js中對原生函數(shù)native屬性的檢測
myfun.toString = function() {
return window.__cr_fun + ""
}
Object.defineProperty(window, 'Function', {
value: myfun
});
})();
9. 通用反調(diào)試
(function() {
var _constructor = unsafeWindow.Function.prototype.constructor;
// Hook Function.prototype.constructor
unsafeWindow.Function.prototype.constructor = function() {
var fnContent = arguments[0];
if (fnContent) {
if (fnContent.includes('debugger')) { // An anti-debugger is attempting to stop debugging
var caller = Function.prototype.constructor.caller; // Non-standard hack to get the function caller
var callerContent = caller.toString();
if (callerContent.includes(/\bdebugger\b/gi)) { // Eliminate all debugger statements from the caller, if any
callerContent = callerContent.replace(/\bdebugger\b/gi, ''); // Remove all debugger expressions
eval('caller = ' + callerContent); // Replace the function
}
return (function () {});
}
}
// Execute the normal function constructor if nothing unusual is going on
return _constructor.apply(this, arguments);
};
})();