首页
社区
课程
招聘
[原创]QQ 浏览器 JceStruct 协议
发表于: 2019-4-17 20:28 15758

[原创]QQ 浏览器 JceStruct 协议

2019-4-17 20:28
15758

发现自己写的文章更多是偏向于理论.
现在就写点实战的文章吧.

QQ浏览器返回和发送的数据都是通过JceStruct协议来传输的.当然这个传输过程是经过层层加密的.解密后的内容就是JceStruct协议.

JceStruct 协议和Protobuf 协议有点像,也是采用Key-Value的形式.但感觉比Protobuf更简洁一点.也更简单一点.

我们先来看看Key是怎么组织的.

描述Key的类为:HeadData

可以看到Key被分为了两部分,一部分是tag,一部分是type.

读取Key的函数为

函数功能非常简单.

总结一下:

根据分析type的类型如下:

根据不同的类型对Value的解析就会有所不同.

其中byte,bool,Short,Int,Long, Float,Double的解析都是一样的,只不过读取的字节数不同而已.

我们以Int为例:

可以看到非常简单,读到指定类型,那么getXXX就可以了.这是Java的标准类型.

我们先看一下解析String的Java代码.

我们知道String的类型为6,7.

当类型为6时,String的长度为一个字节.

当类型为7时,String的长度为一个Int.且字符串的最大长度为104857600个字节.

读取了长度之后,之后的字节就是String的内容.其中sServerEncoding字段指定了字符串的编码类型.

在我分析的时候都是UTF-8.

依然是我们看代码说话:

我们看一下read(key,0,true),read(value,1,true)调用的函数是

List解析调用的是readArray函数.

可以看到和Map差不多,只不过是没有Map的Key部分而已.

有人和觉得解析这个可能会比前面都难,但是其实也挺简单,单单就是调用JceObject类的抽象函数readFrom

readFrom就是看每个继承了JceStruct类怎么组织自己的内容,然后按照自己的字段组织在里面顺序调用各个read重载函数就可以了.

通过抓包工具抓取下来一个包,并对其进行解密后得到的就是JceStruct.这个包是返回Home页内容的.

我用IDEA写了一个Java项目.通过把JceStruct的代码抽取出来.其中只有少许的改动.因为有几个函数经过反编译是编译结果是错误的.只能手动从Smali翻译过来了.

进过项目解析之后:

最近996很流行啊.

996 ICU

项目看附件.

 
 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-4-22 20:58 被chpeagle编辑 ,原因: 修改错别字
上传的附件:
收藏
免费 8
支持
分享
最新回复 (18)
雪    币: 6573
活跃值: (3888)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
2
好像多处用的这种,赞
2019-4-17 21:12
0
雪    币: 2719
活跃值: (1595)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
QQ的所有协议  都用的这种
2019-4-17 22:47
0
雪    币: 26245
活跃值: (63297)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
4
感谢分享~
2019-4-18 09:15
0
雪    币: 136
活跃值: (1470)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
可以对照下wup-1.0.0-SNAPSHOT这个jar包
2019-4-18 20:01
0
雪    币: 79
活跃值: (438)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
TX系的很多应用都用的是JceStruct。
2019-4-18 20:29
0
雪    币: 334
活跃值: (92)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
walkersky TX系的很多应用都用的是JceStruct。
这个是TX自己定的标准吗?
2019-4-18 21:31
0
雪    币: 10869
活跃值: (3909)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享了,学习了
2019-4-18 22:10
0
雪    币: 2822
活跃值: (154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
深夜拜读,感谢楼主,学习到了新姿势,QQ还有个Protobuf的,希望楼主有时间的话还能继续分享
2019-4-19 02:20
0
雪    币: 436
活跃值: (2668)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
jce在github上面不是有源码么....
2019-5-4 18:33
0
雪    币: 916
活跃值: (3434)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
11
有开源的+1...
最后于 2019-5-4 18:48 被葫芦娃编辑 ,原因:
2019-5-4 18:46
0
雪    币: 1461
活跃值: (1457)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
楼上的咨询下,github开源的地址是什么呀?搜jcestruct搜不到呀?
2019-5-6 10:39
0
雪    币: 4135
活跃值: (2849)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
13
hackdaliu 楼上的咨询下,github开源的地址是什么呀?搜jcestruct搜不到呀?
这个我也不太知,只是在逆向QQ浏览器时把这种结构复原出来。
2019-5-6 10:57
0
雪    币: 436
活跃值: (2668)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
chpeagle 这个我也不太知,只是在逆向QQ浏览器时把这种结构复原出来。
https://github.com/playbar/taf
2019-5-9 20:19
0
雪    币: 47
活跃值: (216)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我都是直接调用qq的jar的没啥问题,不用重新写
2019-5-11 11:33
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
大佬,请问这个代码是如何解析的呀?我执行了代码但是没有在那看见结果呀
2020-12-1 18:26
0
雪    币: 20
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
py_spider 大佬,请问这个代码是如何解析的呀?我执行了代码但是没有在那看见结果呀
逐个字节解析,还算是简单的
2020-12-9 13:01
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
大佬,厉害,我现在直接调用了他的解析函数
2020-12-10 18:21
0
雪    币: 226
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
感谢分享,学习了!
2021-3-21 10:26
0
游客
登录 | 注册 方可回帖
返回
//