我想使用提供带有一些数据的二进制文件的web服务,我知道结果,但我不知道如何用脚本解码这个二进制文件。
这是我的二进制文件: https://pastebin.com/3vnM8CVk
0a39 0a06 3939 3831 3438 1206 4467 616d
6178 1a0b 6361 7264 6963 6f6e 5f33 3222
0d54 6865 204f 6c64 2047 7561 7264 2a02
....
有些部分是ASCII,所以很容易捕获,在文件的末尾你有ASCII的车辆名称和一些数据,它应该是kill / victory / battle / XP / Money数据,但我不明白我可以解码这些六进制值,我试图比较两辆有相同杀戮的车辆,但我没有看到任何匹配。
有一种解码这些数据的方法吗?
谢谢:)
大家好,1年后我再次开始寻找解决方案,所以这是我猜测的数据包的结构:([]之间的部分我还不知道它是什么用于)
[52 37 08 01 10] 4E [18] EA [01 25] AB AA AA 3E [28] D4 [01 30] EC [01 38] 88 01 [40] 91 05 [48] 9F CA 22 [50] F5 C2 9A 02 [5A 12]
| | | | | | | | |
Victories Victory Ratio| | Air target| Xp Money earned
| | | Ground Target
Battles Deaths Respawns
所以结果如下:
有没有一种特殊的方法来计算像这样的长十六进制的结果?
F5 C2 9A 02
(应该是4.63M左右)
我告诉你更多信息:
我知道结果,但我不知道如何用数据包中的这些十六进制来计算它。
如果我检查一小笔钱或XP的数据包与一个十六进制兼容:
[52 1E 08 01 10] 01 [18] [01 25] 00 00 80 3F [28] 01 [30] 01 [48] 24 [50] 6E [5A 09]
6E
= 110赚取的钱
24
= 36 XP赚取
另一个例子:
[52 21 08 01 10] 02 [18] 03 [25] AB AA 2A 3F [28] 02 [30] 03 [40] 01 [48] 78 [50] C7 08 [5A 09]
XP赢得= hex 78
= 120
赚取的钱= hex C7 08
= 705
C7 08
如何做到705十进制?
以下是完整内容,但我知道如何隔离这些部分我不需要解码所有这些十六进制数据: https://pastebin.com/vAKPynNb
答案 0 :(得分:2)
您所问的只是如何对二进制文件进行逆向工程。很多线程已经在SO
上Reverse engineer a binary dictionary file to extract strings
Tools to help reverse engineer binary file formats
http://www.iwriteiam.nl/Ha_HTCABFF.html
对所有人的最终结论是,没有一个解决方案适合你,你需要花费精力去解决它。有一些工具可以帮助您,但不要指望使用魔棒工具来为您提供结构/数据。
答案 1 :(得分:1)
任何类型的文件读取操作都是使用基本文件处理程序以文本或二进制格式完成的。有些语言提供int,float等的类型读取或它们的数组。
这些阅读背后的复杂操作几乎总是对普通用户隐藏。然后,当涉及到数据结构的读/写操作时,用户必须学习更多。
在这种情况下,OFFSET和SEEK是必须找到价值并采取相应行动的词语。数据读取时,必须将其转换为合适的数据类型。
以下代码显示了这些操作的基础知识,用于写入数据和读取块以获取数字。它是用PHP编写的,因为OP在他使用PHP的问题中评论过。
使用这些字节值计算偏移量为11:char:1字节,short:2字节,int:4字节,float:4字节。
<?php
$filename = "testdata.dat";
$filehandle = fopen($filename, "w+");
$data=["test string","another test string",77,777,77777,7.77];
fwrite($filehandle,$data[0]);
fwrite($filehandle,$data[1]);
$numbers=array_slice($data,2);
fwrite($filehandle,pack("c1s1i1f1",...$numbers));
fwrite($filehandle,"end"); // gives 3 to offset
fclose($filehandle);
$filename = "testdata.dat";
$filehandle = fopen($filename, "rb+");
$offset=filesize($filename)-11-3;
fseek($filehandle,$offset);
$numberblock= fread($filehandle,11);
$numbersback=unpack("c1a/s1b/i1c/f1d",$numberblock);
var_dump($numbersback);
fclose($filehandle);
?>
一旦理解了这个例子,剩下的就是在请求的文件中找到数据结构。我写了另一个例子,但它使用了假设。我把剩下的留给读者,找出我在这里做出的假设。但要小心:我对真实结构一无所知,价值也不正确。
<?php
$filename = "testfile";
$filehandle = fopen($filename, "rb");
$offset=17827-2*41; //filesize minus 2 user area
fseek($filehandle,$offset);
print $user1 = fread($filehandle, 41);echo "<br>";
$user1pr=unpack("s1kill/s1victory/s1battle/s1XP/s1Money/f1Life",$user1);
var_dump($user1pr); echo "<br>";
fseek($filehandle,$offset+41);
print $user2 = fread($filehandle, 41);echo "<br>";
$user2pr=unpack("s1kill/s1victory/s1battle/i1XP/i1Money/f1Life",$user2);
var_dump($user2pr); echo "<br>";
echo "<br><br>";
$repackeduser2=pack("s3i2f1",$user2pr["kill"],$user2pr["victory"],
$user2pr["battle"],$user2pr["XP"],$user2pr["Money"],
$user2pr["Life"]
);
print $user2 . "<br>" .$repackeduser2;
print "<br>3*s1=6bytes, 2*i=6bytes, 1*f=*bytes (machine dependent)<br>";
print pack("s1",$user2pr["kill"]) ."<br>";
print pack("s1",$user2pr["victory"]) ."<br>";
print pack("s1",$user2pr["battle"]) ."<br>";
print pack("i1",$user2pr["XP"]) ."<br>";
print pack("i1",$user2pr["Money"]) ."<br>";
print pack("f1",$user2pr["Life"]) ."<br>";
fclose($filehandle);
?>
PS:pack和unpack使用与机器相关的大小来处理某些数据类型,例如int和float,因此请小心处理它们。阅读官方PHP:pack和PHP:unpack手册。
答案 2 :(得分:0)
这看起来更像是二进制文件的hexdump。将十六进制转换为字符串的Some methods导致相同的加扰输出。只有一些行可以这样读......
Dgamaxcardicon_32" The Old Guard
正如@Tarun Lalwani所说,你必须知道这些数据的结构才能获得明文。
如果您有权访问原始二进制文件,可以尝试使用strings
https://serverfault.com/questions/51477/linux-command-to-find-strings-in-binary-or-non-ascii-file