我在计算机上的软件和远程服务器上的软件之间拦截了数据包。我们的想法是在两者之间对API进行反向工程,并将API集成到另一个软件模块中。
问题在于我无法弄清楚如何读取数据。这是一个92字节的十六进制数据给出一个例子:
10:02:42:6d:95:72:1a:70:be:00:ba:cc:a9:95:72:81:49:dd:00:ae:39:bd:c2:4a:0e:00:d1:fe:a6:01:fc:51:09:42:c1:49:dd:00:59:57:31:b2:3a:ce:00:d1:7e:7c:fa:1d:65:c9:42:41:7c:b6:40:dd:f5:71:52:f1:c7:65:12:be:c0:86:71:03:62:eb:81:49:dd:00:dd:f5:71:dc:7a:ce:00:d1:be:00:ba:1d:65:61:52:c2
这将转换为ASCII字符串:
??Bm?r?p??????r?I???9??J???????Q?B?I??YW1?:???~|??e?BA|?@??qR??e????q?b??I????q?z???????eaR?
如果有帮助,我知道大约这些数据应包含的内容。
我只是在寻找帮助我破解代码的入门提示。
答案 0 :(得分:2)
假设数据仅被编码,而不是加密,那么可能揭示有关数据的大量信息的一件事就是随着时间的推移比较数据包。 随时间变化的部分可能是数据,而不部分的部分可能是结构信息。
通过改变软件的状态进行实验(假设这是可能的),在数据中观察到的任何变化都是线索。
由于您大致知道数据包应该包含哪些内容,因此可能会为您提供足够的线索来确定数据格式。特别是如果您可以很好地控制软件的状态。
注意:强> 还要记住,多字节数据具有endianess,并假设错误的endianess会使事情变得非常混乱。类似地,还有许多其他方法来编码字符串而不是ASCII。
如果发送了大量数据,您可能还需要检查数据是否以任何方式压缩。
答案 1 :(得分:1)
这些数据实际上可能不是加密的,因为它可能是编码的。
您可能正在处理的一种可能的编码是称为基本编码规则(BER)的标准。这是一种将抽象语法表示法一(ASN.1)数据结构编码为二进制流的方法。
查看http://en.wikipedia.org/wiki/Basic_Encoding_Rules以获取一些见解。
但值得注意的是,有多种工具包可供各种语言使用,这样可以更轻松地处理BER数据。我见过的最广泛的一个是名为Convert :: ASN1的Perl库。
希望这很有用,我会尝试使用更多工具包来保持最新版本,因为我遇到了这些编码。
此外,如果仅对此进行编码,则还可能使用给定值将二进制数据简单地用ASCII分隔。该值可以是您在输出中看到的管道(|)字符。有许多格式使用这种形式的有线协议,例如HL7。
答案 2 :(得分:1)
如果您不确定数据是否加密,检查的一个好方法是查看数据的随机性。
任何名副其实的加密算法都会输出完全随机出现的数据。因此,您可以迭代字节并检查值是否均匀分布。如果是这样,您可以非常确定数据是否真正加密而不仅仅是编码。