Binary 解码十六进制文件

Binary 解码十六进制文件,binary,hex,Binary,Hex,我想使用一个提供二进制文件和一些数据的Web服务,我知道结果,但我不知道如何用脚本解码这个二进制文件 这是我的二进制文件: 有些部分是ASCII格式的,所以很容易捕捉到,在文件的末尾,你得到了ASCII格式的车辆名称和一些数据,应该是kill/victory/battle/XP/Money数据,但我不明白如何解码这些hexa值,我尝试比较了两辆杀车相同的车辆,但我没有看到任何匹配 有办法解码这些数据吗 谢谢:) 大家好,1年后,我又开始寻找解决方案,下面是我猜的数据包的结构:(在[]之间的部

我想使用一个提供二进制文件和一些数据的Web服务,我知道结果,但我不知道如何用脚本解码这个二进制文件

这是我的二进制文件:

有些部分是ASCII格式的,所以很容易捕捉到,在文件的末尾,你得到了ASCII格式的车辆名称和一些数据,应该是kill/victory/battle/XP/Money数据,但我不明白如何解码这些hexa值,我尝试比较了两辆杀车相同的车辆,但我没有看到任何匹配

有办法解码这些数据吗

谢谢:)


大家好,1年后,我又开始寻找解决方案,下面是我猜的数据包的结构:(在[]之间的部分我仍然不知道它的用途)

结果如下:

  • 胜利:78
  • 战斗:234
  • 胜率:?(应在33%左右)
  • 死亡人数:212
  • 重生:236
  • 空中目标:136
  • 地面目标:657
  • Xp:?(应在566.56k左右)
  • 钱:?(应在4.63米左右)
有没有特殊的方法来计算这样一个长十六进制的结果?
F5 C2 9A 02
(应在4.63米左右)

我再告诉你一点:

我知道结果,但我不知道如何用数据包中的这些十六进制数来计算

如果我检查一个小金额的数据包或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

挣得的钱=
十六进制C7 08
=705

C7 08如何实现705十进制?

以下是本案例的全部内容,但我知道如何仅隔离这些部分,我不需要解码所有这些十六进制数据:

这看起来更像是二进制文件的hextump。将十六进制转换为字符串的过程会导致相同的加扰输出。只有一些行是这样可读的

Dgamaxcardicon_32" The Old Guard
正如@Tarun Lalwani所说的,您必须知道这些数据的结构才能以明文形式获取数据


如果您有权访问原始二进制文件,可以尝试使用
字符串

任何类型的文件读取操作都可以通过基本文件处理程序以文本或二进制格式完成。有些语言提供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 and unpack对某些数据类型(如int和float)使用与机器相关的大小,因此使用它们时要小心。阅读官方和手册。

你所问的只是如何对二进制文件进行反向工程。很多线程已经在运行


最后一个问题是,没有一个解决方案适合您,您需要花费精力来解决它。有一些工具可以帮助你,但不要指望魔杖工具能为你提供结构/数据

没有线索?:<有可能这样做吗?或者我需要这个包的模型吗?你从来没有提到过要使用什么语言?我实际上是用PHP下载这个二进制文件。你共享的pastebin更像是二进制文件的十六进制表示。文件是这样的,还是它是一个实际的二进制文件?这看起来像是一些以二进制格式编写的结构化数据,除非您知道其结构,否则无法从中提取数据。否则,这将意味着逆向工程的文件和一个耗时的工作我的问题不是如何将十六进制转换为ascii,但我正在寻找一种方法来解码所有的数据,很少与ascii兼容,但大多数不兼容,这是我要解码的部分。明白了,就像@Tarun说的,你需要知道数据是如何结构的。除非其他人有想法:)好的,谢谢,是的,我想我们需要知道结构,但我也在想如果我得到这个文件和结果,也许我可以通过匹配一些数据来猜测结构,但现在我发现没有什么有趣的:
<?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);
 ?>