发现自己写的文章更多是偏向于理论.
现在就写点实战的文章吧.
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
项目看附件.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-4-22 20:58
被chpeagle编辑
,原因: 修改错别字