Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 奇怪的64位时间格式的游戏,你能认出来吗?_Date_Delphi_Time_64 Bit - Fatal编程技术网

Date 奇怪的64位时间格式的游戏,你能认出来吗?

Date 奇怪的64位时间格式的游戏,你能认出来吗?,date,delphi,time,64-bit,Date,Delphi,Time,64 Bit,我从一个游戏中捕获了这个64位时间格式,并试图理解它。 我不能使用日期增量,因为该值不时会发生变化,甚至变成负数,如下所示 v1:int64=-5990085973098618987; //2021-01-25 13:30:00 v2:int64=-5990085973321147595; //4 mins later v3:int64=6140958949625363349; //7 mins later v4:int64=6140958948894898101; //11

我从一个游戏中捕获了这个64位时间格式,并试图理解它。 我不能使用日期增量,因为该值不时会发生变化,甚至变成负数,如下所示

v1:int64=-5990085973098618987;   //2021-01-25 13:30:00
v2:int64=-5990085973321147595;   //4 mins later
v3:int64=6140958949625363349;    //7 mins later
v4:int64=6140958948894898101;    //11 mins later
v5:int64=-174740204032730139;    //16 mins later
v6:int64=-174740204054383467;    //18 mins later
v7:int64=-6490439358095090795;   //23 mins later
我尝试将64位拆分为两个32位容器,以获得低部分和高部分。还是奇怪的价值观。 我还尝试使用pdouble(@value)^获取64位数据的浮点值,这些值仍然很奇怪。 所以有点没主意了,可能是一些位域数据或其他的东西

hipart: -1394675573 | lopart: 1466441621  | hex: acdef08b|57681f95 | swap: -7701322112560996692
hipart: -1394675573 | lopart: 1243913013  | hex: acdef08b|4a249b35 | swap: 3862721007994330796
hipart: 1429803424  | lopart: -458425451  | hex: 553911a0|e4acfb95 | swap: -7639322244965910187
hipart: 1429803424  | lopart: -1188890699 | hex: 553911a0|b922f7b5 | swap: -5334757052947285675
hipart: -40684875   | lopart: -760849435  | hex: fd9332b5|d2a65be5 | swap: -1919757392230050819
hipart: -40684875   | lopart: -782502763  | hex: fd9332b5|d15bf495 | swap: -7641381711494605827
hipart: -1511173174 | lopart: -1467540587 | hex: a5ed53ca|a8871b95 | swap: -7702413578668347995
欢迎提出任何想法,提前谢谢 //抵押贷款证券

--编辑:到目前为止,感谢Martin Rosenau,我们能够这样编码:

func mulproc_nfsw(i:int64;key:uint32):int64;
begin
 if (blnk i) or (blnk key) then exit;
 p:pointer=@i;
 hi:uint32=uint32(p+4)^; //30864159 (hex: 01d6f31f)
 lo:uint32=uint32(p)^; //748455936 (hex: 2c9c8800)
 hi64:int64=hi*key; //0135b55a acdef08b <-- keep
 lo64:int64=lo*key; //1d566e0b a65f2800 <-- keep
 q:pointer=@result; //-5990085971773806592
 uint32(q+4)^:=hi64; //acdef08b
 uint32(q)^:=lo64; //a65f2800
end;
--编辑2:最后,多亏了fpiette,我们还能够解码:

func decode_time_nfsw(i:int64):juncture;
begin
 if blnk i then exit; //input: -5990085971773806592
 key:uint32=$3069263D; //decode key
 ft:int64=mulproc_nfsw(i,key);
 result.setfiletime(ft);
end;

我怀疑高32位和低32位只是乘以A85A2115(十六进制):

我们得到了一个结构。然后我们分别对高位和低位字执行32x32->32位乘法(这意味着我们丢弃64位结果中的高位32位)

例如:

25 Jan 2021 13:37:07 (and some milliseconds)
未加密的文件时间:

High dword = 1D6F31F (hex)
Low dword  = 2C9CA481 (hex)
倍增

