抖音web直播数据采集
本案例是基于RPC的抖音web直播数据采集。还原protobuf协议的可以参考《抖音web-protobuf》。
文章内容仅供参考学习,如有侵权请联系作者进行删除
可采集内容和页面呈现内容相同,包括用户评论、关注、谁来了、送礼物等数据。
http://bbs.nightteam.cn/upload/attach/202108/2827_PWMMWV3RGYEX4T8.png
RPC(Remote Procedure Call)是远程调用的意思。
在Js逆向时,我们本地可以和浏览器以服务端和客户端的形式通过websocket协议进行RPC通信,这样可以直接调用浏览器中的一些函数方法,不必去在意函数具体的执行逻辑,可以省去大量的逆向调试时间。
像抖音直播间的数据传输采用的是protobuf,如果完全解析的话实在是浪费时间,不适合做案例教程。
还有重要的一点是,通过RPC的方法可以不用搞加密参数signature,开一个页面就可以了。
接口分析
首先通过控制台进行抓包,普通的get请求。有加密参数signature,不过我们不需要搞。
https://img-blog.csdnimg.cn/52dc29235d31418790735218cccaa158.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70
返回的是经过 protobuf 序列化数据。
https://img-blog.csdnimg.cn/153e40a6ec044ffe834e3ad7e1495e7c.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70
response里面有关键字 WebxxxxMessage 。
https://img-blog.csdnimg.cn/b2c9c30fb4f0414ca94a736ae296a965.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70
其实全局直接搜message就行
https://img-blog.csdnimg.cn/d1dd8693883140c78d31b703d34e8cd3.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70
进来接着搜,这里response.decode看起来像,所以断点调试。
其实最拼的就是每个像的地方都断点。
https://img-blog.csdnimg.cn/060094d70a97489584173f7d0c84d68d.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70
然后调试发现在 var r = s.im.decode(n) ,这里返回的解码后的数据。
https://img-blog.csdnimg.cn/f2db79cd004b4c2499e5420514135841.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70
所以说在这里进行RPC就行。
文件覆盖
首先需要修改和替换它的Js文件,为了方便操作和讲解,我选择通过控制台的Overriders来进行Js文件替换。当然也可以选择通过Fiddler、Mitmproxy等抓包工具替换,或者通过Google的GRPC协议来进行Js内容替换。
在Source中选择Overrides,然后创建一个本地目录。 Enable Local Overrides 需要勾选。
https://img-blog.csdnimg.cn/a0439e10d6e84abc92d7ab38bedb7d2a.png
然后在没有格式化的Js文件上右键点击Save for overrides。
https://img-blog.csdnimg.cn/fa2bf2df48b043a4a880aaca9b95875b.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70
接下来就可以进行修改了,将格式化后的代码复制到我们save的文件中,然后ctrl+s进行保存。
RPC调用
接着我们要做的是在一个位置创建一个websocket连接来供我们进行RPC调用。
首先要确定注入位置,我们需要添加的websocket客户端JS代码位置在这个 var r = s.im.decode(n) 下面。
代码如下:
https://img-blog.csdnimg.cn/2c499076047c4cc5bbb2933088c7685c.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70
不能单纯的在该函数中写入创建客户端,这样会导致死循环,无限创建客户端。所以需要进行代码上的判断,如果已经创建过就不再进行创建客户端。
接下来定义自己的服务端代码就可以进行测试了。 python代码在博客原文中。
运行示例
我没有更进一步的去解析,你可以根据方法名提取对应数据。
https://img-blog.csdnimg.cn/13ba3877aec44d05abbb4d560912e140.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU4MjEwMQ==,size_16,color_FFFFFF,t_70
为了做一些推广,回复可见的内容是专栏地址,有很多案例,以及该文章的源码。
upload/attach/202108/2827_6UF7DXBV2RCACE4.jpg
https://blog.csdn.net/weixin_43582101/category_9291501.html
111111 牛哇牛哇 111 111 ok 111 牛蛙牛蛙 666 66