常见手法
- 搜关键字:
- encode decode interceptors.response.use JSON.parse/strinfy
- 调用栈
Hook
hook 函数
(function() {'use strict';function hook(object, attr){var func = object[attr]object[attr] = function(){console.log('hooked : ', object, attr)var ret = func.apply(object, arguments)debuggerconsole.log('return : ', ret)return ret}}hook(window, 'btoa')
})();
hook 变量
(function() {'use strict';//全局变量 监控var t = window._t;var window_flag = '_t'; // 要监控的值var window_value = window[window_flag];Object.defineProperty(window, window_flag, { // window 对象上的值get: function() {console.log('访问:',window_value);return t;},set: function(val) {console.log('设置:', val);debugger;t = val;return t;}});
})();
补环境
const jsdom = require("jsdom");
const { JSDOM } = jsdom;const html = '<!DOCTYPE html><p>Hello world</p>';
const dom = new JSDOM(html, {url: "https://dun.163.com/trial/jigsaw",referrer: "https://dun.163.com/",contentType: "text/html"
});document = dom.window.document;window = global;
Object.assign(global, {location: {hash: "",host: "dun.163.com",hostname: "dun.163.com",href: "https://dun.163.com/trial/jigsaw",origin: "https://dun.163.com/",pathname: "/trial/jigsaw",port: "",protocol: "https:",search: "",},navigator: {appCodeName: "Mozilla",appName: "Netscape",appVersion: "5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36",cookieEnabled: true,deviceMemory: 8,doNotTrack: null,hardwareConcurrency: 4,language: "zh-CN",languages: ["zh-CN", "zh"],maxTouchPoints: 0,onLine: true,platform: "MacIntel",product: "Gecko",productSub: "20030107",userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36",vendor: "Google Inc.",vendorSub: "",webdriver: false}
});// 检测环境
window.setTimeout = function () {};
window.setInterval = function () {};
window.clearTimeout = function () {};
window.clearInterval = function () {};
Webpack
常见流程
1. 找加载器对应文件
2. 注释初始化动作,去除环境监测
3. 加载器函数提升到全局作用域
4. 打上模块日志
// Webpack 常见格式
!(function (){
// loader 函数
function o(t) {if (n[t])return n[t].exportsvar i = n[t] = {i: t,l: !1,exports: {},}// console.log('n ', t); 可添加log实现打印调用信息,防止模块缺失return e[t].call(i.exports, i, i.exports, 0),i.l = !0,i.exports
}
// 此处可能大量赋值操作
o(...) // 环境检测函数,直接注释即可免去补环境
})({'key1': function(){/*......*/},'key2': function(){/*......*/},
})