乐于分享
好东西不私藏

JS 加密函数一调用就暴露? AI 帮你写 Hook,参数全抓出来

JS 加密函数一调用就暴露? AI 帮你写 Hook,参数全抓出来

词元视界 · 逆向系列 · 第 10 期

2026-06-17

你做到了反混淆(第 08 期)、学会了算法识别(第 09 期)。现在你盯着一堆还原后的加密代码,知道它是 AES,参数也标出来了——

但你仍然不知道:用户在输入框里打了什么?加密前的明文是什么?密钥怎么拼的?

答案:Hook。而这个 Hook 脚本,Claude Code 可以帮你写完。

一、Hook 是什么?为什么逆向必学?

Hook(钩子),本质上就是在一个函数被调用之前或之后,插入你自己的代码

场景
Hook 能帮你做什么
加密参数提取
在 encrypt() 被调用时,拦截输入(明文+密钥)和输出(密文)
签名算法逆推
Hook sign() 函数,打印所有参与签名的参数和拼接规则
反反调试
Hook debugger 语句、Console 清空函数,让反调试失效
协议还原
Hook XMLHttpRequest.send() / fetch(),抓到完整的请求体

Hook 的核心原理只有一句话:保存原始函数,然后用自己的版本替换它。

二、搭建测试环境:一个真实的后台登录页

为了演示,我们先创建一个模拟的"企业后台登录页"。它包含完整的客户端加密流程——密码在提交前被 SHA256+XOR+Base64 处理:

核心加密函数如下——这就是你今天要 Hook 的目标:

// 核心加密函数 —— Hook 目标

function encryptData(plaintext, secretKey) {

  var timestamp = Date.now().toString();

  var combined = plaintext + '|' + timestamp;

  var hashed = sha256(combined);

  var encrypted = xorEncode(hashed, secretKey);

  return {

    timestamp: timestamp,

    signature: encrypted,

    algorithm: 'HMAC-SHA256-XOR'

  };

}

它的调用链是:用户在表单输入 → encryptData() → SHA256 → XOR → Base64 → 发往服务器

你的任务:在 encryptData() 被调用时,拦截它的输入(明文和密钥)和输出(签名结果),实时打印出来。

三、手动写 Hook?太累了,让 AI 来

传统流程:

1. 在 Sources 面板找到 encryptData()2. 手动重写 window.encryptData = function() {...}3. 保存原始引用 _origin = window.encryptData4. 写 console.log 打印参数5. 处理返回值6. 处理异常7. 美化输出格式如果你有 10 个加密函数要 Hook?写 10 次。换个网站?重写。

现在用 Claude Code。在终端里打开项目目录,跟它说:

分析 index.html 里的 encryptData 函数,

写一个 Hook 脚本 hook.js,要求:

1. 在函数调用时拦截输入参数和返回值

2. 用 console.group 分组美化输出

3. 同时在页面上显示拦截结果

4. 保留原始函数引用,不破坏功能

Claude Code 用 大约 5 秒 就生成了一份完整的 Hook 脚本。

它的思路:

1. 先用 var _origin = window.encryptData 保存原始函数2. 用 window.encryptData = function(...) 替换为新版本3. 在新函数里先console.log原始参数4. 再调用原始版本拿到结果 console.log结果5. 同时在页面上插入一个 div 显示记录6. 最后 return 原始结果保证业务不中断

💡 核心要点:Hook 后不能截断原始函数的返回值——你的业务要照常运行,Hook 只是"旁路监听"。

四、生成的 Hook 脚本长什么样?

以下是 Claude Code 生成的 Hook 脚本核心逻辑——这就是你粘贴到 Console 里直接用的东西:

