国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

APP爬蟲之-Protobuf協(xié)議逆向解析

這篇具有很好參考價值的文章主要介紹了APP爬蟲之-Protobuf協(xié)議逆向解析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在做APP抓取時,會發(fā)現(xiàn)有的APP Response回來的數(shù)據(jù)有“加密”。不知道返回的內(nèi)容是什么。

如下:

APP爬蟲之-Protobuf協(xié)議逆向解析,protobuf

如上,內(nèi)容不是明文的,沒辦法解析數(shù)據(jù)。APP常見的對數(shù)據(jù)加密有三種情況:第一種是,用諸如AES這類加密算法對數(shù)據(jù)加密,然后在APP里用key進行解密,這類的數(shù)據(jù)解密的難度不是很大,弄清楚是用的什么加密算法就能反解。
第二種是,用“私有”協(xié)議把數(shù)據(jù)序列化,只有了解該協(xié)議的細節(jié)才有可能把數(shù)據(jù)反序列化出來。這個的難度較大,沒有功底,頭發(fā)擼白都不一定擼出來。游戲和大廠APP盛行搞一個自己的私有協(xié)議來交換數(shù)據(jù)。

第三種是,用第三方廠商的協(xié)議來數(shù)據(jù)序列化,自己搞不出來私有協(xié)議的就選用第三方廠商的。比如用 Google 的 Protobuf ,來做數(shù)據(jù)序列化,也就是數(shù)據(jù)“加密”。
今天聊的就是第三種,Protobuf 的數(shù)據(jù)反解析。
先來看一個 Protobuf ,做數(shù)據(jù)序列化的直觀例子。比如一個 APP 的 Response 原先是以 json 格式返回的:

這樣很容易被解析,用Protobuf把上面數(shù)據(jù)序列化再傳輸就變成類似這樣:
這張圖片只是樣例
這樣就沒法直接解析數(shù)據(jù),如果了解 Protobuf 協(xié)議的話就能加快反解速度。所以還得從頭來聊 Protobuf 。


一、什么是 Protobuf ?
Protobuf 是 Google 開發(fā)的一套數(shù)據(jù)存儲傳輸協(xié)議,跟 xml 和 json 一樣的,都是用來儲存和傳輸數(shù)據(jù)的。?因為 Protobuf 能夠把數(shù)據(jù)壓縮得很小,所以傳輸數(shù)據(jù)就比 xml 和 json 快幾倍,Protobuf 解析數(shù)據(jù)的速度也比它兩快,所以在數(shù)據(jù)網(wǎng)絡(luò)傳輸上,用 Protobuf 而不用 json 就有點受歡迎了。
不過 Protobuf 儲存、壓縮、傳輸效率比 json 好,付出的代價就是用法麻煩,不像 json.loads() json.dumps()?一下就搞定了這么簡單。Protobuf 有一套自己的語法。不了解 Protobuf 協(xié)議語法和用法的話也無法反解數(shù)據(jù)。
先了解下 Protobuf 序列化和反序列化的整個流程:
1.1.先定義一個 Protobuf?語法文件(?.proto 文件)
該語法文件用來說明要傳輸哪些字段、字段的數(shù)據(jù)類型、數(shù)據(jù)間的嵌套關(guān)系這些。比如一個APP要返回的數(shù)據(jù)有電話號碼,姓名,年齡這三個字段,你就需要把這三個字段定義在 .proto 文件里,并且指明他們的數(shù)據(jù)類型,比如姓名和電話是字符串, 年齡是整型。
1.2.使用 Protobuf 提供的工具編譯該語法文件。用工具編譯 .proto 文件的目的是,把 .proto 文件編譯成代碼,工具會根據(jù)該 .proto 文件自動生產(chǎn)代碼。?這個代碼就是用來做數(shù)據(jù)序列化和反序列化的。

1.3.服務(wù)端用第2步中的代碼,把“明文”數(shù)據(jù)序列化,變成“密文”后,返回給APP。
1.4. APP 客戶端用第2步中的代碼,把“密文”數(shù)據(jù)反序列化,就“解密”成明文拉。


理論說多了很迷糊,再整個完整的直觀例子:
二、Protobuf 正向開發(fā)流程?

2.1.先配置 Protobuf 環(huán)境
https://github.com/protocolbuffers/protobuf/releases/在 Google 官方 github 地址下載 Protobuf ?。
下載一個 Protobuf 編譯器和一個調(diào)用編譯器的接口程序,我們這里用Python版的。

如上圖,箭頭所示,解壓 protoc.win64.zip 里有個 protoc 命令就是編譯器。PS:注意要給 protoc 配置上環(huán)境變量,不然沒法全局調(diào)用該命令。?
解壓 protobuf-python-3.11.4.zip 這是Python模塊,cd到python目錄里運行 Python setup.py build 和 Python setup.py install 安裝Python模塊。

