跳到主要内容

通过jsrpc实现前端加解密

JSRPC介绍

GitHub:https://github.com/jxhczhl/JsRpc

JSRPC(JavaScript Remote Procedure Call)是一种在浏览器端注入代理脚本后,通过远程调用直接操控网页 JavaScript 函数、绕过前端加密/反爬等保护机制的技术手段。

什么时候会用到

use

如果加密算法简单、容易构造,不建议通过此方式,反而会增加成本。

  • 加密算法难以分析、逻辑理不清,但找到了调用加密的上层函数,直接映射出上层函数提供给远程调用
  • 想要把加密算法通过 http 接口映射出去,方便其他方式调用

实战举例

加密方式分析

打开网站,登录抓包,发现存在 2 个加密。

image-20260707111144863

分析加密方式:(分析过程不写了)

先随机生成一个密钥,把这个密钥用 RSA 加密,再用这个密钥给 data 数据加密。

encrypt-key(随机密钥):RSA

image-20260707112611841

data:AES

image-20260707112816136

加密方式映射为http接口

先把刚才的 2 个加密函数相关的函数都升级为全局函数,可以找到调用加密函数的上层函数,调用更方便。

image-20260707114546294

验证下调用是否成功

1783396083672

接下来就通过 jsrpc 注册 1 个接口,用户只需要输入 data,一次性把这俩数据输出,关键步骤 3 步。(浏览器不要开启调试)

  1. 启动 jsrpc 客户端
  2. 注入通信 JS - https://github.com/jxhczhl/JsRpc/blob/main/resouces/JsEnv_Dev.js,建立链接
  3. 构建加密函数映射接口

image-20260707115449770

把刚才的几个函数映射到 http接口中

demo.regAction("enc", function (resolve,param) {
const encrypt_key = window.pse(window.sse(window.key))
const data = window.aes_enc(JSON.stringify(param), window.key)
resolve({encrypt_key, data});
})

1783396858037

最终通过接口 http://127.0.0.1:12080/go?group=zzz&action=enc&param={%22aa%22:%22bb%22,%22cc%22:%22dd%22} 即可成功调用。

1783396907601

yakit联动

热加载,如果明确知道加密算法、key 等信息,建议用自带的 codec 模块。

# codec plugin

/*
Codec Plugin 可以支持在 Codec 中自定义编码解码,自定义 Bypass 与字符串处理函数

函数定义非常简单
*/
handle = func(origin /*string*/) {
//JSrpc的group
group = "zzz";
//jsrpc的action
action = "enc";
rsp,rep = poc.Post("http://127.0.0.1:12080/go",poc.replaceBody("group="+group+"&action="+action+"&param="+codec.EncodeUrl(origin), false),poc.appendHeader("content-type", "application/x-www-form-urlencoded"))~

return json.loads(rsp.GetBody())["data"];
}