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

时间:2010-11-22 19:00:19

标签: types decode encode

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

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

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

问题基本上是:除了查看不同类型,尝试和猜测之外,还有其他方法吗?

编辑: 我认为这个字符串是基于per 52616e646f6d4956的加密数据,但我的问题不是字符串是什么,而是我如何轻松地告诉这些事情。

2 个答案:

答案 0 :(得分:1)

在一般情况下会很难。显然,寻找合适的字符范围有助于发现像base-64这样的东西,但除此之外,你还需要很多每类逻辑。例如,任何基于文本的本身都可以使用任何Unicode /代码页编码。

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

二进制形式更棘手,更多;它可能是一个图像, ?声音?压缩?或二进制数据格式;也许是protobuf?还是定制?

我们在做什么Endianness?

然后;是整个有效载荷gzip?放气?加密?

是的;它可能会完成 - 例如,wireshark尝试。但这是一项很多的工作,没有任何神奇的捷径。

答案 1 :(得分:1)

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

您可以扩展启发式以尝试N种不同的编码并执行字数统计。这可能有助于缩小编码的可能性,但在简单的情况下,例如标准英语字母表,编码表之间存在大量重叠,因此您肯定会得到误报。但是,只要重叠不包含字符的外部/不匹配,您仍应获得可读内容。

正如Marc所指出的,并非所有内容都必然是可读内容。转换为编码表表示时,图片,zip文件和其他数据列表将导致纯粹的废话。但是,即使是这些项目也有可能包含启发式检测的一致数据。

这个话题非常复杂。只需看看TCP协议。人们不仅要在互联网上发送数据包,还要在客户端对数据进行一些神奇的解释。有预定义的规则(协议)来定义要在客户端/服务器之间传输的数据的方式和类型。因此,要直接回答有关“猜测”的问题,您无法确定您将收到的数据以及您的解释,但您当然可以开发出比“猜测”更聪明的应用程序。