(function() {

// 1. 保存原始引用

  var _origin = window.encryptData;

// 2. 替换为 Hook 版本

  window.encryptData = function(plaintext, key) {

    console.group('Hook 拦截');

    console.log('明文:', plaintext);

    console.log('密钥:', key);

// 3. 调用原始函数

    var result = _origin.apply(this, arguments);

    console.log('签名:', result.signature);

    console.groupEnd();

// 4. 返回原始结果(不中断业务)

    return result;

  };

})();

一行一行拆解:

步骤
代码
为什么这么做
保存
var _origin = window.xxx
不保存,稍后无法调用原始函数
替换
window.xxx = function()
全局替换,后续所有调用走新函数
代理
_origin.apply(this, args)
保留 this 上下文和所有参数,原样传入
返回
return result
不截断返回值,业务逻辑不受影响

💡 Hook 的三个铁律:① 永远保存原始引用(_origin)② 用 apply() 而不是直接调,保留 this 和 arguments③ return 原始结果,不要截断——你的目的是"监听",不是"拦截"

五、实战效果

把 AI 生成的 hook.js 粘贴到浏览器 Console 里,然后正常登录。你看:

✅ Console 输出:[明文] EMP-2024-001:mypassword123[密钥] k3y_!@#2024_sec[签名] f8a3b2...(加密结果)[算法] HMAC-SHA256-XOR

加密前后的所有信息——明文、密钥、算法、签名——全部实时暴露。你在 Console 里就能看到完整的加密数据流。

六、Hook 的应用三阶跳

阶段
做什么
关键动作
AI 帮你什么
L1函数级
Hook 单个加密函数拦截 encryptData()
保存原始引用 → 替换 → 代理 → 返回
生成完整 Hook 脚本
L2网络级
Hook fetch/XHR拦截整个请求与响应
Hook send() → 读取请求体 → 恢复原始调用
生成 fetch/XHR Hook 模板
L3环境级
Hook window/document/navigator伪装浏览器环境
Object.defineProperty 重写属性
生成环境伪装脚本

七、避坑指南

🕳️ 坑 1:undefined 错误

有些加密函数在 IIFE 闭包里,window 上没有引用,直接 Hook 会 undefined。✅ 让 AI 分析变量的作用域,改用闭包内注入或重写外层的返回值。

🕳️ 坑 2:Hook 的太早或太晚

页面还没加载完就去 Hook → 函数还不存在。✅ 让 AI 生成等待脚本(setInterval 检查函数是否加载完再 Hook)。

🕳️ 坑 3:this 上下文出错

直接在 Hook 里写 _origin(plaintext, key) 而不是 _origin.apply(this, arguments),导致 this 指向 window 而非原始调用者。✅ 严格要求 AI 在生成的脚本中使用 .apply(this, arguments)。

八、Hook 和前面几期怎么配合?

期数
学到了什么
这期怎么用
第08期
JS反混淆——看懂乱码
先反混淆,找到 encryptData 函数名
第09期
算法识别——知道是 AES/RC4
确定 Hook 目标函数的输入输出结构
第10期
Hook ← 本期
拦截参数,验证算法,拿到真实数据

三期合在一起就是完整的逆向流水线:反混淆 → 识算法 → 下Hook → 拿数据

下期预告:网络请求 Hook —— 拦截 fetch/XHR

今天我们 Hook 了单个函数。下期更进一步:Hook 整个网络层。无论网站用 fetch 还是 XMLHttpRequest,所有请求和响应全部拦截。

🔔 下期:网络层 Hook —— 拦截所有请求,实时抓取通信数据

📦 配套代码获取

本文中的 index.html(测试页面)和 hook.js(AI 生成的完整 Hook 脚本),关注「词元视界AI」后回复「Hook」即可下载。

「加密只是障眼法,Hook 之后全是明文」

—— 词元视界AI 出品

📢 转发给做逆向的朋友

点个「在看」让更多做逆向的朋友看到转发到朋友圈或逆向技术群关注「词元视界AI」,每周一篇 AI 实战

关注 词元视界AI

复杂 AI,讲给你听