吾愛破解 - LCG - LSG |安卓破解|病毒分析|huihengkj.com

 找回密碼
 注冊[Register]

QQ登錄

只需一步,快速開始

搜索
查看: 5213|回復: 70

[Android 原創] Protobuf協議解析文檔-某音彈幕

  [復制鏈接]
樓主
我還沒有吃飽 發表于 2020-9-21 19:43 回帖獎勵

0x00 : 前言

   近期因為工作原因著手分析某音協議,在做到直播間這步的時候通過抓包發現其直播間內彈幕數據為protobuf協議,之前用xposed做wx的時候雖然接觸過,但在下從來都是只要結果的人,直接調用wx內部函數轉成對象即可,誰理你什么格式,但現在做的既然是協議,那自然是無端可用,什么東西都要自己處理,這里分享一下記錄的分析流程.

0x01 : 準備工作

   在開始分析之前需要準備好:
      1.protobuf(安裝方法百度即可);
      2.直播間彈幕抓包;
      3.通過protoc工具測試:將數據包里返回的彈幕內容復制到文本,通過指令
      protoc --decode_raw < xxx.bin 查看解析后的效果:

可以被工具正常解析,到這里準備工作就完成了, 接下來本文檔以圖中數據為例,進入分析流程;

0x02 : 分析流程

   上面通過protoc解析出了個大概,那么里面的數據究竟是什么意思呢? 1 2 3, 1: 2:這些都是什么呢? 網上所搜一番得知:解析出來的數據中開頭的1 2 3..或 1: 2: 3:的均為protobuf的tag, 是解析數據的關鍵值,帶":"號的是字段,沒":"號的是 repeated 集合.
500彩票邀请码    那么知道了這些,要怎么還原數據呢,逆向中是沒有原始.proto文件的,對于protobuf的解析就需要依靠分析源碼,自己生成一份.proto文件,以上圖為例,在源碼中定位到解析代碼:

