找出Profobuf消息的类型(Google Chrome Sync)



我正在尝试连接到Google Chrome同步(同步您的Chrome设置和当前打开的选项卡)。现在我专注于标签同步。我连接到Google Talk服务器,每当我在Chrome浏览器中导航到一个新的网页时,我都会收到来自tango bot的消息。

但我有困难解码这些消息,因为他们在谷歌的protobuf格式编码-因为有吨不同的protobuf类专用于Chrome同步,我认为没有办法弄清楚二进制protobuf消息的类型?

一个典型的消息看起来像这样(base64编码,XXXX不出我的邮件地址):

CAAilQEKQAoGCgQIAxACEiUKBgoECAMQARISCZwF6dZYmkeFEXZLABNN3/yMGgcIhSwQAxgBINP80ri/JyoIMTgxOTgxMjYaUQpPCgwI7AcSB1NFU1NJT04QARiw64/I0se0AiIyVzpDaGZDeU9JWUZXdXFuUmRXaGtJWk94VkRSM1lmTGU1M0FoRGVxT2EwOHVQUHcyOD0wASoGCgQIAxACMAI4AUIrCG8SJxAEGAIiFGRlbHXXXXXXXXdAZ21haWwuY29tQgl0YW5nb19yYXdIAQ==

我试着用一些protobuf类(我为Java编译的)解码它,但没有一个我得到任何有用的数据。

有人有关于这个话题的更多信息吗?关于如何找到正确的protobuf类来解码某个二进制消息的一些见解将是非常好的。在某种程度上,它甚至可以帮助我解码我上面给出的例子的确切信息。它的公共文档很少,而且如果你不是一个c++爱好者的话,Chromium的源代码真的很难看懂……

是的,这在很大程度上是可能的;然而,它不能与你已经发布的数据,因为你已经损坏了它不可挽回地在你试图删除你的电子邮件地址。Protobuf对此非常敏感;我试着用一个6个字母的电子邮件地址的base-64替换XXXXXXXX,但是在那之前的字节是199,199不能在那里是合法的(字符串内容之前的数据是编码为可变值的字符串的长度,可变值永远不能以最后一个字节集的最有效位结束,因为MSB是一个延续标志)。

如果你有原始的protobuf二进制文件,你可以试着通过protoc --decode_raw运行它,看看它说什么;这可能会给你足够的时间开始重建布局。或者,您可以尝试使用首选实现的"阅读器"API(如果有的话)手动解析它。例如,使用protobuf-net和ProtoReader,我能够拼凑在一起(括号中的数字是读取每个字段头后的偏移量):

{
    (1) field 1: varint, value 0 if int
    (3) field 4: string, looks like sub-message
    // everything after this point is really really suspect
        (6) field 1, string, looks like sub-message
            (8) field 1, string, looks like sub-message
            (16) field 2, string, looks like sub-message
            (55) field 4, varint, 1357060030035 assuming int64
            (62) field 5, string; "18198126"
        (72) field 3, string, looks like sub-message
            (64) field 1, string, looks like some encoded session data
    (155) field 5: string, looks like sub-message
        (157) field 1: string, looks like sub-message
    (163) field 6: varint, value 2 if int
    (165) field 7: varint, value 1 if int
    (167) field 8: string, looks like sub-message
        (169) field 1: varint, value 111 if int
        (171) field 2: string, looks like sub-message
}

问题是,由于损坏(因为您的替换),不可能说太多超出该字段4;到那时,由于长度不一致,所有的东西都可能完全是乱码。所以过了那个点我就没什么信心了。上面的要点仅仅是为了说明:是的,您可以在不事先知道模式的情况下解析protobuf数据,从而对模式进行反向工程—但它需要:

  • 耐心和一点猜测来解释每个字段(每个电线类型可以意味着多个东西)
    • 如果您知道存储的值,而不必知道每个值如何映射到字段,那么您就有了一个开端;例如,如果你知道你被发送了一些值为22,1325,"hello world"和123.45F的东西;那么你应该能够很容易地找出映射
  • 完整的数据(遗憾的是在这种情况下丢失)

最新更新