安卓逆向 | Protobuf协议逆向和仿真&举个栗子
Posted 燕幕自安
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓逆向 | Protobuf协议逆向和仿真&举个栗子相关的知识,希望对你有一定的参考价值。
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/6ae4a857cf7b4cfca9436c33c30bdc96.jpg)
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/64dadf206550442ca74b66a8f9c230d5.jpg)
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/2dfaa3b5b449439d94321b5993e1e47b.jpg)
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/3885470f559b47d686ee0ee999f7681a.jpg)
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/1b465ad4dd094d09a7311202e97e899f.jpg)
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/e333e504db104497b62663fe8c9b044b.jpg)
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/0ec4b5f1cee14cebb06fe87724996951.jpg)
def proto_decode(data):
process = subprocess.Popen([r'D:\tools\protoc.exe', '--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
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/ad45a2b739fc4b769f7398a71187a04d.jpg)
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/86730e2ef23e42b1b79beeb21b2a9943.jpg)
message RequestHead {
enum SerialozeCode {
Normal = 0;
UTF8 = 1;
PB = 2;
Json = 3;
SotpPB = 4;
SotpJson = 5;
PBSotp = 6;
PBJson = 7;
JsonSotp = 8;
JsonPB = 9;
GraphQL = 10;
}
optional SerialozeCode serializeCode = 1;
optional string systemCode = 2;
optional string language = 3;
optional string userId = 4;
optional string clientId = 5;
optional string clientToken = 6;
optional string clientVersion = 7;
optional string sourceId = 8;
optional string exSourceId = 9;
optional string serviceCode = 10;
optional string messageNumber = 11;
optional string authToken = 12;
message Extention{
optional string Key = 1;
optional string value = 2;
}
repeated Extention extentionList = 13;
optional string appId = 14;
}
protoc.exe --proto_path=D:\code\ctrip\src\main\proto --java_out=D:\code\ctrip\src\main\java D:\code\ctrip\src\main\proto\ResponseHead.proto
然后我们直接调用生成类的接口即可实现参数设置及序列化成byte[]。接下来就要展现出我们正向编码的能力了。完成Header的生成和整个body的组装, 通过socket发出即可。
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/cbb0db4ca9e843ceb41b0203aeafc146.jpg)
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/a4a1b2177f2b4899895733e3337d5ef0.jpg)
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/4fb1397945ce4faabcf15ad334b21294.jpg)
![安卓逆向 | Protobuf协议逆向和仿真&举个栗子](https://image.cha138.com/20210810/ab924fc76e8e40ac9a7ed08bb577cf13.jpg)
-
Proto数据反序列化和Proto文件生成
-
收发包socket网络编程
-
加密参数逆向和调用
-
一大罐耐心
以上是关于安卓逆向 | Protobuf协议逆向和仿真&举个栗子的主要内容,如果未能解决你的问题,请参考以下文章
PBTK:一款针对Protobuf App的逆向工程与模糊测试套件