目标网站:aHR0cHM6Ly9jcmVhdG9yLnhpYW9ob25nc2h1LmNvbS9uZXcvbm90ZS1tYW5hZ2Vy

目标参数为collect请求的payload

找出入参

先追栈找到出参位置:

可以看到e和n对象明显有proto jspb的字样,盲猜是json转的protobuf,然后b64加密。

这里看下e.array:

再往上找json入参位置:

json转成二维数组,基本确定是protobuf了,来看下谷歌官方提供的protobuf js库:

https://github.com/protocolbuffers/protobuf-javascript

简单对比下发现几乎一样,基本可以确定是用的官方库,那就确定思路:先写proto文件,再编译为对应的加解密js,最后调用即可。

重写proto

Tracker为顶层的message,app、mob、dvc等为对应的json字段名

字段名知道了,就要找字段的类型:

可以看到,Tracker下面的App、Mobile等基本都是message,所以proto这样写:

接下来看User(正常应该看按顺序先看App,但是User包含的proto特殊情况最多,所以把User搞明白后其它的都是一样的):

第一张图可以把字段名都重写出来,第二张图则是字段对应的类型,readString为string,readDouble为double,readBytes为bytes,等等,需要注意的是第一张图第5项expList为getRepeatedField,说明它是一个repeated字段(可以理解为数组)。

第三张图中,第11、第13为readEnum,说明这两个字段为enum字段(枚举,可以理解为字典),找找它们在哪儿:

因为,User对应的proto如下:

其余过程一样,不再赘述

proto编译

https://github.com/protocolbuffers/protobuf/releases

直接下载官方编译好的工具,解压后把bin文件夹放在系统变量path中,然后在写好的proto文件目录中运行:

protoc --js_out=import_style=commonjs,binary:./ xhs.proto

就会在目录下生成js文件:

再npm install google-protobuf即可使用。

json转proto

虽然编译出了官方提供的js,但是并不支持json与proto的直接转化,转化规则还是要自己写:

写完json转protobuf后,补上protobuf转base64的部分:

运行发现结果不太一致,找找问题:

可以发现,在网页中为空的字符串,使用本地的js解析为了null,追溯此字段发现本地编译生成的代码如下:

而网页如下:

将setProto3StringField都改为setField后,再运行,结果正常: