qq代挂网站建设,上国外网站的host,freedns免费域名申请,企业信息查询系统官网山东省【Web逆向】万方数据平台正文的逆向分析#xff08;上篇--加密发送请求#xff09;—— 逆向protobuf声明一、了解protobuf协议#xff1a;二、前期准备#xff1a;二、目标网站#xff1a;三、开始分析#xff1a;我们一句句分析#xff1a;先for循环部分#xff1a;后…
【Web逆向】万方数据平台正文的逆向分析上篇--加密发送请求—— 逆向protobuf声明一、了解protobuf协议二、前期准备二、目标网站三、开始分析我们一句句分析先for循环部分后面就是给a赋值了四、写proto文件核心声明
本文章中所有内容仅供学习交流相关链接做了脱敏处理若有侵权请联系我立即删除
一、了解protobuf协议
ProtobufProtocol Buffer是 Google 开发的一套数据存储传输协议为二进制序列化格式可用作 JSON 或 XML 等格式的更有效替代方案。开发人员可以在 .proto 文件中定义消息格式并使用 protobuf 编译器protoc按他们选择的语言生成消息处理程序。Protobuf 编码是二进制的与 json、xml 不同它不是可读的也不容易手动修改。Protobuf 能够把数据压缩得很小所以传输数据就比 xml 和 json 快几倍使用其有利于提高效率但同时增加了分析或修改数据的难度。
序列化 (Serialization) 是指将对象转换为字节序列的过程在序列化期间对象将其当前状态写入到临时或持久性存储区以后可以通过从存储区中读取或反序列化对象的状态重新创建该对象。
二、前期准备
下载protoc文件找对应版本下载 然后添加到环境变量便于之后使用。 二、目标网站
基于矢量光场空间调制的光波偏振方向解算方法研究
打开网站找到我们这次需要分析的包。 返回数据也是乱码 经过查资料观察返回的content-type为application/grpc-webproto 是以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的数组他的长度是5n。
s 3; 0 s; s--这里可以确定整个循环的次数4次。
因为js是以;为结束的所以相当于下列语句循环了4次那这步操作是干嘛的呢
f[s] n % 256,
n 8;给f数组各位赋值的刚刚好f数组就是4位。所以说先给f的第四位赋值相当于f[3] 再 n进行移位操作得到
f[3] 27%25627 27 80 n0
f[2] 0%256 0 0 80 n0
f[1] 0%256 0 0 80 n0
f[0] 0%256 0 0 80 n0f[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() 方法用于从指定数组中读取值并将其存储在类型化数组中。
有两个参数typedarrayoffset(可选默认为 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(rtest.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;q0.9,zh-TW;q0.8,Content-Type: application/grpc-webproto,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, databytes_head form_data, headersheader)
print(res.content)发送请求后返回的数据