(function () { var cookieTemp = ''; Object.defineproperty(document, 'cookie', { set: function (val) { if (val.indexOf('v') != -1) { debugger } console.log('Hook捕获到cookie设置->', val); cookieTemp = val; return val; }, get: function () { return cookieTemp; }, }); })();二. header 参数通用hook
(function () { // 头部参数 请求对象当中的 设为请求头部参数 var org = window.XMLHttpRequest.prototype.setRequestHeader; window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) { // 关键字 在请求当中发现有键是Authorization 断点 if (key == 'Authorization') { debugger; } return org.apply(this, arguments); } })();三. hook过debugger
Function.prototype.constructor_ = Function.prototype.constructor; Function.prototype.constructor = function (a) { // 如果参数为 debugger,就返回空方法 if(a == "debugger") { return function (){}; } // 堆代码 duidaima.com // 如果参数不为 debugger,还是返回原方法 return Function.prototype.constructor_(a); };2. 如果是定时器的debugger采用以下语句
// 先保留原定时器 var setInterval_ = setInterval setInterval = function (func, time){ // 如果时间参数为 0x7d0,就返回空方法 // 当然也可以不判断,直接返回空,有很多种写法 if(time == 0x7d0) { return function () {}; } // 如果时间参数不为 0x7d0,还是返回原方法 return setInterval_(func, time) } // eval("debugger;");四. hook URL
(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); }; })();五. hook JSON.stringify
(function() { var stringify = JSON.stringify; JSON.stringify = function(params) { console.log("Hook JSON.stringify ——> ", params); debugger; return stringify(params); } })();六. hook JSON.parse
(function() { var parse = JSON.parse; JSON.parse = function(params) { console.log("Hook JSON.parse ——> ", params); debugger; return parse(params); } })();七. hook eval
(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 中对原生函数 native 属性的检测 var _myeval = myeval.bind(null); _myeval.toString = window.__cr_eval.toString; Object.defineProperty(window, 'eval', { value: _myeval }); })();八. hook Function
(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中对原生函数native属性的检测 myfun.toString = function() { return window.__cr_fun + "" } Object.defineProperty(window, 'Function', { value: myfun }); })();九. 通用反调试
// ==UserScript== // @name debugger // @namespace http://tampermonkey.net/ // @version 1 // @description Stops most anti debugging implementations by JavaScript obfuscaters // @author ss // @match * // @grant unsafeWindow // @run-at document-start // ==/UserScript== (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); }; })();
写到最后
感谢您的一路陪伴,用代码构建世界,一起探索充满未知且奇妙的魔幻旅程。