High dword: 1D6F31F * A85A2115  = 135B55AACDEF08B (hex)
Low dword:  2C9CA481 * A85A2115 = 1D5680CA57681F95 (hex)
现在只取结果的低32位:

High dword: ACDEF08B (hex)
Low dword:  57681F95 (hex)
不幸的是,我不知道如何做“反向操作”;我使用以下伪代码在循环中搜索结果:

encryptedValue = 57681F95 (hex)
originalValue = 0
product = 0
while product not equal to encryptedValue
    // 32-bit addition discarding carry:
    product = product + A85A2115 (hex) 
    originalValue = originalValue + 1
end_of_while_loop
我们得到以下结果:

25 Jan 2021 13:37:07 => acdef08b|57681f95
25 Jan 2021 13:40:51 => acdef08b|4a249b35
25 Jan 2021 13:45:07 => 553911a0|e4acfb95
25 Jan 2021 13:49:03 => 553911a0|b922f7b5
25 Jan 2021 13:53:53 => fd9332b5|d2a65be5
25 Jan 2021 13:55:50 => fd9332b5|d15bf495
25 Jan 2021 14:00:39 => a5ed53ca|a8871b95
附录

反向操作似乎是通过与3069263D(十六进制)相乘(并且仅使用低位32位)来完成的

加密:

2C9CA481 * A85A2115 = 1D5680CA57681F95
=> Result: 57681F95
解密:

57681F95 * 3069263D = 10876CAF2C9CA481
=> Result: 2C9CA481

高32位似乎不会经常改变;您知道高32位的变化频率/时间吗?很明显,低半字节(低4位)总是5,高字之间的差异总是相同的。大约每5分钟左右,中间看起来变化不大。如果使用100ns的时基(如“”),高32位大约每7.2分钟变化一次。低32位和高32位似乎彼此独立编码(可能加密)。很明显,高32位乘以A85A2115(十六进制),可能是在加上一些偏移量之后,只取乘积的低位。它可能是一个时间戳计数器值。该时间由64位寄存器给出,并由RDTSC指令读取。要获得实时,您需要获得一次实际实时时钟时间以获得偏移量。更多细节:如果时间发生了根本性的变化,很可能是混淆。最有可能的是一个简单的异或,但可以是任何易于恢复的东西。也可以使用共享密钥算法(如DES)对其进行加密。OP给出的时间(2021-01-25 13:30:00)是否会导致他给出的值(-5990085973098618987=0xACDE F08B 5768 1F95)?@Martinau Rosenau哇Martin这是个不错的工作人员。我也很想知道你是如何发现A85A2115的值:)现在我可以编码成这种格式了,看起来不错。是的-有点可笑,它被关闭了7分7秒,因为我在13:30:00的时候按了回车键,但我认为这是因为游戏中的延迟或其他原因。我将接受你的答案(当然),但我还没有设法解码它(我的语言进入了infitnite循环lol),你能想出一个更优化的解码方法吗?也许除法编码是用乘法完成的?@mortenbs很明显,上面的32位大约每5分钟改变一次。所以我怀疑这个字是64位计数器的高位字,它在大约5分钟内发出2^32个滴答声。当然,“未加密”字每5分钟递增1。接下来我做的就是简单地减去这些值;我发现差别总是一个85A2115。如果每次增加未加密值时加密值都会改变A85A2115,那么很明显加密是通过乘以A85A2115来完成的。请注意,0xA85A2115*0x3069263D等于1(在截断为32位后),这解释了为什么要恢复原始数。@f让你们摇滚吧,现在它可以双向工作了。为了完全理解你是如何做到这一点的,我必须读几遍这些内容:)但我能够根据你的信息创建例程,并将其作为对原始帖子的编辑。我怎么才能相信你们俩呢?--你们也可能知道cs值,我认为它是校验和/散列值的一种形式,如果我提出一个新的问题,你们会加入吗?感谢所有参与此活动的人!有效:)
57681F95 * 3069263D = 10876CAF2C9CA481
=> Result: 2C9CA481