最近分析軟體的時候經常會遇到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年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...