JS逆向-Hook定位方法 作者: ciniao 时间: 2026-01-15 分类: AI文摘 在JS逆向过程中,hook技术是定位加密参数的关键技术之一。本文将介绍几种快速定位JS逆向加密参数的hook脚本方法。 ## 油猴脚本框架 所有hook脚本都可以在油猴脚本中使用,以下是基础框架: ```javascript // ==UserScript== // @name omom // @namespace anyway // @match https://xxx.xx.xx.com/* // @grant none // @version 1.0 // @author aimAPS // @description 2025/11/11 08:08:08 // @run-at document-start // ==/UserScript== (function () { // 这里添加所需的 hook 代码 })(); ``` **重要提示**: - 必须修改`@match`中的网址为需要hook的目标网站 - `@run-at`必须设置为`document-start`,确保在网页加载前执行hook代码 ## JSON序列化/反序列化Hook 当请求和响应数据都是JSON格式时,可以使用以下脚本快速定位JSON处理位置: ```javascript // Hook JSON.stringify 方法 const originalStringify = JSON.stringify; JSON.stringify = function (params) { console.log("[Hook] JSON.stringify 参数:", params); // 检测关键加密参数(如token、sign等) if (typeof params === 'object' && params !== null) { if ('dimensionTime' in params || 'propertyCode' in params) { debugger; // 触发断点 } } return originalStringify.apply(this, arguments); }; // Hook JSON.parse 方法 const originalParse = JSON.parse; JSON.parse = function (text) { console.log("[Hook] JSON.parse 输入数据:", typeof text, text); // 检测解密后的响应数据 if (typeof text === 'string' && text.includes('{')) { debugger; // 触发断点 } return originalParse.apply(this, arguments); }; ``` ## Headers生成和读取Hook ### Authorization Header Hook ```javascript // headers hook 当header中包含Authorization时,则插入断点 var code = function(){ var org = window.XMLHttpRequest.prototype.setRequestHeader; window.XMLHttpRequest.prototype.setRequestHeader = function(key,value){ if(key=='Authorization'){ debugger; } return org.apply(this,arguments); } } var script = document.createElement('script'); script.textContent = '(' + code + ')()'; (document.head||document.documentElement).appendChild(script); script.parentNode.removeChild(script); ``` ### Cookie Hook方法 **方法一:defineProperty** ```javascript // document 为要hook的对象 ,属性是cookie Object.defineProperty(document, 'cookie', { // hook set方法也就是赋值的方法,get就是获取的方法 set: function (val) { // 这样就可以快速给下面这个代码行下断点,从而快速定位设置cookie的代码 debugger; // 在此处自动断下 console.log('Hook捕获到set-cookie ->', val); return val; } }) ``` **方法二:defineGetter/defineSetter** ```javascript var code = function(){ var org = document.cookie.__lookupSetter__('cookie'); document.__defineSetter__("cookie",function(cookie){ if(cookie.indexOf('TOKEN')>-1){ debugger; } org = cookie; }); document.__defineGetter__("cookie",function(){return org;}); } var script = document.createElement('script'); script.textContent = '(' + code + ')()'; (document.head||document.documentElement).appendChild(script); script.parentNode.removeChild(script); // 当cookie中匹配到了 TOKEN, 则插入断点。 ``` ## 快速定位Cookie生成请求 在Chrome开发者工具中,可以通过以下步骤快速定位特定cookie的生成请求: 1. 在Application选项卡的Cookies中,找到目标cookie 2. 右键点击该cookie 3. 选择"显示涉及此cookie的请求" 4. 系统会自动跳转到Network选项卡并过滤出相关请求 5. 查看第一个请求即可找到cookie的生成位置 ## eval执行代码Hook ### eval代理方法 ```javascript // 代理eval eval = new Proxy(eval,{ // 如果代理的是函数 查看调用 就用apply属性 // 第二个参数是prop 这里用不上 因为是属性,eval只是个函数 所以prop为undefind 这里设置了下划线 —— apply: (target,_,arg)=>{ // target 是被代理的函数或对象名称,当前是[Function: eval] // arg是传进来的参数,返回的是个列表 console.log(arg[0]) } }) ``` ### 关键词检测Hook ```javascript // 配置检测关键词(支持正则表达式) const TARGET_PATTERN = /login|encrypt|signature/; // 保存原生eval const _nativeEval = window.eval; // 重定义eval window.eval = function (code) { console.log("[eval监控] 捕获关键代码:\n", code.slice(0, 200) + "..."); // 调试触发逻辑 if (TARGET_PATTERN.test(code)) { console.log("[eval监控] 捕获关键代码:\n", code.slice(0, 200) + "..."); // 截取前200 debugger; // 自动断点 } // 执行原始eval return _nativeEval.call(window, code); }; // 伪装成原生eval Object.defineProperty(window.eval, 'toString', { value: () => 'function eval() { [native code] }', writable: false, configurable: false }); ``` ## Function执行Hook Function是JS中动态创建函数的方式,可以使用代理方式拦截: ```javascript function hookFunction(func) { return new Proxy(func, { construct(target, args) { console.log(`拦截构造函数: ${target.name}, 参数: ${args}`); return Reflect.construct(target, args); }, apply(target, thisArg, args) { console.log(`拦截函数调用: ${target.name}, 参数: ${args}`); return Reflect.apply(target, thisArg, args); } }); } // Hook 所有通过 Function 创建的函数 window.Function = hookFunction(window.Function); ``` ## Ajax请求定位 对于Ajax请求,可以直接使用浏览器自带的XHR断点功能: 1. 打开Chrome开发者工具 2. 进入Sources选项卡 3. 在右侧找到XHR/fetch Breakpoints 4. 添加包含特定关键词的断点 标签: none
评论已关闭