Bash 将REG_二进制值(64位十六进制值-小尾端)转换为日期和时间

Bash 将REG_二进制值(64位十六进制值-小尾端)转换为日期和时间,bash,shell,computer-forensics,Bash,Shell,Computer Forensics,我想将Windows NT关机时间转换为日期和时间: 88 33 9d cb 38 36 d0 01 --> 88339dcb3836d001 --> 22.01.2015 11:44:35 (UTC) 输入数据是这个64位十六进制值(8字节)。您可以在windows注册表中的HKLM\SYSTEM\ControlSet001\Control\windows-->关机时间下找到此值。此值包含上次关机的时间和日期。该值的类型为FILETIME——一个64位时间值(十六进制值,小尾端)

我想将Windows NT关机时间转换为日期和时间:

88 33 9d cb 38 36 d0 01 --> 88339dcb3836d001 --> 22.01.2015 11:44:35 (UTC)
输入数据是这个64位十六进制值(8字节)。您可以在windows注册表中的
HKLM\SYSTEM\ControlSet001\Control\windows-->关机时间
下找到此值。此值包含上次关机的时间和日期。该值的类型为
FILETIME
——一个64位时间值(十六进制值,小尾端),表示自UTC午夜(1601年1月1日)以来的100纳秒间隔数


这可以通过shell(bash)实现吗?我想在shell脚本中实现它。

如问题中所述,Windows NT关机时间是从1601年1月1日开始的100ns间隔计数。唯一需要注意的是,时间戳被编码为little endian。在纯Bash中,解码时间戳并将其添加到epoch中有点棘手,但是如果您不需要安装Python,这将变得相当容易

以下是执行转换的脚本:

#! /usr/bin/python3

from __future__ import division
import struct
import sys
from binascii import unhexlify
from datetime import datetime, timedelta

nt_timestamp = struct.unpack("<Q", unhexlify(sys.argv[1]))[0]
epoch = datetime(1601, 1, 1, 0, 0, 0)
nt_datetime = epoch + timedelta(microseconds=nt_timestamp / 10)

print(nt_datetime.strftime("%c"))
如果需要其他格式,请使用标准的
strftime()
格式说明符编辑最后一行。

分享更多知识:-)


得到了这个

你知道计算是如何进行的吗?如果是这样的话,可以使用shell工具轻松完成。输入数据的格式是什么?请你的问题提供更多细节。就像我说的,你的问题,而不是使用评论来添加更多细节。shell脚本应该如何访问此值?它是在文本文件中,还是在shell变量中,还是什么?这不是我的问题!我已经有了这个值。我在mac上将/usr/bin/python3更改为/usr/local/bin/python3。非常感谢你的帮助!
$ ./nttime.py 88339dcb3836d001
Thu Jan 22 11:44:35 2015
$regKey = Get-ItemProperty -Path
Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Windows
$shutDown = $regKey.ShutdownTime
$Int64Value = [System.BitConverter]::ToInt64($shutDown, 0)
$date = [DateTime]::FromFileTime($Int64Value)

$date