
Hook 是一种钩子技术,在系统没有调用函数之前,钩子程序就先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,也可以强制结束消息的传递。简单来说,修改原有的 JS 代码就是 Hook。
Hook 技术之所以能够实现有两个条件:
(function (){
var org = window.XMLHttpRequest.prototype.setRequestHeader;
window.XMLHttpRequest.prototype.setRequestHeader = function (key,value){
//在请求中发现某个关键字,断点
if(key=='value'){
debugger
}
return org.apply(this,arguments)
}
})()
// 定义hook属性
var window_flag_1 = "_t";
var window_flag_2 = "ccc";
var key_value_map = {};
var window_value = window[window_flag_1];
// hook
Object.defineProperty(window, window_flag_1, {
get: function(){
console.log("Getting",window,window_flag_1,"=",window_value);
//debugger
return window_value
},
set: function(val) {
console.log("Setting",window, window_flag_1, "=",val);
window_value = val;
key_value_map[window[window_flag_1]] = window_flag_1;
set_obj_attr(window[window_flag_1],window_flag_2);
});
function set_obj_attr(obj,attr){
var obj_attr_value = obj[attr];
Object.defineProperty(obj,attr, {
get: function() {
console.log("Getting", key_value_map[obj],attr, "=", obj_attr_value);
//debugger
return obj_attr_value;
},
set: function(val){
console.log("Setting", key_value_map[obj], attr, "=", val);
obj_attr_value = val;
});
}
(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;
}
})
}
)();



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





'''请求是密文'''
(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); // 不改变原有的执行逻辑
}
})();










var _constructor = constructor;
Function.prototype.constructor = function(s) {
if (s == "debugger") {
console.log(s);
return null;
}
return _constructor(s);
}







setInterval = function () {}




(function() {
'use strict';
var eval_ = window.eval;
window.eval = function(x) {
eval_(x.replace("debugger;", " ; "));
}
;
window.eval.toString = eval_.toString;
}
)();
(function() {
var _constructor = unsafeWindow.Function.prototype.constructor;
unsafeWindow.Function.prototype.constructor = function() {
var fnContent = arguments[0];
if (fnContent) {
if (fnContent.includes('debugger')) {
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, '');
eval('caller = ' + callerContent); // Replace the function
}
return (function () {});
}
}
return _constructor.apply(this, arguments);
};
})();












