SeeFlowerX / frida-protobuf

308 stars 109 forks source link

double和float无法正确解析,匿名内部类无法正确解析 #3

Closed itzuimao closed 2 years ago

itzuimao commented 2 years ago

这是目前使用中出现的两个问题,希望尽快修复。 可以在哔哩哔哩的com.bapis.bilibili.app.playurl.v1.PlayViewReply和com.bapis.bilibili.main.community.reply.v1.DetailListReply两个类中复现此bug

SeeFlowerX commented 2 years ago

你的问题描述很模糊,信息不全,APP版本、测试样本、命令都没有。

我测试在转换proto、proto转py上都是没有问题的,如图

image image image

测试的APP版本是6.51.0 (release-b7076571)

frida-server版本是14.2.18

使用的命令如下

python -m frida_protobuf.main -n tv.danmaku.bili --use-default-any --keywords-expected "bili"
python -m frida_protobuf.generate --proto com.bapis.bilibili.app.playurl.v1.PlayViewReply
python -m frida_protobuf.proto2py --proto com.bapis.bilibili.app.playurl.v1.PlayViewReply

对目标链接抓包

然后对抓包结果进行解析,代码如下,可以正常解析

import gzip
import struct
from io import BytesIO
from pathlib import Path
from google.protobuf.json_format import MessageToDict
from pyproto.com.bapis.bilibili.app.playurl.v1.PlayViewReply_pb2 import PlayViewReply

def gzip_decompress(msg: bytes):
    compressed = gzip.GzipFile(fileobj=BytesIO(msg))
    return compressed.read()

def slice_message(msg: bytes):
    byteorder, length = struct.unpack("!bl", msg[:5])
    if byteorder == 0x01:
        return gzip_decompress(msg[5:5 + length])
    return msg[5:5+length]

resp = Path(r'bili/response_body.bin').read_bytes()
resp = slice_message(resp)
popular_reply = PlayViewReply()
popular_reply.ParseFromString(resp)

print(MessageToDict(popular_reply))

image

SeeFlowerX commented 2 years ago

内部类处理确实存在问题,暂时只能手动处理下,或者自行编写脚本从frida_protobuf/configs读取配置转换处理

itzuimao commented 2 years ago

double和float的问题我已经自行处理,修改frida-protobuf\agent\src\google\generate.ts第113行,加入double和float的转换规则 let TypeConfig: tsMap = { "int": "int32", "long": "int64", "String": "string", "boolean": "bool", "Boolean": "bool", "double":"double", "float":"float" } 匿名内部类建议将类地址中的$替换为.,目前我是手动处理的