代码之家  ›  专栏  ›  技术社区  ›  Incognito

如何确定不同编码/序列化/等之间的差异?

  •  3
  • Incognito  · 技术社区  · 14 年前

    有各种类型的数据格式解码器,如Base64、ASP EventValidation对象、XML序列化或其他?我能做个简单的测试吗?

    例如,我这里有一个字符串,它是基于cgi的web表单的一部分,显然是十六进制的(完整大小是5kb): 52616e646f6d49567ef61b360522ae5ae69064f0ecb664a831c4196dad319215013aa8d04726b5d54ed673dad2004726c35e66d8b19c5177a331b24988f3cf11871084f6cc9ff808baf5cdee83f031a56dc42b65ee5309f1f1

    我不知道那是什么,十六进制到ascii给了我更多的废话,比如 Ra_d__IVo6"Odd1_1/G&?sG&OfQw1I1_eS ,它显然不是一个基64字符串。。。

    问题是:除了观察不同的类型、尝试它和猜测之外,还有别的方法吗?

    编辑: 我认为这个字符串是基于 52616e646f6d4956 ,但我的问题不是什么是字符串,而是如何轻松地说出这些事情。

    2 回复  |  直到 14 年前
        1
  •  1
  •   P.Brian.Mackey    14 年前

    你可以开发自己的启发式算法。类似于病毒扫描器。它不能100%工作,但随着时间的推移应该会有所改善。例如,您可以获取字符串,并注意它只包含十六进制字母表中的字符,将其标记为可能被加密、压缩或与十六进制字符集相关的任何其他内容。

    你可以扩展启发式来尝试N种不同的编码,并执行单词计数。这有助于缩小编码的可能性,但在简单的情况下,比如说标准英语字母表,编码表之间有很多重叠,所以你肯定会得到误报。但是,只要重叠部分不包含字符的外部/不匹配,您仍然应该得到可读的内容。

    正如马克指出的,并非所有的内容都一定是可读的内容。图片、zip文件和其他数据列表在转换为编码表表示形式时将导致纯无意义。但是,即使是这样的项目也有可能包含由启发式检测到的一致数据。

    这个话题可能会很复杂。看看TCP协议。人们不仅仅是通过互联网发送数据包,期望在客户端对数据进行某种神奇的解释有预定义的规则(协议)来定义在客户机/服务器之间传输数据的方式和类型。因此,要直接回答您关于“猜测”的问题,您不能确定您将收到的数据或您的解释,但您肯定可以开发比“猜测”更智能的应用程序。

        2
  •  1
  •   Marc Gravell    14 年前

    一般情况下这很难。显然,寻找正确的字符范围有助于发现base-64之类的内容,但除此之外,还需要大量的每类型逻辑。任何基于文本的内容都可以 它本身 例如,使用任何Unicode/代码页编码。

    Xml和json很容易推断(根据起始字符猜测,然后尝试通过解析器/验证器运行它)。当然,非x-HTML会使事情复杂化。

    二元形式更复杂,数量也更多;它可能是图像, ? 听起来?拉链?或者二进制数据格式;protobuf?还是定制?

    我们在哪边?

    那么,整个有效负载是gzip吗?泄气?加密的?

    所以是的;这可能是可以做到的——例如,wireshark尝试。但它是 许多 工作,没有神奇的捷径。