工具分享篇:JsRpc远程调用(rpc)浏览器方法,免去抠代码补环境

admin 2025年9月23日13:27:06评论199 views字数 2955阅读9分51秒阅读模式

 免责声明:本文所涉及的所有网站链接均为公开可访问的资源,仅用于技术分析和安全研究分享。请勿将本文内容用于任何违法或未经授权的操作。任何因违规使用造成的后果,作者概不负责。

项目链接:
https://github.com/jxhczhl/JsRpc

-- js逆向之远程调用(rpc)免去抠代码补环境

作者-黑脸怪

  • 目录结构
  • 基本介绍
  • 实现
  • 食用方法
    • I 远程调用0:
    • Ⅱ 远程调用1: 浏览器预先注册js方法 传递函数名调用
    • 接口传js代码让浏览器执行
    • 远程调用1:无参获取值
    • 远程调用2:带参获取值
    • 远程调用3:带多个参获 并且使用post方式 取值
    • 远程调用4:获取页面基础信息
    • 打开编译好的文件,开启服务(releases下载)
    • 注入JS,构建通信环境(/resouces/JsEnv_De.js)
    • 连接通信

目录结构

main.go (服务器的主代码)resouces/JsEnv_De.js (客户端注入js环境)config.yaml (可选配置文件)

基本介绍

运行服务器程序和js脚本 即可让它们通信,实现调用接口执行js获取想要的值(加解密)

实现

原理:在网站的控制台新建一个WebScoket客户端链接到服务器通信,调用服务器的接口 服务器会发送信息给客户端 客户端接收到要执行的方法执行完js代码后把获得想要的内容发回给服务器 服务器接收到后再显示出来

说明:本方法可以https证书且支持wss

食用方法

打开编译好的文件,开启服务(releases下载)

如图所示

工具分享篇:JsRpc远程调用(rpc)浏览器方法,免去抠代码补环境

如需更改部分配置,请查看 "其他说明"

api 简介

  • /list
     :查看当前连接的ws服务 (get)
  • /ws
     :浏览器注入ws连接的接口 (ws | wss)
  • /wst
     :ws测试使用-发啥回啥 (ws | wss)
  • /go
     :获取数据的接口 (get | post)
  • /execjs
     :传递jscode给浏览器执行 (get | post)
  • /page/cookie
     :直接获取当前页面的cookie (get)
  • /page/html
     :获取当前页面的html (get)

说明:接口用?group分组 如 "ws://127.0.0.1:12080/ws?group={}" 以及可选参数 clientId clientId说明:以group分组后,如果有注册相同group的 可以传入这个id来区分客户端,如果不传 服务程序会自动生成一个。当访问调用接口时,服务程序随机发送请求到相同group的客户端里。

//注入例子 group可以随便起名(必填) http://127.0.0.1:12080/go?group={}&action={}&param={} //这是调用的接口 group填写上面注入时候的,action是注册的方法名,param是可选的参数 param可以传string类型或者object类型(会尝试用JSON.parse)

注入JS,构建通信环境(/resouces/JsEnv_De.js)

打开JsEnv 复制粘贴到网站控制台(注意:可以在浏览器开启的时候就先注入环境,不要在调试断点时候注入)

工具分享篇:JsRpc远程调用(rpc)浏览器方法,免去抠代码补环境

连接通信

// 注入环境后连接通信vardemo=newHlclient("ws://127.0.0.1:12080/ws?group=zzz");// 可选  //var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zzz&clientId=hliang/"+new Date().getTime())

I 远程调用0:

接口传js代码让浏览器执行

浏览器已经连接上通信后 调用execjs接口就行

importrequestsjs_code="""(function(){    console.log("test")    return "执行成功"})()"""url="http://localhost:12080/execjs"data= {    "group""zzz",    "code"js_code}res=requests.post(urldata=data)print(res.text)
工具分享篇:JsRpc远程调用(rpc)浏览器方法,免去抠代码补环境

Ⅱ 远程调用1: 浏览器预先注册js方法 传递函数名调用

远程调用1:无参获取值
// 注册一个方法 第一个参数hello为方法名,// 第二个参数为函数,resolve里面的值是想要的值(发送到服务器的)demo.regAction("hello",function(resolve){//这样每次调用就会返回“好困啊+随机整数”varJs_sjz="好困啊"+parseInt(Math.random()*1000);resolve(Js_sjz);})

访问接口,获得js端的返回值http://127.0.0.1:12080/go?group=zzz&action=hello

工具分享篇:JsRpc远程调用(rpc)浏览器方法,免去抠代码补环境

远程调用2:带参获取值
//写一个传入字符串,返回base64值的接口(调用内置函数btoa)demo.regAction("hello2",function(resolve,param){//这样添加了一个param参数,http接口带上它,这里就能获得varbase666=btoa(param)resolve(base666);})

访问接口,获得js端的返回值 http://127.0.0.1:12080/go?group=zzz&action=hello2&param=123456

工具分享篇:JsRpc远程调用(rpc)浏览器方法,免去抠代码补环境

远程调用3:带多个参获 并且使用post方式 取值
//假设有一个函数 需要传递两个参数functionhlg(User,Status){returnUser+"说:"+Status;}demo.regAction("hello3",function(resolve,param){//这里还是param参数 param里面的key 是先这里写,但到时候传接口就必须对应的上res=hlg(param["user"],param["status"])resolve(res);})

访问接口,获得js端的返回值

url="http://127.0.0.1:12080/go"data= {    "group""zzz",    "action""hello3",    "param"json.dumps({"user":"黑脸怪","status":"好困啊"}) }print(data["param"]) #dumps后就是长这样的字符串{"user": "u9ed1u8138u602a", "status": "u597du56f0u554a"}res=requests.post(urldata=data#这里换get也是可以的print(res.text)
远程调用4:获取页面基础信息
resp=requests.get("http://127.0.0.1:12080/page/html?group=zzz")     # 直接获取当前页面的htmlresp=requests.get("http://127.0.0.1:12080/page/cookie?group=zzz")   # 直接获取当前页面的cookie

list接口可查看当前注入的客户端信息

原文始发于微信公众号(0xSec笔记本):工具分享篇:JsRpc远程调用(rpc)浏览器方法,免去抠代码补环境

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年9月23日13:27:06
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   工具分享篇:JsRpc远程调用(rpc)浏览器方法,免去抠代码补环境https://cn-sec.com/archives/4504576.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息