private ProtoApiResult a(b bVar) throws Exception {
        PatchProxyResult proxy = PatchProxy.proxy(new Object[]{bVar}, this, a, false, 22172);
        if (proxy.isSupported) {
            return (ProtoApiResult) proxy.result;
        }
        com.bytedance.android.tools.pbadapter.a.b protoDecoder = ((INetworkService) d.a(INetworkService.class)).getProtoDecoder(com.bytedance.android.livesdkapi.message.f.class);
        if (protoDecoder != null) {
            com.bytedance.android.livesdkapi.message.f fVar = (com.bytedance.android.livesdkapi.message.f) protoDecoder.decode(this.s.a(bVar));
            ProtoApiResult protoApiResult = new ProtoApiResult();
            protoApiResult.cursor = fVar.b;
            protoApiResult.fetchInterval = fVar.c;
            protoApiResult.now = fVar.d;
            protoApiResult.messages = new LinkedList();
            this.m = fVar.e;
            long currentTimeMillis = System.currentTimeMillis();
            this.n = currentTimeMillis - this.k;
            ag.b = (fVar.d + ((currentTimeMillis - this.k) / 2)) - currentTimeMillis;
            if (Lists.isEmpty(fVar.a)) {
                return protoApiResult;
            }
            //省略......

500彩票邀请码其中參數(b bVar)權當作http請求后的body即可,無關緊要,重點是com.bytedance.android.livesdkapi.message.f 這個類,進去看一下類里的結構:

package com.bytedance.android.livesdkapi.message;
public class f {
    @SerializedName("messages")
    public List<a> a;
    @SerializedName("cursor")
    public String b;
    @SerializedName("fetch_interval")
    public long c;
    @SerializedName("now")
    public long d;
    @SerializedName("internal_ext")
    public String e;
    public static final class a {
        @SerializedName("method")   //這個實際上是類名,根據這個字段獲取對應解析的類.
        public String a;
        @SerializedName("payload")  //解析的數據內容,同樣是protobuf.
        public byte[] b;
    }
}

對比一下解析出來的數據圖,發現對應tag:2,3,4,5

tag1是個數組,類型是內部類a, 內部類中剩下的2個字段是用于動態定位接下來解析的類:
method => 解析剩下數據包中的類名, payload => 數據內容,method 也就是這部分:

分析到此數據結構有了大致了解,com.bytedance.android.livesdkapi.message.f是某音彈幕數據的最外層,用來保存直播間彈幕所有的消息類型,從格式上不難理解,會有多種method,這里先以"WebcastRoomMessage"為例查找對應關系:
在代碼里搜索一下很快找到了 com.bytedance.android.livesdkapi.depend.g.a:

找到對這個枚舉的引用,定位到 com.bytedance.android.livesdk.chatroom.bl.a:

對應關系找到,說明剩下byte[]是在 cl.class這個類中解析,看一下里面的結構:

public class cl extends d {             //注意繼承關系
    public static ChangeQuickRedirect a;
    @SerializedName("content")
    public String b;
    @SerializedName("supprot_landscape")
    public boolean c;
    public cl() {
        this.type = com.bytedance.android.livesdkapi.depend.g.a.ROOM;   <-枚舉類型
    }

500彩票邀请码"WebcastRoomMessage"中只有2個字段,"content"和"supprot_landscape",可是根據工具解析出來的數據可以看到,還有一大坨呢,剩下的數據在哪,并且這2個的tag排列關系又是什么? 那只能繼續查找cl這個類是怎么解析的,經過一番查找,找到了解析對應關系,com.bytedance.android.live.base.model.proto.d ,在這里可以看到負責解析cl.class的類是 gw.class:

進入gw.class:

在這里知道了"content"和"supprot_landscape"分別對應tag 2和3,還有第三個名為"baseMessage"的字段要解析,這個是cl.class的基類成員,通過多個數據包驗證得知,所有method中,都繼承同一個基類:

500彩票邀请码之前沒解析出來的數據也在其中,看下這個名為baseMessage成員的內部結構,并找一下"tag表":

500彩票邀请码分析到此,彈幕結構漸漸清晰了, 如下圖:

500彩票邀请码現在可以根據分析結果開始寫proto文件了.

0x03 : proto文件編寫

   關于proto文件語法網上資料很多,這里先說幾個關鍵的,proto語法有"proto2"和"proto3",我沒看出來對于咱們逆向人員選擇"proto3"有什么用處,并且3的語法是不需要字段修飾符的,這只會讓我們在寫proto文件的時候更加迷糊,所以我們選擇"proto2"來寫.
   或許你已經發現,基類(baseMessage)有很多字段,怎么解析出來的就"method","msg_id","room_id","create_time"這么幾個,其實這也是很正常的情況,并不是每一個字段都是必選的.proto有3個字段修飾符required(必選),optional(可選),repeated(重復),說白了就是咱們的proto文件不使用required,只用optional,因為咱們也不知道哪個字段什么時候才有值,如果是數組一律用repeated修飾.
   注意proto的數據類型,以java為例.String => string ; int => int32; long => uint64;...更多類型可自行查找資料.
開始吧,先寫一份 ProtoApiResult.proto,對應上面的
500彩票邀请码 com.bytedance.android.livesdkapi.message.f ,用來保存彈幕整體數據:

500彩票邀请码外層有了,現在寫"WebcastRoomMessage"對應的類:

500彩票邀请码接下來最后一個"CommonMessageData":

注意這里的display_text字段,這還是一個對象,里面又是N多字段,這里我已經解析過了, 大家自己在分析過程中如果不想解析那么多,可以刪除不需要的字段,或者將類型定義為bytes即可.只要tag不亂就行.
   OK,將.proto打包成java文件:  protoc --java_out=out .*.proto
500彩票邀请码 之后在out目錄就生成了可以使用的java文件, 導入到項目中即可,最后看下解碼效果:

   嗯,費了一大堆事最后只解碼一個系統提示...,這也沒辦法,某音一次請求動輒數萬字節的返回數據,用那些做例子的話,我這圖都沒法截,迫不得已找了個最小的,根據上述流程其實其他類型的數據解析都是一樣的,沒什么區別,最后上個最終演示效果:

首次發帖,多多關照.

免費評分

參與人數 27威望 +2 吾愛幣 +124 熱心值 +26 收起 理由
fengbolee + 1 + 1 用心討論,共獲提升!
victos + 1 + 1 謝謝@Thanks!
余我不待 + 1 + 1 我很贊同!
簡單メ傳說 + 1 + 1 謝謝@Thanks!
gaosld + 1 + 1 熱心回復!
迷魂 + 1 + 1 謝謝@Thanks!
bitpeach + 1 + 1 謝謝@Thanks!
Yinlx + 1 + 1 我很贊同!
wangkai558 + 1 + 1 謝謝@Thanks!
猛男z + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
qtfreet00 + 2 + 100 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
decor + 1 &amp;amp;#128002;
zhuzhuxia111 + 1 + 1 我很贊同!
ycuvuuui1L + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
mr.liuc + 1 + 1 我很贊同!
tong_wen2504 + 1 謝謝@Thanks!
wangxd + 1 + 1 后臺發來玩玩唄~~~~~~~~~~~~~~~
Right_Hai + 1 + 1 我很贊同!
91mumu + 1 + 1 謝謝@Thanks!
hgfty1 + 1 用心討論,共獲提升!
笙若 + 1 + 1 用心討論,共獲提升!
ihuem + 1 + 1 我很贊同!
theSeven + 1 + 1 用心討論,共獲提升!
是隨風啊 + 1 謝謝@Thanks!
風繞柳絮輕敲雪 + 3 + 1 我很贊同!
風鳴兒 + 1 + 1 我很贊同!
18269055653 + 1 熱心回復!

查看全部評分

發帖前要善用論壇搜索500彩票邀请码功能,那里可能會有你要找的答案或者已經有人發布過相同內容了,請勿重復發帖。

推薦
zhengpengxin 發表于 2020-9-22 19:21
牛逼 ±±±±±±
推薦
 樓主| 我還沒有吃飽 發表于 2020-9-23 14:48 |樓主
沙發
zguozzao 發表于 2020-9-21 20:30
3#
BLUE-SKY 發表于 2020-9-21 20:38
熱心回復!
4#
hubohang 發表于 2020-9-21 21:41
666 大佬
5#
xixicoco 發表于 2020-9-21 21:47
牛逼,就是喜歡你
6#
風鳴兒 發表于 2020-9-21 22:00
厲害了 ~~~~
7#
liutao.me 發表于 2020-9-21 22:38
厲害了 666
8#
wangxd 發表于 2020-9-21 23:33
感謝分享   太牛B
9#
Cra2yZer0 發表于 2020-9-22 06:02
感謝分享   太牛B
10#
lyghost 發表于 2020-9-22 08:00
現在好多軟件都開始用Protobuf協議了
您需要登錄后才可以回帖 登錄 | 注冊[Register]

本版積分規則 警告:本版塊禁止灌水或回復與主題無關內容,違者重罰!

快速回復 收藏帖子 返回列表 搜索

RSS訂閱|小黑屋|處罰記錄|聯系我們|吾愛破解 - LCG - LSG ( )

GMT+8, 2020-10-21 05:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回復 返回頂部 返回列表

500彩票邀請碼-彩經網