float的编码方式

逆向工程 拆卸 编码 联网 漂浮 线鲨
2021-07-06 15:05:23

我正在逆转这个游戏并被卡住了。简单来说,您在游戏中拥有一定数量的硬币(floatdouble),您可以将其花在一些事情上。我开始嗅探网络流量并注意到不同数量的硬币,只有 2 个字节的变化。

我购买了不同数量的硬币并复制了这两个字节:

(5)

1111 0100 0000 0011 (F4 03)

---------------------------

(6)

1101 1000 0000 0100 (D8 04)

---------------------------

(7)

1011 1100 0000 0101 (BC 05)

---------------------------

(8)

1010 0000 0000 0110 (A0 06) 

---------------------------

(9)

1000 0100 0000 0111 (84 07)

---------------------------

(10)

1110 1000 0000 0111 (E8 07)


(11)

1100 1100 0000 1000 (CC 08)

---------------------------

(12)

1011 0000 0000 1001 (B0 09)

---------------------------

(13)

1001 0100 0000 1010 (94 0a)

---------------------------

(14)

1111 1000 0000 1010 (F8 0a)

---------------------------

(15)

1101 1100 0000 1011 (DC 0B)

---------------------------
(16)

1100 0000 0000 1100 (C0 0C)

---------------------------

(17)

1010 0100 0000 1101 (A4 0D)

---------------------------

(18)

1000 1000 0000 1110 (88 0E)

---------------------------

(19)

1110 1100 0000 1110 (EC 0E)

---------------------------

(20)

1101 0000 0000 1111 (D0 0F)

第一行代表我拥有的硬币数量,第二行是来自wireshark的相应十六进制字节。我不知道为此使用哪种编码方法。也许有人有一些经验并知道其背后的算法。谢谢。

更新

8

1010 0000 0000 0110 (A0 06) 

-----------------------------


16

1100 0000 0000 1100 (C0 0C)

--------------------------

256

1100 1000 0000 0001 (C8 01)

----------------------------

512

1001 0000 0000 0011 (90 03)

-----------------------------


2048

1100 0000 0000 1100 (C0 0C)

----------------------------

4096

1000 0000 0001 1001 (80 19)

-----------------------------

8192

1000 0000 0011 0010 (80 32)

------------------------------

请注意,204816具有相同的代码。我不明白为什么会这样,它是如何区分162048

硬币的不同量可以在不同的房间费用,例如816在一个房间里的花,它具有的最大限制30256512在二号房,其余在三号房。当我进入一个有不同数量硬币的房间时,我所看到的只是同一个房间中字节之间的差异,不同的房间中有不同的字节,据我所知,这是对房间本身的描述。我是否可能丢失了一些字节?

但是当我用不同的硬币进入三号房间时,2048 4096 8192这些是唯一发生变化的字节。

更新 2

64   - 00110010
128  - 01100100
1024 - 1010000000000110

所以我们有

  8     1010000000000110
  16    1100000000001100
  32 ?
  64    00110010
 128    01100100
 256    1100100000000001
 512    1001000000000011
1024    1010000000000110
2048    1100000000001100
4096    1000000000011001
8192    1000000000110010

我无法进入,32因为我无法进入具有该值的任何房间。

1个回答

这不是一个完整的答案,但有点不适合评论。

2 的幂肯定有一个模式。它们都恰好设置了 4 位。高位始终为 1,低 15 位似乎是相同的位模式 (11001),但轮换到不同的位置。尝试填补空白 (32, 64, 128, 1024) 并以没有空格的二进制显示以使其更清晰。

   8    1010000000000110
  16    1100000000001100
  32    ?
  64    ?
 128    ?
 256    1100100000000001
 512    1001000000000011
1024    ?
2048    1100000000001100
4096    1000000000011001

您观察到的重复项 16 和 2048 表明您丢失了一个或多个相关字节。我也会猜想 1024 和 8 是一样的。


编辑:额外的信息是最小增量为 0.01 以及当值加倍时发生的情况强烈表明这些不是浮点数,但实际上是缩放因子为 100 的定点。

如果您将硬币数量转换为十进制,乘以 100 并转换为二进制,您会得到 -

   8    8.00    800 00000000001100100000
  16   16.00   1600 00000000011001000000
  32   32.00   3200 00000000110010000000
  64   64.00   6400 00000001100100000000
 128  128.00  12800 00000011001000000000
 256  256.00  25600 00000110010000000000
  ..
4096 4096.00 409600 01100100000000000000

正如我所希望的,我们再次看到了 11001 形态。

对我来说,这证实了我们在正确的行上,但必须有除您识别的两个以外的字节中的信息,因为 16 位不足以涵盖可能值的范围和分辨率。

为了帮助找到这些,我现在建议尝试以下值对 -

20971.51 and 20971.52
10485.75 and 10485.76
 5242.87 and  5242.88
 2621.43 and  2621.44
 1310.71 and  1310.72
  655.35 and   655.36
  327.67 and   327.68
  163.83 and   163.84

在报告差异时,每边也有相邻的几个字节也会很有用,即使它们没有改变。