从十六进制转储中提取日期和时间数据

逆向工程 二元分析 二进制
2021-07-02 09:04:11

我正在尝试从十六进制转储中检索日期和时间数据。我发现以下条目中包含条目 ID 和日期时间信息。但是,我不确定它是哪个偏移量。

60 03 00 00 00 F1 16 CE 18 23 8E E1 00 01 9E  ->  2011.10.29 x.x.x
38 05 00 00 00 89 70 B0 83 34 8E E1 00 01 4E  ->  2011.10.30 x.x.x
1A 06 00 00 00 89 0F 9E 71 3C 8E E1 00 01 12  ->  2011.10.31 x.x.x
24 07 00 00 00 03 45 29 A2 71 8E E1 00 01 28  ->  2011.11.02 x.x.x
1A 00 00 00 00 41 E7 A2 6E 22 DA E1 00 01 12  ->  2014.06.22 22.39.x
1A 01 00 00 00 B9 47 48 73 22 DA E1 00 01 12  ->  2014.06.22 22.40.x

我已经尝试过使用不同时代的最后 8 个字节。例如,48 73 22 DA E1 00 01 12在小端排列(纪元 Jan,1,1)中,我得到4112-01-16 18:42:48.674601.

我已经看到了这个这个与我类似的问题并尝试了他们的方法。但是,我仍然无法检索正确的数据。

另外,你能给我一份关于像这样处理二进制数据提取的书的参考吗?

1个回答

偏移量 5 处的 64 位值是自 0 年以来的微秒数:

使用这个 perl 脚本来验证:

use POSIX;
while (<DATA>) {
    if (/(.*\S)\s+->\s+(.*\S)/) {
        my ($hex, $date)= ($1,$2);

        # convert date to unix timestamp
        $date =~ s/x/0/g;
        my @f= reverse split /[. ]/, $date;
        $f[4]--;  # correct month for mktime
        $f[5]-=1900; # correct year for mktime
        my $unixtime= POSIX::mktime(@f);

        # extract qword starting at byte 5
        $hex =~ s/\s//g;
        my ($lo,$hi)= unpack("VV", substr(pack("H*", $hex), 5, 8));
        $value= $hi*0x100000000+$lo;

        printf("0x%x/1000000-%d = %d\n", $value, $unixtime, $value/1000000-$unixtime);
    }
}
__DATA__
60 03 00 00 00 F1 16 CE 18 23 8E E1 00 01 9E  ->  2011.10.29 x.x.x
38 05 00 00 00 89 70 B0 83 34 8E E1 00 01 4E  ->  2011.10.30 x.x.x
1A 06 00 00 00 89 0F 9E 71 3C 8E E1 00 01 12  ->  2011.10.31 x.x.x
24 07 00 00 00 03 45 29 A2 71 8E E1 00 01 28  ->  2011.11.02 x.x.x
1A 00 00 00 00 41 E7 A2 6E 22 DA E1 00 01 12  ->  2014.06.22 22.39.x
1A 01 00 00 00 B9 47 48 73 22 DA E1 00 01 12  ->  2014.06.22 22.40.x

导致此输出:

0xe18e2318ce16f1/1000000-1319839200 = 62168311951
0xe18e3483b07089/1000000-1319925600 = 62168300358
0xe18e3c719e0f89/1000000-1320015600 = 62168244415
0xe18e71a2294503/1000000-1320188400 = 62168300062
0xe1da226ea2e741/1000000-1403469540 = 62168241639
0xe1da22734847b9/1000000-1403469600 = 62168241657

62168241657/86400/365.2422 = 1970.03477142853579229222年