正向开发使用
在之前的博客我记录了一下正向开发时的安装和编译
编译生成各种语言的程序
逆向
逆向的时候,由于原模板文件不在我们这,在服务器和软件内,我们猜不到,获取不到正确的key, 不过还好key不太重要
方法一
- 1.利用 protoc.exe 反解析 protobuf 数据
protoc.exe --decode_raw < ./a.bin
- 2.根据反解析出来的数据,还原出 .proto 文件
key只能随便懵,编写.proto -
3.用 protoc.exe 编译 .proto 文件,生成 py /go程序
- 4.用 py 程序序列化和反序列化,
方法二
blackboxprotobuf
库直接操作 protobuf
数据,不需要还原 .proto
文件
安装:
pip install blackboxprotobuf
# 转成json
message, typedef = blackboxprotobuf.protobuf_to_json(bytes_data, message_type=None)
# 转成字典
bus_data = blackboxprotobuf.decode_message(bytes_data, message_type=None)[0]
补充
进制转换
16进制 => 二进制
binascii.a2b_hex('788509209294464b3e84a1228')
aes解密不同的填充模式会有空格补齐
这时要去掉空格,才可以传进blackboxprotobuf,不然会报错
unpad去空格
import blackboxprotobuf
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
key = '7fd3028e14a45d1f8b6eb0b2adb7cddg'
iv = '864c8fd584facf6210376b2b72b063i8'
aes = AES.new(binascii.a2b_hex(key), AES.MODE_CBC, binascii.a2b_hex(iv))
dec = aes.decrypt(binascii.a2b_hex('788509209294464b3e84a1228'))
print(dec)
message, typedef = blackboxprotobuf.protobuf_to_json(unpad(dec,16), message_type=None)
bus_data = blackboxprotobuf.decode_message(unpad(dec,16), message_type=None)[0]
print(message)
附录
# 将proto格式文件解码
protoc --decode-raw < xxx.bin
# 编译手动编写的proto文件,生成python文件
protoc --python_out=. xxx.proto