protobuf協議逆向解析

前言

在app抓包的過程中,我們會發現有些app的資料也是存在加密的,抓到的資料是一堆亂碼。無法來解析資料。

protobuf協議逆向解析

常見的對於資料的加密方式有三種:第一種是利用常見加密演算法,諸如AES等演算法,對響應資料進行加密。第二種是利用第三方廠商的協議進行資料序列化,常見的有xml、json、Fastjson、protobuf等。第三種是自己的“私有協議”,自己編寫的不開源的協議,進行資料序列化。這三種方式逆向難度是逐級遞增的,特別是私有協議,那完全是搞不清楚的話,毛都掉沒了也解不開。所以為了保護頭髮,本次給大家分享的是第二種,利用第三方廠商的資料序列化方案,protobuf的資料泛解析。

protobuf流程

對於protobuf的資料序列化,開發師傅們更懂一些,簡單介紹一下protobuf,protobuf 是 Google 開發的一套資料儲存傳輸協議。透過將結構化的資料進行序列化,進而來實現資料儲存或者是RPC資料交換的功能。

序列化:將資料結構或物件轉換成二進位制串的過程反序列化:將在序列化過程中產生的二進位制串再轉換成資料結構或者物件的過程

首先,protobuf會定義一個。proto檔案,其中包括了要傳輸的欄位,欄位的資料型別、資料的巢狀關係。然後定義完成後,protobuf官方工具會編譯這個語法檔案,使其變成程式碼,然後根據這個程式碼來做資料序列化與反序列化。這個過程在app中的體現就是,伺服器端用生成的程式碼,將明文序列化,然後變成密文,返回到app端。app客戶端就會利用生成的程式碼,將密文反序列化後,在伺服器端解密成明文。

for example:傳輸如下類似的資料,

{ ‘name’:“火線安全”, //名稱 ‘id’:303, //編號 ‘mail’:“@huoxian。cn” //郵箱 { ‘tel’:“13111111111” ‘type’:2 //私人 or 公司 }}

定義的。proto檔案則如下所示

syntax = “proto3” //固定message Person { string name=1; int32 id =2; string mail=3; enum PhoneType{ MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber{ //巢狀一個message string number = 1; PhoneType type = 2; } repeated PhoneNumber phones = 4; }message AddressBook{ repeated Person people = 1;}

然後利用這個。proto檔案來進行後續的序列化和反序列化操作。

逆向分析

對於正向過程來說,有了。proto檔案,也有了序列化程式碼。很輕鬆,但是對於逆向過程來說,如何分析得到這個。proto檔案則是最重要。

這類資訊一般是在java層中,普遍的逆向過程是,根據url進行關鍵詞搜尋也可以直接利用hook的方式進行尋找。hook的話定位快。

展示一下之前某app的proto檔案,因為封裝做的很好,所以可以直接重寫就可以了。(重申一下,這是網圖,網圖,不是我分析的)

protobuf協議逆向解析

類似上面那樣就可以直接重寫了。

當然如果想要根據protobuf提供的官方工具直接解密的話,可以根據解密後的資訊來一步一步填充。proto檔案。

拿上面那個例子來說,最後肯定是這樣一個

1:“火線安全”, //名稱 2:303, //編號 3:“@huoxian。cn” //郵箱 4{ 1:“13111111111” 2:2 //家庭 or 公司 }}

那還原一下就是這樣

message Ts1 { string field1=1; int32 field2 =2; string field3=3;

message Ts2{ //巢狀一個message

string field1 = 1; int32 field2 = 2; } repeated Ts2 ts2 = 4; }message TT{ repeated Ts1 ts1 = 1;}

可以對比一下。手動還原就是這麼個思路。當然了,也可以利用指令碼來進行這個操作。[地址][0]

總結

該方法可以應對可能響應包中會有一些敏感資訊洩露,或者是爬蟲來進行資料爬取時,對於亂碼資料的解密。