试图对时间戳的转储进行逆向工程

逆向工程 混淆 文件格式
2021-06-21 04:52:03

我有以下十六进制部分,我强烈怀疑它们背后是事件的日期:

2013.05.23  20:35:00    08014273ed2071a6800017
2013.05.23  21:45:00    08014273ed246cf0000017
2013.05.24  17:10:00    08014273ed675173000017
2013.05.25  01:10:00    08014273ed82900f000017
2013.05.25  02:15:00    08014273ed8667b3800017
2013.05.25  17:15:00    08014273edb9c78e800017
2013.05.25  19:55:00    08014273edc2ee93000017
2013.05.25  20:30:00    08014273edc52a5a000017
2013.05.29  06:25:00    08014273eede5079000017
2013.05.29  06:35:00    08014273eedeac45000017
2013.05.29  06:40:00    08014273eedf09c6800017
2013.05.30  21:40:00    08014273ef64b021800017

第一个和第二个是我对事件的观察(我没有精确的分钟和秒时间),也可能在我的时区。第三列是十六进制值,我怀疑这是这次的演示。目前,我认为0817只是分隔符。

我正在寻找时间戳表示和日期时间,但目前没有成功。猜猜它是什么?

PS 更新一些完全不同的日期。我会尽量找到更早的日期。感谢帮助

2013.01.01  00:50:00    08014273bf2ba0ed000017
2012.12.15  03:25:00    08014273b9bbb8cd000017
2个回答

第三列中的数字确实会随着时间的推移而增加,这是一个好的开始。让我们检查连续行上数字之间的差异,看看进展是否是线性的:

#!/usr/bin/env python
import re, sys, time
lines = sys.stdin.readlines()
def parse(l): return time.mktime(map(int,l[0:6]) + [0]*3), int(l[6], 16)
stamps = [parse(re.split('[\n.: ]+',line)) for line in lines]

print lines[0][:20]
for i in xrange(1,len(stamps)):
    (t1,x1) = stamps[i]
    (t0,x0) = stamps[i-1]
    print "%s  %8d %18d %12d" % (lines[i][:20], t1-t0, x1-x0, (x1-x0)/(t1-t0))

输出:

2012.12.15  03:25:00
2013.01.01  00:50:00   1459500   1530417643520000   1048590368
2013.05.23  20:35:00  12339900  12935551254528000   1048270346
2013.05.23  21:45:00      4200      4377804800000   1042334476
2013.05.24  17:10:00     69900     73549217792000   1052206263
2013.05.25  01:10:00     28800     29955719168000   1040129137
2013.05.25  02:15:00      3900      4224712704000   1083259667
2013.05.25  17:15:00     54000     56486789120000   1046051650
2013.05.25  19:55:00      9600     10063183872000   1048248320
2013.05.25  20:30:00      2100      2455764992000   1169411900
2013.05.29  06:25:00    294900    309126496256000   1048241764
2013.05.29  06:35:00       600       394264576000    657107626
2013.05.29  06:40:00       300       401604608000   1338682026
2013.05.30  21:40:00    140400    146949537792000   1046649129

进展实际上基本上是线性的,最极端的速率对应于不确定性相对较大的最短间隔。日、月或年的变化没有明显的跳跃,因此该数字可能直接是时间单位的数量,而不是装在列中的年-月-日-时-分-秒。

速率接近纳秒,但实际上接近每秒 10.48 亿滴答。很可能右边的一些数字编码了其他东西。

值得注意的是,所有的差异都是 1000 的倍数。让我们以十进制打印出十六进制数:

9677354747411355314159639
9677354748941772957679639
9677354761877324212207639
9677354761881702017007639
9677354761955251234799639
9677354761985206953967639
9677354761989431666671639
9677354762045918455791639
9677354762055981639663639
9677354762058437404655639
9677354762367563900911639
9677354762367958165487639
9677354762368359770095639
9677354762515309307887639

639并不显着,而且我在前面的数字中也没有看到任何模式。不过,数据似乎确实是在某个时候通过连接十进制数字构建的。

还记得接近每秒 10.48 亿的间隔吗?由于最后 3 个十进制数字可能不是时间的一部分,我们必须将这个数字除以 1000。结果非常接近每秒 2^20 个部分。所以数据看起来在某些时候是用十进制组装的,在其他时候是十六进制的!让我们将十六进制数除以 1000,但以十六进制打印出来:

for (l,s) in zip(lines, stamps): t = (s[1] - 639) / 1000; print l[:20], s[0], hex(t)

输出:

2012.12.15  03:25:00 1355538300.0 0x20c9c4695f29de6a7efL
2013.01.01  00:50:00 1356997800.0 0x20c9c469756f1e6a7efL
2013.05.23  20:35:00 1369337700.0 0x20c9c46a31abcd6a7efL
2013.05.23  21:45:00 1369341900.0 0x20c9c46a31bc1c6a7efL
2013.05.24  17:10:00 1369411800.0 0x20c9c46a32ce1a6a7efL
2013.05.25  01:10:00 1369440600.0 0x20c9c46a333db26a7efL
2013.05.25  02:15:00 1369444500.0 0x20c9c46a334d6f6a7efL
2013.05.25  17:15:00 1369498500.0 0x20c9c46a341fdd6a7efL
2013.05.25  19:55:00 1369508100.0 0x20c9c46a34455a6a7efL
2013.05.25  20:30:00 1369510200.0 0x20c9c46a344e806a7efL
2013.05.29  06:25:00 1369805100.0 0x20c9c46a38ce166a7efL
2013.05.29  06:35:00 1369805700.0 0x20c9c46a38cf8e6a7efL
2013.05.29  06:40:00 1369806000.0 0x20c9c46a38d10d6a7efL
2013.05.30  21:40:00 1369946400.0 0x20c9c46a3af47b6a7efL

那些最后 5 个十六进制数字是常数。左边的下一部分大致对应于某个纪元以来的秒数。去掉左边的一些数字应该会产生纪元,难点是知道要去掉多少个十六进制数字和要去掉多少个十进制数字。我找不到好看的时代。

按照 Gilles 的回答,前 7 个十六进制数字 (0801427) 和最后 5 个 (00017) 不是时间戳的一部分。其余的是从 2004 年 11 月 4 日开始的毫秒数。如果将其转换为日期,则会得到

3b9bbb8cd0  2012.12.15  03:30:30
3bf2ba0ed0  2013.01.01  00:55:50
3ed2071a68  2013.05.23  19:40:53
3ed246cf00  2013.05.23  20:50:28
3ed6751730  2013.05.24  16:19:30
3ed82900f0  2013.05.25  00:15:38
3ed8667b38  2013.05.25  01:22:47
3edb9c78e8  2013.05.25  16:20:37
3edc2ee930  2013.05.25  19:00:34
3edc52a5a0  2013.05.25  19:39:36
3eede50790  2013.05.29  05:33:02
3eedeac450  2013.05.29  05:39:18
3eedf09c68  2013.05.29  05:45:41
3ef64b0218  2013.05.30  20:41:23

五月的时间或关闭一小时。那可能是夏令时。

我不知道为什么是那个特定的时代。可能是生成时间戳的任何内容的发布日期。