【Web逆向】万方数据平台正文的逆向分析(上篇--加密发送请求)—— 逆向protobuf

news/2024/3/29 21:38:51/文章来源:https://blog.csdn.net/a6661314/article/details/129213846

【Web逆向】万方数据平台正文的逆向分析(上篇--加密发送请求)—— 逆向protobuf

  • 声明
  • 一、了解protobuf协议:
  • 二、前期准备:
  • 二、目标网站:
  • 三、开始分析:
    • 我们一句句分析:
      • 先for循环部分:
      • 后面就是给a赋值了:
  • 四、写proto文件(核心)

声明

本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除!

一、了解protobuf协议:

Protobuf(Protocol Buffer)是 Google 开发的一套数据存储传输协议,为二进制序列化格式,可用作 JSON 或 XML 等格式的更有效替代方案。开发人员可以在 .proto 文件中定义消息格式,并使用 protobuf 编译器(protoc)按他们选择的语言生成消息处理程序。Protobuf 编码是二进制的,与 json、xml 不同,它不是可读的,也不容易手动修改。Protobuf 能够把数据压缩得很小,所以传输数据就比 xml 和 json 快几倍,使用其有利于提高效率,但同时增加了分析或修改数据的难度。

序列化 (Serialization) 是指将对象转换为字节序列的过程,在序列化期间,对象将其当前状态写入到临时或持久性存储区,以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

二、前期准备:

下载protoc文件:找对应版本下载
在这里插入图片描述
然后添加到环境变量,便于之后使用。

在这里插入图片描述

二、目标网站:

基于矢量光场空间调制的光波偏振方向解算方法研究

打开网站,找到我们这次需要分析的包。

返回数据也是乱码:

在这里插入图片描述

经过查资料,观察返回的content-type为application/grpc-web+proto 是以protobuf数据结构传输的。

在这里插入图片描述

我们用fiddler抓包,过滤掉png和js,只显示主机是d.wanfangdata.com.cn;的

在这里插入图片描述

可以看到getDetailInFormation发送的十六进制数据,黑色16进制数据是发送的数据,蓝色是请求头数据:

在这里插入图片描述

在这里插入图片描述

我们把黑色部分从第六位起(也就是0A)保存为bin文件,如下图:

在这里插入图片描述

三、开始分析:

我们下个xhr断点看看,看看数据是怎么来的。

可以看到数据是以字节集的形式发出的,与上面fd抓包的16进制数据是一一对应的。

在这里插入图片描述

接下来,我们看看数据是怎么来的?跟e来到上一个栈,可以发现是a赋值给e的。

在这里插入图片描述

我们在e赋值的地方下断点,看看a怎么来的,重新调试一次,主要看a怎么构成的。

发现其实核心就是10406行到10415行赋值这一段。

