针对12字节类型的spool文件,我们知道,每一行的后5个字节储存的是一个日期时间信息(例如:2022-09-12 08:25:11),这个日期时间是需要通过计算得到的,对于五个字节的varint编码小端序存储数据,即五个两位数的十六进制数据,用下述五个符号指代:a, b, c, d, e. 其中,a, b, c, d这四个数据均在80-FF之间,e这个数据在00-7F之间,这是varint编码的特征。
1. 单个转换:分别将a, b, c, d, e.转换为8位数二进制数据,去除二进制数据的首位数字(最高位)得到7位数二进制数据,将7位数二进制数据转换为十进制数据,最终得到如下五个十进制数据f, g, h, i, j.
2. 时间戳计算:f+g*2^7+h*2^14+i*2^21+j*2^28=p. 时间戳p值的单位是秒,以C9 B6 A9 C2 05这五个字节为例,通过上述计算得到的p=1481268041秒。
3. 日期时间计算:育碧采用的是unix时间戳格式,该时间戳格式从北京时间的1970年1月1日08:00:00开始计时,我们利用网页在线时间戳转换工具,输入p值秒数即可转换成日期,得到当p=1481268041秒时,日期时间为2016-12-09 15:20:41.
要自定义任一条成就的解锁时间,就要利用p值反推得到a, b, c, d, e.
逆运算过程如下:
1. 日期时间转时间戳得到p值
2. p / 268435456 = j 余 n
3. n / 2097152 = i 余 m
4. m / 16384 = h 余 k
5. k / 128 = g 余 f
6. 将 f, g, h, i, j 转换为7位二进制,不足的向前补0
7. 给 f, g, h, i 前加1,j 前加0变为8位二进制
8. 八位二进制转两位十六进制