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

JSRPC使用方式

    • 逆向目标
    • 逆向过程
    • 逆向分析
      • 1、什么是 websocket
      • 2、websocket的原理
      • 3、总体过程
        • 3.1 环境说明
        • 3.2 python服务端代码
        • 3.3 python客户端代码
      • 4、Sekiro-RPC
        • 4.1 执行方式
        • 4.2 客户端环境
        • 4.3 参数说明
        • 4.4 SK API
        • 4.5 python代码调试
        • 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 环境说明
pip install websockets
3.2 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客户端代码
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 代码样例如下:
// 连接服务端
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

  • 查看分组列表:http://127.0.0.1:5612/business-demo/groupList

  • 查看队列状态:http://127.0.0.1:5612/business-demo/clientQueue?group=test

  • 调用转发:http://127.0.0.1:5612/business-demo/invoke?group=test&action=test&param=testparm

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/889833.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物联网智能项目(含案例说明)

物联网(Internet of Things,简称IoT)智能项目是指利用物联网技术将各种物理设备、传感器、软件、网络等连接起来,实现设备之间的互联互通,并通过数据采集、传输、处理和分析,实现智能化管理和控制的项目。以…

三品PLM系统赋能中小企业实现数字化转型迈向管理智能化

在全球化的浪潮中,发达国家的企业在管理体系上更具优势,常采用先进的PLM体系提升运营和战略规划效率。相较之下,国内中小企业在PLM系统的应用上明显滞后,中高层管理人员普遍缺乏相应的认知与实践经验,这限制了企业的创…

【命令操作】查看和分析系统各类日志--journalctl

原文链接:【命令操作】查看和分析系统各类日志–journalctl | 统信 | 麒麟 | 方德 Hello,大家好啊!今天给大家带来一篇关于Linux系统上journalctl命令详解的文章。journalctl是systemd的日志查看工具,用于查看和管理系统日志&…

Windows系统编程 - 目录操作、磁盘、卷信息

