【js逆向学习】极志愿 javascript+python+rpc

JSRPC使用方式

    • 逆向目标
    • 逆向过程
    • 逆向分析
      • [1、什么是 websocket](#1、什么是 websocket)
      • 2、websocket的原理
      • 3、总体过程
        • [3.1 环境说明](#3.1 环境说明)
        • [3.2 python服务端代码](#3.2 python服务端代码)
        • [3.3 python客户端代码](#3.3 python客户端代码)
      • 4、Sekiro-RPC
        • [4.1 执行方式](#4.1 执行方式)
        • [4.2 客户端环境](#4.2 客户端环境)
        • [4.3 参数说明](#4.3 参数说明)
        • [4.4 SK API](#4.4 SK API)
        • [4.5 python代码调试](#4.5 python代码调试)
        • [4.6 代码注入流程](#4.6 代码注入流程)
    • 逆向总结

逆向目标

网址:https://www.jizhy.com/44/rank/school

接口:https://www.jizhy.com/open/sch/rank-list

加密参数:

  • sign

  • app_id

逆向过程

此目标网站前面已经分析过了,感兴趣的可以去我的主页看下具体的分析过程 大学竞争力2021排行榜 , 本篇文章只介绍 rpc 的使用

逆向分析

要使用 rpc 必然要先了解websocket

1、什么是 websocket

  • WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)
  • 它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的
  • Websocket是一个持久化的协议

2、websocket的原理

  • websocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一个类似tcp的连接,从而方便它们之间的通信
  • 在websocket出现之前,web交互一般是基于http协议的短连接或者长连接
  • websocket是一种全新的协议,不属于http无状态协议,协议名为"ws"

3、总体过程

  • 首先,客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;
  • 然后,服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;
  • 最后,客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。
3.1 环境说明
bash 复制代码
pip install websockets
3.2 python服务端代码
python 复制代码
import asyncio
import websockets

# 接收客户端消息并处理,这里只是简单把客户端发来的返回回去
async def recv_msg(websocket):
    while True:
        recv_text = await websocket.recv()
        response_text = f"your submit context: {recv_text}"
        await websocket.send(response_text)

# 服务器端主逻辑
# websocket和path是该函数被回调时自动传过来的,不需要自己传
async def main_logic(websocket, path):
    await recv_msg(websocket)

# 把ip换成自己本地的ip
start_server = websockets.serve(main_logic, '127.0.0.1', 8000)
# 如果要给被回调的main_logic传递自定义参数,可使用以下形式
# 一、修改回调形式
# import functools
# start_server = websockets.serve(functools.partial(main_logic, other_param="test_value"), '10.10.6.91', 5678)
# 修改被回调函数定义,增加相应参数
# async def main_logic(websocket, path, other_param)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
3.3 python客户端代码
python 复制代码
import asyncio
import websockets

# 向服务器端发送认证后的消息
async def send_msg(websocket):
    while True:
        _text = input("please enter your context: ")
        if _text == "exit":
            print(f'you have enter "exit", goodbye')
            await websocket.close(reason="user exit")
            return False
        await websocket.send(_text)
        recv_text = await websocket.recv()
        print(f"{recv_text}")

# 客户端主逻辑
async def main_logic():
    async with websockets.connect('ws://127.0.0.1:8000') as websocket:
        await send_msg(websocket)

asyncio.get_event_loop().run_until_complete(main_logic())

4、Sekiro-RPC

了解了上述内容之后我们就可以进入主题了,RPC 在逆向中,简单来说就是将本地和浏览器,看做是服务端和客户端,二者之间通过 WebSocket 协议进行 RPC 通信,在浏览器中将加密函数暴露出来,在本地直接调用浏览器中对应的加密函数,从而得到加密结果,不必去在意函数具体的执行逻辑,也省去了扣代码、补环境等操作,可以省去大量的逆向调试时间。对于业务时间比较急着上的项目可以作为一种临时方案。

官网地址:https://sekiro.iinti.cn/sekiro-doc/

4.1 执行方式

首先要有 Java 环境,服务安装有三种方式,具体安装教程参考sekiro安装教程

4.2 客户端环境

链接

4.3 参数说明
  • 使用原理:客户端注入到浏览器环境,然后通过 SekiroClientSekiro 服务器通信,即可直接 RPC 调用浏览器内部方法官方提供的 SekiroClient 代码样例如下:
javascript 复制代码
// 连接服务端
var client = new SekiroClient("ws://127.0.0.1:5612/business-demo/register?group=rpc-test&clientId="+Math.random());
// 业务接口 
client.registerAction("register",function(request, resolve, reject){
    resolve(request['params']);
})
  • group :业务类型(接口组),每个业务一个 groupgroup 下面可以注册多个终端(SekiroClient),同时group 可以挂载多个 Action

  • clientId :指代设备,多个设备使用多个机器提供 API 服务,提供群控能力和负载均衡能力;

  • SekiroClient :服务提供者客户端,主要场景为手机/浏览器等。最终的 Sekiro 调用会转发到 SekiroClient。每个 client 需要有一个惟一的 clientId

  • registerAction :接口,同一个 group 下面可以有多个接口,分别做不同的功能;

  • resolve:将内容传回给服务端的方法;

  • request:服务端传过来的请求,如果请求里有多个参数,可以以键值对的方式从里面提取参数然后再做处理。

4.4 SK API

Sekiro 为我们提供了一些 API

4.5 python代码调试
python 复制代码
# encoding: utf-8
"""
@author: 夏洛
@QQ: 1972386194
@file: 测试.py
"""
import requests
params = {"group": "rpc-test",
        "action": "register",
        "params": "测试文本"
        }
res = requests.get("http://127.0.0.1:5612/business-demo/invoke",params=params)
print(res.text)
4.6 代码注入流程
  • 定位到具体的加密位置

  • 注入RPC代码,使用注册后的 js脚本 替换原来的脚本

    注入后观察控制台,发现连接成功

  • python请求

    使用上面提供的 python 代码去请求

逆向总结

以上就是 jsrpc 的介绍,希望能帮到大家,欢迎大家留言共同探讨 sekiro 的更多用法

相关推荐
yqcoder18 分钟前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
会发光的猪。1 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js
一念之坤1 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
天下代码客1 小时前
【vue】vue中.sync修饰符如何使用--详细代码对比
前端·javascript·vue.js
猫爪笔记1 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
wxl7812272 小时前
如何使用本地大模型做数据分析
python·数据挖掘·数据分析·代码解释器
NoneCoder2 小时前
Python入门(12)--数据处理
开发语言·python
pq113_62 小时前
ftdi_sio应用学习笔记 3 - GPIO
笔记·学习·ftdi_sio
澄澈i2 小时前
设计模式学习[8]---原型模式
学习·设计模式·原型模式
Domain-zhuo2 小时前
什么是JavaScript原型链?
开发语言·前端·javascript·jvm·ecmascript·原型模式