Python編輯器里運行 import google.protobuf 可以檢測是否安裝成功。
example目錄里有官方寫好的Python示例程序 和?示例 .proto文件。

2.2.寫一個 .proto?語法文件
語法文件怎么寫,要根據(jù)具體的傳輸數(shù)據(jù)來定制,比如按照 example 里的示例,如果要傳輸?shù)臄?shù)據(jù)是如下格式:


那么定義的 .proto 語法文件就如下:


這樣就定義好了一個 .proto 語法文件,語法文件如何定義要根據(jù)傳輸數(shù)據(jù)的不同而變。
更全的 protobuf 語法 可以看這個,有網(wǎng)友翻譯成了中文版的。https://colobu.com/2017/03/16/Protobuf3-language-guide/


2.3.使用第一步中下載的 protoc 編譯器來編譯 .proto 文件


protoc?--python_out=.?addressbook.proto

上述表示把 addressbook.proto 文件編譯成Python版的。
如果文件語法錯誤,在編譯的時候會有提示。編譯完后,會多出一個.py文件

APP爬蟲之-Protobuf協(xié)議逆向解析,protobuf

?


我們就可以調(diào)用這個 .py 來序列化上面的數(shù)據(jù)。

2.4.開始序列化數(shù)據(jù)

APP爬蟲之-Protobuf協(xié)議逆向解析,protobuf

?


print里輸出的就是序列化(“加密”)后的數(shù)據(jù)。

2.5.對序列化后的數(shù)據(jù)進行反序列化(“解密”)

APP爬蟲之-Protobuf協(xié)議逆向解析,protobuf

?
反序列化就把數(shù)據(jù)又還原啦。


上述過程就是一個完整的正向數(shù)據(jù) protobuf 序列化過程。我們可以看出來,主要是定義一個 .proto 文件,然后把它編譯生成代碼。?后面就主要用這個代碼來做序列化和反序列化工作。


三、逆向解析 Protobuf
正向過程比較輕松,因為對方即有 .proto 文件,也有序列化代碼,也知道要傳輸?shù)臄?shù)據(jù)樣式。但是逆向這個過程,APP里是沒有 .proto文件的,APP里是有反序列化的代碼,但是看得也頭暈。那該怎么辦呢?
借助工具,我們使用上面下載的protoc編譯工具,這個工具提供反解析參數(shù)

protoc?--decode_raw?<?people.bin

如上,使用 --decode_raw 參數(shù)就能把序列化后的數(shù)據(jù),反序列化(解密)出來。

上面只是把數(shù)據(jù)還原了,那如果我們要完全把 .proto 文件也還原出來該怎么辦呢?

如果 APP 發(fā)送 request 的數(shù)據(jù)要先序列化后再發(fā)送給服務(wù)端的話,那爬蟲要做的事情就不只反序列化,還要能序列化。
做序列化是一個正向的過程,按照上面流程,必須先要有 .proto 文件才行。所以繼續(xù)還原 .proto 文件,還原 .proto 是個體力活和細致活。就是參照反解析出來的數(shù)據(jù),還原出 .proto 文件。
?

APP爬蟲之-Protobuf協(xié)議逆向解析,protobuf

?


上面這張圖是關(guān)鍵,看懂了就能還原出來。上圖左邊是反解析出來的數(shù)據(jù),中中間是參照左邊寫出來的 .proto 文件,右邊是人家原本的 .proto 文件。
左邊和中間圖對比可以看出,就是根據(jù)左邊的字段,挨個把字段重新定義出來就OK啦。遇到?"{" 就定義一個message。
中間和右邊圖對比可以看出,變量的名字是無關(guān)緊要的,數(shù)據(jù)類型還原正確就行。變量賦值的那些1,2,3是標識號,message里同一層級的標識號不能重復(fù),一般是按照變量順序從1開始遞增。標識號的數(shù)字是個關(guān)鍵,數(shù)字寫錯了反解析出來的數(shù)據(jù)會不對。
這樣就把 .proto 文件還原出來了,然后按照正向流程又去編譯,就可以使用它去序列化(“加密”)和反序列化(“解密”)APP數(shù)據(jù)了。文章來源地址http://www.zghlxwxcb.cn/news/detail-684365.html

