【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 的更多用法

相关推荐
五羟基己醛40 分钟前
【学习笔记】SquareLine Studio安装教程(LVGL官方工具)
笔记·学习·ui
luthane2 小时前
python 实现algorithm topo卡恩拓扑算法
数据结构·python·算法
歌者長門2 小时前
AD21中如何给过孔添加盖油
笔记·学习·pcb工艺
坚持学习的你3 小时前
Jax(Random、Numpy)常用函数
人工智能·pytorch·python·jax
ZPC82103 小时前
Pytorch详解-Pytorch核心模块
人工智能·pytorch·python·深度学习·机器学习
985小水博一枚呀3 小时前
【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。
人工智能·python·深度学习·极限学习机
985小水博一枚呀3 小时前
【深度学习基础模型】液态状态机(Liquid State Machines, LSM)详细理解并附实现代码。
人工智能·python·rnn·深度学习
月夕花晨3743 小时前
C++学习笔记(50)
c++·笔记·学习
skywalk81634 小时前
昇思学习打卡营学习记录:Pix2Pix实现图像转换
人工智能·学习