第98天-JS逆向终极提效!告别抠代码,JSRpc/JsEncrypter联动BurpSuite,让加密无所遁形!

admin 2026-03-27 01:36:29 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍了两种提升JS逆向效率的工具:JSRpc和JsEncrypter。JSRpc通过WebSocket远程调用真实浏览器中的加密函数,避免环境模拟;JsEncrypter则利用PhantomJS无头浏览器执行代码。两者均可与BurpSuite联动,实现自动化加密,适用于复杂的Web安全测试场景。 综合评分: 85 文章分类: WEB安全,渗透测试,红队,技术标准,解决方案


cover_image

第98天-JS逆向终极提效!告别抠代码,JSRpc/JsEncrypter联动BurpSuite,让加密无所遁形!

原创

Сяо Яо Сяо Яо

AlphaNet

2026年3月20日 12:15 韩国

还在为复杂的JS混淆、环境检测和反调试而头疼吗?🤯 每次逆向都要花费大量时间“抠”代码、补环境,效率低下不说,还容易掉进各种陷阱。今天,就让我们一起探索几种JS逆向的“降维打击”利器,彻底解放你的生产力!

本文将带你深入了解 JSRpcautoDecoderJsEncrypter 这三大神器,通过项目联动,实现浏览器函数远程调用和BurpSuite自动化加密,让你专注于核心逻辑,告别繁琐的体力活!

🧐 是什么 & 为什么:JS逆向的痛点与新思路

传统的JS逆向,我们通常需要:

  1. 定位加密函数:通过断点调试、关键字搜索等方式找到核心加密逻辑。

  2. “抠”出JS代码:将加密函数及其所有依赖项完整地复制出来。

  3. 模拟执行环境:在Node.js或Python中模拟 windowdocument 等浏览器特有的对象和环境。

  4. 编写调用脚本:使用 execjs 等库执行JS代码,完成加密。

这个过程不仅繁琐,而且一旦遇到环境检测(如检测 navigator.webdriver)或复杂的依赖(如Webpack打包的模块),补环境的工作就会变成一场噩梦。

💡 新思路: 如果我们能直接“命令”浏览器来执行它自己的加密函数,不就不需要模拟环境了吗?这就是 JSRpc 的核心思想!


🛠️ 怎么做 (一):JSRpc – 远程调用浏览器函数

JSRpc (JavaScript Remote Procedure Call) 是一种远程过程调用协议。简单来说,它允许我们在本地(如Python脚本)直接调用一个正在运行的浏览器环境中的JavaScript函数。我们只需要找到加密函数,而无需关心其内部复杂的实现和依赖。

步骤 1:植入JSEnv并启动WebSocket服务端 🛰️

首先,我们需要在目标网站的浏览器环境中植入一个JS脚本,并启动一个本地的WebSocket服务端作为通信桥梁。

  1. 执行JS脚本:在浏览器的开发者工具Console中,执行 resources/JsEnv_Dev.js 的内容。这个脚本会在页面中创建一个通信环境。

  2. 启动服务端:运行官方提供的 window_amd64.exe 程序。启动后,它会监听一个本地端口(默认为12080),等待客户端连接。

步骤 2:本地替换JS文件,注册加密接口 📝

假设我们已经定位到加密函数位于 encrypt.js 文件中。现在,我们需要使用Fiddler、Charles或BurpSuite等抓包工具,将这个远程的JS文件替换为我们修改过的本地版本。

在本地的 encrypt.js 文件末尾添加以下代码:


javascript // 1. 连接到本地的JSRpc WebSocket服务 // group和name可以自定义,用于标识不同的客户端 var demo = new Hlclient(“ws://127.0.0.1:12080/ws?group=xiaodi&name=xiaodisec”);

// 2. 注册一个名为 “pass” 的动作(Action) // 当服务端请求这个动作时,执行回调函数 demo.regAction(“pass”, function(resolve, param) { // 3. 在这里调用页面原有的加密函数 // param 是从服务端接收到的待加密数据 // resolve 是一个回调,用于将加密结果返回给服务端 resolve(encrypt.encrypt(param)); });

</code></pre>
</div>

**核心逻辑**:
*   `new Hlclient(...)`:连接到我们第一步启动的WS服务。
*   `demo.regAction("pass", ...)`:向JSRpc服务端注册一个名为 `pass` 的接口。当服务端收到执行 `pass` 接口的请求时,就会调用我们提供的回调函数。
*   `resolve(encrypt.encrypt(param))`:在回调函数中,我们调用原始JS文件中的 `encrypt.encrypt()` 方法处理传入的 `param`,并通过 `resolve` 将结果异步返回。

#### 步骤 3:访问接口,测试加密 ✅

刷新目标页面,确保我们修改过的JS文件被成功加载。现在,打开一个新的浏览器标签页,访问以下URL,即可远程调用加密函数:

<div style="overflow-x:auto;">
<pre><code>

```

http://127.0.0.1:12080/go?group=xiaodi&name=xiaodisec&action=pass¶m=123456

```
</code></pre>
</div>

*   `group` 和 `name`:必须与JS代码中连接时使用的名称一致。
*   `action`:要调用的接口名称,即 `pass`。
*   `param`:要传递给加密函数的参数,这里是 `123456`。