到了這里,關(guān)于APP爬蟲之-Protobuf協(xié)議逆向解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Protobuf-net:C#高效序列化工具,助力接口傳輸與前端解析

    Protobuf-net:C#高效序列化工具,助力接口傳輸與前端解析

    ? 概述: Protobuf-net是C#中高效的二進制序列化工具,以緊湊、跨語言支持和卓越性能著稱。通過定義消息類型、序列化和反序列化實現(xiàn)數(shù)據(jù)傳輸,并可適用于Web接口。前端可使用protobuf.js庫解析Protobuf格式數(shù)據(jù)。 Protobuf-net(Protocol Buffers)是一種高效的二進制序列化工具,具有

    2024年03月09日
    瀏覽(32)
  • 【RPC 協(xié)議】序列化與反序列化 | lua-cjson | lua-protobuf

    【RPC 協(xié)議】序列化與反序列化 | lua-cjson | lua-protobuf

    在分布式計算,遠程過程調(diào)用(英語:Remote Procedure Call,縮寫為 RPC)是一個計算機通信協(xié)議。該協(xié)議允許運行于一臺計算機的程序調(diào)用另一個地址空間(通常為一個開放網(wǎng)絡(luò)的一臺計算機)的子程序,而程序員就像調(diào)用本地程序一樣,無需額外地為這個交互作用編程(無需關(guān)

    2024年02月10日
    瀏覽(22)
  • [golang 微服務(wù)] 3. ProtoBuf認識,安裝以及golang 中ProtoBuf使用

    [golang 微服務(wù)] 3. ProtoBuf認識,安裝以及golang 中ProtoBuf使用

    在移動互聯(lián)網(wǎng)時代, 手機流量 、 電量 是最為有限的資源,而移動端的即時通訊應(yīng)用無疑必須得直面這兩點。解決流量過大的基本方法就是 使用高度壓縮的 通信協(xié)議 ,而數(shù)據(jù)壓縮后流量減小帶來的自然結(jié)果也就是省電:因為大數(shù)據(jù)量的傳輸必然需要 更久的網(wǎng)絡(luò)操作 、 數(shù)據(jù)

    2024年02月10日
    瀏覽(24)
  • protobuf 的bug:ImportError_ cannot import name ‘builder‘ from ‘google.protobuf.internal‘

    protobuf 的bug:ImportError_ cannot import name ‘builder‘ from ‘google.protobuf.internal‘

    今天了解到有一個很強大的數(shù)據(jù)分析工具streamlit,下載安裝完發(fā)現(xiàn)啟動不了……沒錯就是本文的bug. 什么是 protobuf ? Protocol Buffers 是 Google 開發(fā)的一種數(shù)據(jù)交換格式,采用了一種類似于 XML 的簡單的語法,用于定義數(shù)據(jù)結(jié)構(gòu),并且可以將這些結(jié)構(gòu)序列化為二進制文件,以便在不

    2024年01月23日
    瀏覽(22)
  • Go with Protobuf

    Go with Protobuf

    原文在這里。 本教程為 Go 程序員提供了使用Protocol buffer的基本介紹。 本教程使用 proto3 向 Go 程序員介紹如何使用 protobuf。通過創(chuàng)建一個簡單的示例應(yīng)用程序,它向你展示了如何: 在 .proto 中定義消息格式 使用protocol buffer編譯器 使用Go protocol buffer API讀寫消息 這并不是proto

    2024年02月08日
    瀏覽(13)
  • Protobuf編碼規(guī)則

    該表顯示了在? .proto ?文件中指定的類型,以及自動生成的類中的相應(yīng)類型: .proto Type Notes C++ Type Java/Kotlin Type[1] Java/Kotlin 類型 [1] Python Type[3] Go Type Ruby Type C# Type PHP Type Dart Type double double double float float64 Float double float double float float float float float32 Float float float double int32 var

    2024年02月02日
    瀏覽(13)
  • Protobuf 反射技術(shù)簡介

    對于反射大家應(yīng)該不會陌生,如果你接觸過一些框架(如 ORM、IOC、OSGi 等) 的內(nèi)部實現(xiàn),應(yīng)該更能體會反射技術(shù)的應(yīng)用可謂無處不在。 反射概念最早出現(xiàn)于人工智能領(lǐng)域,20 世紀 70 年代末被引入到程序語言設(shè)計中。1982 年 MIT 的 Smith, Brian Cantwell 在他的博士論文中最早提出了

    2024年01月22日
    瀏覽(23)
  • ubuntu卸載protobuf

    1、先查看protobuf的版本:protoc --version 2、查找protobuf的位置:which protoc,我的電腦上是/usr/local/bin/protoc 3、執(zhí)行sudo rm /usr/local/bin/protoc //可執(zhí)行文件 4、sudo rm -rf /usr/local/include/google //頭文件 5、sudo rm -rf /usr/local/lib/libproto* //庫文件

    2024年02月05日
    瀏覽(15)
  • rust使用protobuf

    rust使用protobuf

    c++,java,go 等直接是用 ,具體就不說了,這章主要講述rust 使用protobuf 這章主要講述2種 1 protoc + protoc-gen-rust plugin 2 protoc + prost-build 1:環(huán)境 win10 rustrover64 25-2 下載地址 https://github.com/protocolbuffers/protobuf/releases 25-2 是rust 實驗性的 純粹用這個 出錯了,這里先不討論了,由解決的麻

    2024年01月20日
    瀏覽(14)
  • Unity使用Protobuf

    Unity使用Protobuf

    測試例子 運行結(jié)果 具體的運行和設(shè)計根據(jù)項目而定吧 好像也沒啥要寫的了 哈哈哈

    2024年01月18日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包