JS逆向hook通用脚本合集

文章介绍了JavaScript中使用hook技术来监控和调试应用的方法,包括cookie、header参数、debugger语句、URL、JSON.stringify和JSON.parse方法、eval函数以及Function的hook,同时展示了如何实现通用的反调试策略。

1. cookie 通用hook

Cookie Hook 用于定位 Cookie 中关键参数生成位置,以下代码演示了当 Cookie 中匹配到了 v 关键字, 则插入断点

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

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

3. hook过debugger

// 先保留原 constructor
// 1. 比如判断是否有该debugger词语,替换为同等长度的空格(避免判断长度)
Function.prototype.constructor_ 
### 通用 Hook 脚本开发与函数拦截技术 Hook 技术是软件逆向工程和调试中常用的一种手段,通过拦截特定函数的调用或修改其执行逻辑,可以实现对程序行为的监控、分析甚至篡改。在不同平台和语言环境下,Hook 的实现方式各有差异,但核心思想相似。 #### JavaScript 环境下的 Hook 实现 在浏览器环境中,可以通过重写 `Function` 构造器来实现对所有新创建函数的拦截。例如,使用 `Proxy` 对象包装原始 `Function` 构造器,并在其 `apply` 和 `construct` 拦截器中添加日志记录或其他处理逻辑: ```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); } }); } // 替换全局 Function 构造器 window.Function = hookFunction(window.Function); ``` 上述代码将替换全局作用域内的 `Function` 构造器,使得任何后续通过 `new Function(...)` 创建的函数都会被自动包装成一个代理对象,从而允许开发者在每次函数被调用或作为构造函数使用时插入自定义逻辑[^1]。 #### Lua 环境下的 Hook 实现 对于 Lua 脚本语言,同样可以通过修改标准库函数或者重定义全局变量的方式来实现 Hook。比如,要拦截 `os.date` 函数以返回自定义的时间格式字符串,可以这样做: ```lua local original_os_date = os.date os.date = function(format, time) print("拦截到 os.date 调用") -- 自定义逻辑 return original_os_date("%Y-%m-%d %H:%M:%S", time) end ``` 此方法适用于需要临时改变某些标准行为而不影响其他部分的情况。此外,在更复杂的场景下,还可以利用 Lua 的元编程特性进行深层次的函数拦截和行为替换[^2]。 #### C/C++ 环境下的 API Hook 在 Windows 平台上,针对本地应用程序(如 VC++ 编写的程序),通常采用 DLL 注入配合 IAT(Import Address Table)修补或直接内存写入跳转指令的方法来实现对特定 API 的 Hook。例如,想要拦截 `fopen` 函数调用,首先需要定位该函数在目标进程地址空间中的实际地址,然后将其入口点指向自定义的替代函数: ```cpp // 假设 fopen_hook 是用户定义的替代函数 void* fopen_hook(const char* filename, const char* mode) { // 自定义逻辑 std::cout << "拦截 fopen 调用: " << filename << ", Mode: " << mode << std::endl; // 调用原始 fopen 函数 return ((void*(*)(const char*, const char*))original_fopen)(filename, mode); } ``` 为了正确地将控制流转移到 `fopen_hook`,必须先找到 `fopen` 在导入表中的 RVA(Relative Virtual Address),接着修改相应内存区域的保护属性并写入跳转指令。这类操作涉及到底层系统编程知识,因此实施时需格外小心[^3]。 #### Android 平台上的 Java 方法 Hook 当面对基于 Android 的应用时,Frida 提供了一种便捷的方式来动态地 Hook Java 方法。借助 Frida 的 JavaScript API,可以轻松地替换类的方法实现,如下所示为如何 Hook `com.luoge.com.Utils.setFlag` 方法并更改其输入参数及输出结果: ```javascript function demo1() { var utils = Java.use("com.luoge.com.Utils"); utils.setFlag.implementation = function(str) { console.log("参数1--》" + str); var res = this.setFlag("52am"); console.log("返回值--》" + res); return res; }; } function main() { Java.perform(function () { demo1(); }); } setImmediate(main); ``` 这段脚本会在目标应用运行时动态替换 `setFlag` 方法,每当该方法被调用时,都会先打印出传入的参数,再调用原始方法并将固定字符串 `"52am"` 作为新的参数传递进去,最后记录下方法返回的结果[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孜孜孜孜不倦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值