for (n = (e = (0,n.a)(e.getRequestMessage())).length,l = [0, 0, 0, 0],a = new Uint8Array(5 + n),s = 3; 0 <= s; s--)l[s] = n % 256,n >>>= 8;
if (a.set(new Uint8Array(l), 1),a.set(e, 5),e = a,

我们一句句分析:

先for循环部分:

e = (0,n.a) (e.getRequestMessage())

在这里插入图片描述

得到的是一个unit8Array数组,刚刚好就是我们刚才排查出发包的数据从5开始往后数。

n = (e = (0,n.a)(e.getRequestMessage())).length

在这里插入图片描述

这里得到这个数组长度是27。

f = [0, 0, 0, 0]

这里类似设置了一个头,4位空数组

a = new Uint8Array(5 + n)

这里a的初始化,因为我们知道最后a是一个Uint8Array的数组,他的长度是5+n。

s = 3; 0 <= s; s--

这里可以确定整个循环的次数,4次。

因为js是以;为结束的,所以相当于下列语句循环了4次,那这步操作是干嘛的呢?

f[s] = n % 256,
n >>>= 8;

给f数组各位赋值的,刚刚好f数组就是4位。所以说先给f的第四位赋值相当于f[3], 再 n进行>>>=移位操作,得到:

f[3] =27%256=27    27 >>>8=0 =>n=0
f[2] = 0%256 =0    0  >>>8=0 =>n=0
f[1] = 0%256 =0    0  >>>8=0 =>n=0
f[0] = 0%256 =0    0  >>>8=0 =>n=0
f=[0, 0, 0, 27]

在这里插入图片描述

后面就是给a赋值了:

a.set(new Uint8Array(f), 1)

a是数组,然后查mdn文档,可知set方法的作用:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/set

set() 方法用于从指定数组中读取值,并将其存储在类型化数组中。

有两个参数,typedarray,offset(可选,默认为 0)

typedarray对应 new Uint8Array(f)

offset 对应 1

相当于从下标1开始,给a数组插入值f。

所以得到

在这里插入图片描述

这里核心就是这个set方法,不懂查一下就理解了。

a.set(e, 5)

相当于从数组下标5开始把e的值赋值给a

ok,我们到这里已经把a怎么来的理解清楚了,也明白了前面5位是怎么来的。

但是,我们还是没接触到protobuf啊,只是知道了数据得到的大概过程。核心就在(0,n.a)(e.getRequestMessage())里面。

四、写proto文件(核心)

跟进n.a方法

在这里插入图片描述

发现了写protobuf数据格式的关键函数:serializeBinary

在这里插入图片描述

关键点:

根据serializeBinaryToWriter关键函数,可以得到此结构分层,跟进去可以得到包含几个信息

在这里插入图片描述

write + (信息类型)函数,第一个参数代表是第几个。(如下图圈主部分)
在这里插入图片描述

看到writeMessage,后面有serializeBinaryToWriter关键函数,跟进去,就能再次得到此message的结构层次,一样分析,就能得出完整结构。

一个个分析按顺序写proto文件

syntax = "proto3";message SearchService {string getResourcetype = 1;string getId = 2;string getReferer = 3;string getMd5id = 4;string getTransaction = 5;
}

命令行生成可python操作的protobuf文件

在这里插入图片描述
在这里插入图片描述

数据分析:fd抓包下载bin,然后命令行 protoc --decode_raw < test.bin执行,解析protobuf数据结构

在这里插入图片描述

然后对应上面的结构找到对应变量,用python赋值运行:

import test_pb2 as pbSearchRequest = pb.SearchService()
SearchRequest.getResourcetype = 'Periodical'
SearchRequest.getId = 'wlxb202301001'
SearchRequest.getReferer = ''
SearchRequest.getMd5id = ''
SearchRequest.getTransaction = ''
form_data = SearchRequest.SerializeToString()
print(form_data)

在这里插入图片描述

我们验证一下上面输出是否正确,用blackboxprotobuf模块解析,即可看到原始数据(这里用到上面解析出来的bin文件):

import blackboxprotobuf# 1、得到消息类型message_type
with open(r"test.bin", "rb") as fp:data = fp.read()deserialize_data, message_type = blackboxprotobuf.protobuf_to_json(data)print(f"原始数据: {deserialize_data}")print(f"消息类型: {message_type}")# str 转 dictdeserialize_data = eval(deserialize_data)form_data = bytes(blackboxprotobuf.encode_message(deserialize_data, message_type))print(form_data)

在这里插入图片描述

和咱们用proto文件编译出来protobuf文件去解析的输出一样,所以咱们编译没问题!

用python发包,根据上面的分析,发现需要补头5位

bytes_head = bytes([0, 0, 0, 0, len(form_data)])

完整代码(获得数据):

import test_pb2 as pbSearchRequest = pb.SearchService()
SearchRequest.getResourcetype = 'Periodical'
SearchRequest.getId = 'wlxb202301001'
SearchRequest.getReferer = ''
SearchRequest.getMd5id = ''
SearchRequest.getTransaction = ''
form_data = SearchRequest.SerializeToString()
print(form_data)
print(len(form_data))
bytes_head = bytes([0, 0, 0, 0, len(form_data)])
print(bytes_head + form_data)
header = {"Accept": "*/*","Accept-Language": "zh-CN,zh;q=0.9,zh-TW;q=0.8","Content-Type": "application/grpc-web+proto","Origin": "https://s.wanfangdata.com.cn","Referer": "https://d.wanfangdata.com.cn/periodical/wlxb202301001","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
}url = 'https://d.wanfangdata.com.cn/Detail.DetailService/getDetailInFormation'
res = requests.post(url, data=bytes_head + form_data, headers=header)
print(res.content)

发送请求后返回的数据:

在这里插入图片描述

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

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

相关文章

【算法】最短路算法

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…

电子技术——输出阶类型

电子技术——输出阶类型 输出阶作为放大器的最后一阶&#xff0c;其必须有较低的阻抗来保证较小的增益损失。作为放大器的最后一阶&#xff0c;输出阶需要处理大信号类型&#xff0c;因此小信号估计模型不适用于输出阶。尽管如此&#xff0c;输出阶的线性也非常重要。实际上&a…

为什么要用线程池?

1.降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2.提高响应速度。当任务到达时&#xff0c;任务可以不需要的等到线程创建就能立即执行。 3.提高线程的可管理性。线程是稀缺资源&#xff0c;如果无限制的创建&#xff0c;不仅会消耗系统资源&#…

Python实现贝叶斯优化器(Bayes_opt)优化支持向量机回归模型(SVR算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器 (BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。贝叶斯优化器是…

AI_News周刊:第三期

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 2023.02.20—2023.02.25 News 1.OpenAI 现在正在帮助可口可乐改善其营销和运营 2023 年 2 月 21 日——贝恩公司今天宣布与 OpenAI 建立全球服务联盟&#xff0c;OpenAI 是人工智能系统 ChatGPT、DA…

java Spring JdbcTemplate配合mysql实现数据库表数据添加

本文为 java Spring JdbcTemplate 准备工作的续文 如果您还没有大家好JdbcTemplate 的基础环境 可以先查看前文 首先 之前数据库我们已经弄好了 然后 我们在下面创建一个表 我这里叫 user_list 每一个数据库表 要对应一个实体类 这里 我们打开上一文搭建的项目环境 src下创建…

【华为OD机试模拟题】用 C++ 实现 - 英文输入法(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

【原创】java+swing+mysql生肖星座查询系统设计与实现

今天我们来开发一个比较有趣的系统&#xff0c;根据生日查询生肖星座&#xff0c;输入生日&#xff0c;系统根据这个日期自动计算出生肖和星座信息反馈到界面。我们还是使用javaswingmysql去实现这样的一个系统。 功能分析&#xff1a; 生肖星座查询系统&#xff0c;顾名思义…

【CSS】CSS 层叠样式表 ① ( 简介 | CSS 引入方式 - 内联样式 | 内联样式语法 | 内联样式缺点 )

文章目录一、CSS 层叠样式表二、CSS 引入方式 - 内联样式1、内联样式语法2、内联样式缺点3、内联样式代码示例① 核心代码示例② 完整代码示例③ 执行结果一、CSS 层叠样式表 CSS 全称 Cascading Style Sheets , 层叠样式表 ; 作用如下 : 设置 HTML 页面 文本内容 的 字体 , 颜…

【华为OD机试模拟题】用 C++ 实现 - 最少停车数(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

绝对让你明明白白,脚把脚带你盯着 I2C 时序图将 I2C 程序给扣出来(基于STM32的模拟I2C)

目录前言一、关于STM32 I/O端口位的基本结构讲解二、模拟I2C编写前的需知道的知识1、I2C简介2、根据时序编写模拟I2C程序重要的两点Ⅰ、主机发送数据给从机时的时序控制Ⅱ、主机接收来自从机的数据时的时序控制Ⅲ、完整的I2C时序图&#xff08;按写程序的思想分割时序&#xff…

2023年湖北住建厅七大员建筑八大员怎么报考?启程别

2023年湖北住建厅七大员建筑八大员怎么报考&#xff1f;启程别 建筑施工企业关键技术岗位人员可以叫七大员也可以叫八大员&#xff0c;施工现场专业人员&#xff0c;从事相关岗位人员都应该持证上岗。 为什么有的叫七大员&#xff1f;有的叫八大员呢&#xff1f;甚至还有五大员…

sklearn学习-朴素贝叶斯(二)

文章目录一、概率类模型的评估指标1、布里尔分数Brier Score对数似然函数Log Loss二、calibration_curve&#xff1a;校准可靠性曲线三、多项式朴素贝叶斯以及其变化四、伯努利朴素贝叶斯五、改进多项式朴素贝叶斯&#xff1a;补集朴素贝叶斯ComplementNB六、文本分类案例TF-ID…

【信管12.5】项目集与项目组合管理

项目集与项目组合管理之前学习的 PMP 相关的项目管理知识&#xff0c;其实都是针对一个项目的管理过程。但是&#xff0c;在一个组织企业中&#xff0c;往往不止一个项目&#xff0c;可能会有多个相关联的项目&#xff0c;这种情况就叫做项目集。另外&#xff0c;多个项目一起完…

二叉树——堆

一&#xff0c;树的概念及结构 1.树 4.结点的度&#xff1a;一个节点含有子树的个数称为该结点的度&#xff1b;如&#xff1a;A 的度为6. 5.叶节点或终端节点&#xff1a;度为0的节点称为叶节点&#xff1b;如&#xff1a;B 6.非终端结点或分支节点&#xff1a;度部位0的结…

MySQL基础知识-刷题笔记

数据库刷题笔记 查漏补缺&#xff0c;面试八股文&#xff0c;以下内容未说明的均以MySQL数据库为准 where 不能和聚合函数一起使用 having可以和聚合函数一起使用 having必须与group by一起使用1、SUBSTRING_INDEX(str ,substr ,n)&#xff1a;返回字符substr在str中第n次出现位…

【强化学习】强化学习数学基础:贝尔曼公式

强化学习数学基础&#xff1a;贝尔曼公式强化学习的数学原理课程总览贝尔曼公式&#xff08;Bellman Equation&#xff09;一个示例状态值贝尔曼公式&#xff1a;推导过程贝尔曼公式&#xff1a;矩阵-向量形式&#xff08;Matrix-vector form&#xff09;贝尔曼公式&#xff1a…

基于合作型Stackerlberg博弈的考虑差别定价和风险管理的微网运行策略研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

从网易到支付宝,3年外包生涯做完,我这人生算是彻底废了......

我为什么一直做外包呢&#xff0c;原因是薪资和技术方面。 在华三做了一年外包&#xff0c;薪资5k&#xff0c;功能测试&#xff0c;接触Linux和网络&#xff0c;但是说实在的技术很难沉淀&#xff0c;就像雾里看花一样&#xff0c;过年之后&#xff0c;想走的人都走了&#x…

【vue2小知识】实现axios的二次封装

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;在vue2中实现axios的二次封装 目录 一、平常axios的请求发送方式 二、axios的一次封装…