如果一切正常,页面会返回 `123456` 加密后的结果。至此,我们已经成功实现了对浏览器中JS函数的远程调用!

---

### 🔗 联动篇 (一):JSRpc + autoDecoder 实现Burp自动化

手动访问URL来加密显然不够高效。我们可以结合BurpSuite的 `autoDecoder` 插件,实现自动化拦截和加密请求。

1.  **完成JSRpc配置**:确保上述JSRpc流程可以正常工作。
2.  **配置autoDecoder接口**:在 `autoDecoder` 插件中,设置一个API接口地址,指向我们本地监听的服务。
3.  **编写Python监听服务**:创建一个简单的Python Flask或FastAPI服务,它接收 `autoDecoder` 发来的数据,然后请求JSRpc的加密URL,并将结果返回给 `autoDecoder`。
    > **注意**:确保 `autoDecoder` 插件配置中的 `data` 指向与JSRpc的 `param` 一致,并开启插件的 `debug` 模式以便调试。
4.  **测试加解密**:在Burp中拦截一个需要加密的请求,`autoDecoder` 会自动将待加密字段发送到你的Python服务,服务调用JSRpc完成加密后,再将密文返回填充到请求中。

> 更多关于 `autoDecoder` 的联动细节,可以参考这篇文章:`https://forum.butian.net/share/2889`

---

### 🛠️ 怎么做 (二):JsEncrypter - 另一种强大的选择

`JsEncrypter` 是另一款BurpSuite插件,它通过 `PhantomJS` (一个无头浏览器) 来执行JS代码,同样达到了绕过环境检测的目的。

#### 步骤 1:下载并配置 PhantomJS 🌐

*   **下载**:从官方网站 `https://phantomjs.org/download.html` 下载对应你操作系统的版本。
*   **配置环境变量**:将 `phantomjs.exe` 所在的目录路径添加到系统的 `Path` 环境变量中,以便在任何位置都能通过命令行调用它。

#### 步骤 2:加载 JsEncrypter 插件 🔌

*   **下载**:从 `https://github.com/c0ny1/jsEncrypter/releases` 下载最新的 `jar` 文件。
*   **加载**:在 BurpSuite 的 `Extender` -> `Extensions` 标签页中,点击 `Add`,选择下载的 `jar` 文件进行加载。

#### 步骤 3:提取核心JS代码与加密逻辑 ✂️

假设我们逆向得到的加密逻辑如下:

<div style="overflow-x:auto;">
<pre><code class="language-javascript">
```javascript
// 假设这是从目标网站扒下来的加密逻辑
// 它依赖一个名为 JSEncrypt.js 的库文件
var r = new JSEncrypt();
var o = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBH55Tf3TL5V/c5+s2B9YucAs..."; // 公钥
r.setPublicKey(o);
var s = r.encrypt(password);
return s;

```

```

我们需要准备两个文件:

1. `JSEncrypt.js`

2. `my_encrypt_template.js`

#### 步骤 4:编写 PhantomJS 模板文件 📄

```

```javascript
// 1. 引入依赖的JS库文件
var wasSuccessful = phantom.injectJs('JSEncrypt.js');

// 2. 封装原始的加密逻辑为一个函数
function encrypt(password) {
var r = new JSEncrypt();
var o = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBH55Tf3TL5V/c5+s2B9YucAs..."; // 你的公钥
r.setPublicKey(o);
var s = r.encrypt(password);
return s;
}

// 3. JsEncrypter插件会调用的处理函数 (函数名固定)
function js_encrypt(payload) {
/********** 在这里编写调用加密函数进行加密的代码 /
var newpayload = encrypt(payload);
/**********************************************/
return newpayload;
}

```
</code></pre>
</div>

#### 步骤 5:启动模板文件,连接插件 🚀

<div style="overflow-x:auto;">
<pre><code class="language-bash">

bash phantomjs myencrypttemplate.js


此时,PhantomJS 会启动一个服务,等待 JsEncrypter 插件的连接。回到BurpSuite的 JsEncrypter 标签页,点击 Connect,如果状态显示为 Connected,则表示连接成功。

步骤 6:实战!Burp发包自动加密 🎯

现在,拦截一个需要加密的请求(例如登录请求),右键选择 Send to JsEncrypter。在 JsEncrypter 窗口中,选择需要加密的参数值,然后点击 Encrypt。插件会将该值发送给 PhantomJS 执行加密,并返回密文。确认无误后,就可以在 RepeaterIntruder 中正常发包了,在请求设置中勾选引用该插件即可实现自动化。


✨ 总结:核心要点 Cheat Sheet

| 工具 | 核心原理 | 优点 | 适用场景 | | — | — | — | — | | JSRpc | WebSocket通信,远程调用真实浏览器中的JS函数。 | 完美复现浏览器环境,无需担心环境检测,性能较高。 | 目标网站JS逻辑复杂、依赖项多、有环境检测。 | | JsEncrypter | 通过PhantomJS (无头浏览器) 执行JS代码。 | 配置相对简单,独立于目标网站的浏览器进程。 | 加密逻辑相对独立,依赖文件清晰,可快速搭建测试环境。 |


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:AlphaNet Сяо Яо Сяо Яо《第98天-JS逆向终极提效!告别抠代码,JSRpc/JsEncrypter联动BurpSuite,让加密无所遁形!》

评论:0   参与:  0