免责声明:本文所涉及的所有网站链接均为公开可访问的资源,仅用于技术分析和安全研究分享。请勿将本文内容用于任何违法或未经授权的操作。任何因违规使用造成的后果,作者概不负责。
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下载)
如图所示
如需更改部分配置,请查看 "其他说明"
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={}¶m={} //这是调用的接口 group填写上面注入时候的,action是注册的方法名,param是可选的参数 param可以传string类型或者object类型(会尝试用JSON.parse)
注入JS,构建通信环境(/resouces/JsEnv_De.js)
打开JsEnv 复制粘贴到网站控制台(注意:可以在浏览器开启的时候就先注入环境,不要在调试断点时候注入)
连接通信
// 注入环境后连接通信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(url, data=data)print(res.text)

Ⅱ 远程调用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
远程调用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¶m=123456
远程调用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(url, data=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)浏览器方法,免去抠代码补环境
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-






评论