前言 各位师傅大家好,我是qmx_07,今天继续讲解Windows系统编程的相关知识:目录操作 目录 目录操作 创建目录 通过CreateDirectory函数创建目录 原型: BOOL CreateDirectoryA([in] LPCSTR lpPathName,//目录名称[in, opt…

PostgreSQL学习笔记二:PostgreSQL的系统架构

PostgreSQL 是一种功能强大的开源关系型数据库管理系统,其架构具有以下特点: 一、客户端/服务器架构 客户端 客户端可以是各种应用程序,如 Web 应用、桌面应用等,它们通过网络连接与 PostgreSQL 服务器进行通信。客户端使用标准的…

PHP:下拉列表,颜色展示

PHP展示下拉列表,选项设置为数据库存储颜色进制,colorname是颜色名称,color是颜色进制 一、表结构 produce_info_nav1_colorshow produce_info_nav1 二、核心代码 //查询对应默认颜色 $sql_selcolor "SELECT color FROM produce_i…

List子接口

1.特点:有序,有下标,元素可以重复 2.方法:包含Collection中的所有方法,还包括自己的独有的方法(API中查找) 还有ListIterator(迭代器),功能更强大。 包含更多…

使用超低功耗TinyML模型检测聋哑人士的手势语言

论文标题:Detecting Gesture Language for Deaf and Mute People Using Ultra-Low-Power TinyML Model 作者信息: Basel A. Dabwan,来自也门Albaydha的Albaydha University的信息系统系。Mukti E. Jadhav,来自印度Buldhana区Chi…

HFSS 教程之材料添加

在用HFSS做仿真时,会用到多种材料,其材料库中的材料是有限的,有时仿真对象零件所用的材料并不包含在其材料库中,这时就需要新加材料。HSS自带的材料库,我们称之为系统材料库,新加的材料不能存入系统材料库中…

Kubernetes:Seccomp、AppArmor、SELinux Pod 安全性标准和准入

在云原生环境中,为确保容器化应用的安全运行,Kubernetes 利用了 Linux 内核的三大安全机制:Seccomp、AppArmor 和 SELinux,并引入了 Pod 安全性标准与准入控制来增强 Pod 的安全性。 Seccomp、AppArmor、SELinux 简介 Seccomp、…

前端vue的样式

sass/scss 语法说明 less sass stylus 都是 css 预处理器,语法上稍有差异,作用一样 都是让 css,增强能力,具备变量,函数.. 的能力 sass的语法两种语法 .sass 和 .scss .sass 和 .stylus 语法很像 (了解)要求省略 {} …

php的echo和print输出语句⑥

在 PHP 中有两个基本的输出方式&#xff1a; echo 和 print。 echo 和 print 区别: echo : 可以输出一个或多个字符串 print : 只允许输出一个字符串。 提示&#xff1a;echo 输出的速度比 print 快&#xff0c; echo 没有返回值&#xff0c;print有返回值1。 <?php …

java包和内部类1-cnblog

java包和内部类1 1 类名冲突 没有包的存在&#xff0c;管理类是一个很麻烦的问题&#xff0c;这个时候需要类包处理 2 完整类路径 在平时经常使用的String&#xff0c;并不是它的完整名称 一个完整的类名需要包名和类名的组合&#xff0c;每个类都属于一个类包&#xff0c…

02复写零

复写零 我们先进行异地复写&#xff1a;代码如下 public class Test {public static void main(String[] args) {int []array {1,0,2,3,0,4};duplicateZeros(array);}public static void duplicateZeros(int[] arr) {int [] elemnew int[arr.length];for(int cur0,dest0;des…

【动手学电机驱动】 TI InstaSPIN-FOC(1)电机驱动和控制测试平台

【动手学电机驱动】 TI InstaSPIN-FOC&#xff08;1&#xff09;电机驱动和控制测试平台 1. 本系列的资源需求1.1 电机驱动控制概况1.2 InstaSPIN-FOC 电机控制方案1.3 资源需求 2. 软件安装2.1 安装 CCS2.2 安装 MotorWare2.3 安装 ControlSUITE&#xff08;可选&#xff09; …

neo4j部署保姆级教程

由于公司是基于大数据架构的&#xff0c;让部署neo4j数据库&#xff0c;之前没有接触过&#xff0c;然后紧急学了一下&#xff0c;并且从网上找了一些教程&#xff0c;决定还是记录下来&#xff0c;后续有时间了会在出一篇使用教程 环境准备&#xff08;root用户&#xff09; …

Spring Boot课程问答:技术难题专家解答

摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求&#xff0c;创建了一个计算机管理课程答疑系统的方案。文章介…

Windows docker 部署MiGPT+ 本地Ollama

1. 下载 MiGPT https://github.com/idootop/mi-gpt https://github.com/idootop/mi-gpt/releases/tag/v4.2.0 2. 运行 Ollama qwen模型 3.配置Mi GPT .env .migpt.js 运行docker 运行 需要上网 docker run -d --env-file D:\LLM\mi-gpt-4.2.0\.env -v D:\LLM\mi-gpt-4.2.0…

Oracle登录报错-ORA-01017: invalid username/password;logon denied

接上文&#xff1a;Oracle创建用户报错-ORA-65096: invalid common user or role name 我以为 按照上文在PDB里创建了用户&#xff0c;我以为就可以用PLSQL远程连接了&#xff0c;远程服务器上也安装了对应版本的Oracle客户端&#xff0c;但是我想多了&#xff0c;客户只是新建…

保姆级教程 | VMD输出局部结构及利用TkConsole实现旋转

背景 由于课题需要,现需要展示lammps模拟轨迹中的局部结构(主要是想可视化这里的结果:保姆级教程 | 输出分子动力学轨迹文件输出特定原子范围内的化学环境),因为ovito效果有点笨笨的,所以我这里选用VMD软件为例进行操作,效果图(超级好看夸夸): (说明:主要的分子构…