無源protobuf二進位製流反序列化學習

2021-10-01 08:38:56 字數 2196 閱讀 5737

最近分析軟體的時候經常會遇到protobuf相關的資料結構,但是逆向的時候,沒辦法找到相關的proto檔案,只能直接通過二進位製流來找到相關含義,其實逆向正常也不需要那些,能夠解析出資料就行了,資料名稱無所謂。所以有了這篇文章。

protobuf的二進位製流格式是key :long:value的格式。符合tlv標準,(type,long,value)key包含了兩個部分,乙個是標籤號部分,乙個是型別部分,通過如下運算得到:

key = tag<<3|type
type可能如下:

所以type和tag可以通過反推得到:

type = key&0x7

tag = key>>3 - type

那麼key = 0x08可得:type = 0x08|0x07 = 0,tag = 0x08>>3 - 0 = 0x01;即第1個引數的值為varint,varint通常為1個位元組,所以不用攜帶long資料了,直接可得value為:

注意這裡的key長度不一定為乙個位元組,如果tag小於16佔一位,否則佔兩位,即判斷當前key小於7時,說明key佔兩個位元組,需要連線下乙個key一起計算。

google提供了官方的直接解析工具,可以在沒有proto的情況下解析:

# -*- coding: utf-8 -*-

"""created on mon dec 9 14:27:41 2019

@author: liuti

"""import subprocess

def decode(data):

process = subprocess.popen([r'c:\users\liuti\downloads\protoc-3.11.1-win64\bin\protoc', '--decode_raw'],

stdin=subprocess.pipe,stdout=subprocess.pipe,stderr=subprocess.pipe)

output = error = none

try:

output, error = process.communicate(data)

except oserror:

pass

finally:

if process.poll() != 0:

process.wait()

return output

f = open("writebuff.txt", "rb")

data = f.read()

print (decode(data))

f.close()

這裡因為經常都是用android studio 除錯的,裡面會有buffer陣列,我都是直接把需要分析的陣列拷到乙個檔案中,然後用個指令碼把他轉換成二進位制檔案就行,指令碼如下:

Buffered流 二進位制

bufferedreader類是reader類的子類 bufferedreader類帶有緩衝區按行讀取內容的readline 方法 reader類常用方法 int read int read byte c read char c,int off,int len void close 子類buffer...

php讀取二進位制 php讀取二進位製流

將php資料轉換為二進位制資料 string pack string format mixed args mixed 將二進位制資料轉換為php資料 array unpack string format,string data format a nul padded string a nul 字串填...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...