需要帮助解开 .dat 文件中的格式(时间、字符串、浮点/十进制、整数/浮点/十进制)

逆向工程 二元分析 结构体
2021-06-13 00:35:35

文件(idx、dat)来自工厂/设施操作历史记录.dat 文件应该有条目,每个条目都有标识符(标签名称/id/键)、不同时间(时间戳)的值(十进制/浮点数)以及它们的置信度(整数/百分比)。该应用程序是基于 Windows 的。每个 .dat 文件将代表几天的条目。

我已经设法识别特定字节偏移处的时间戳。看起来“记录”也是 2049 字节的块。时间戳(和附加时间戳)在每个 2049 块内重复(这有点奇怪),但也许它还保留对上次记录时间的引用,或者可能存在嵌套(父/子)记录。

我不知道我应该如何进行。

示例 dat 文件(已截断):https ://drive.google.com/open?id =0B8ACIyH1qALnLUY2cEdzVWp6T1U

完整数据文件:https : //drive.google.com/open? id =0B8ACIyH1qALnNU5wYkotMktVWVk

第一个时间值之一:80CAFEBB168DD201 偏移量为 2061十进制[] (131322467930000000 -> 2017-02-27 7:19:53 AM)

示例 idx 文件:https ://drive.google.com/open ? id =0B8ACIyH1qALnQzVueEJuRWNfUk0

感谢帮助。

更新

根据要求,一些进一步的信息:

  • 这些文件由 Honeywell PHD Uniformance Server 生成。我无法访问软件本身 - 但正在处理它。我不知道它是用什么语言写的。

  • 服务器的一些在线指南建议存在 MAX_ARCRECSIZE 配置参数 <quote>“默认为 2048。这控制存档文件中的记录大小”</endquote>。dat 文件有 2049 字节块(2048 字节 + 1 字节“0A”)

  • 据我所知,历史学家不提供类似 SQL 的界面。唯一理解的协议是 OPC 变体(OPC-DA、OPC-HDA 和可能的 OPC-UA),但是在提取历史记录时这些协议很慢。

  • 为其中一个日期(但不是第一个)给出的偏移量为十进制 2061

    =>hexdump -C -s 2061 -n 64 SCAN00356-sample.dat
    0000080d  80 ca fe bb 16 8d d2 01  02 00 00 00 12 00 00 00  |................|
    0000081d  96 07 46 04 00 00 00 00  20 5f a0 02 c2 00 00 80  |..F..... _......|
    0000082d  bf 00 3c 00 00 00 00 00  00 00 04 00 00 00 96 07  |..<.............|
    0000083d  8e 07 80 ca fe bb 16 8d  d2 01 0a 00 00 86 07 00  |................|
    0000084d
    
  • 到目前为止,我在每个 2049 个“块”中发现了 4 个不同的时间戳 (ftime)。它们具有一致的偏移量(在每个 2049 字节块的开头的第 12、62、75、94 字节处)。字节 8 处可能的序列值。字节 38 处可能的“颜色”值。

  • 还有一件事; OPC 服务器利用 COM 和 DCOM 架构。我遇到了复合二进制文件格式,但相应的读者无法读取文件。

2个回答

这篇文章由初步分析的结果组成。希望它可以为其他感兴趣的各方节省一些工作。

SO上的类似问题

可能使用 dat、idx 文件的数据库类型

如何打开 .bin/.idx 数据库文件?

哪个数据库使用这些特定类型的 .dat 和 .idx 文件?

最有趣的是:

如何从 SCADA CIMPLICITY 软件的 DAT 和 IDX 文件中提取数据?

初步分析

SCAN00356-sample.datSCAN00356.idx进行了检查。完整.dat文件的SCAN00356.dat大小为 4.0GB,并且加载到正在使用的 VM 上的内存中太大,因此尚未进行检查。

示例.dat文件SCAN00356-sample.dat

的结构SCAN00356-sample.dat不统一: SCAN00356-sample.dat 熵

额外的可视化使我们能够进一步了解文件内数据的异构分布:

字节类 1 小 细节1小 字节类 2 小 细节2小

有一个非常简短的标题,其中出现字符串“SCAN”,由 16 位字符组成。

$ hexdump -C -n 100 SCAN00356-sample.dat
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 01 00 00  |................|
00000010  00 00 00 00 00 01 00 00  80 fa 6d 1c a5 8b d2 01  |..........m.....|
00000020  00 f1 d7 49 75 8f d2 01  e8 07 00 00 53 00 43 00  |...Iu.......S.C.|
00000030  41 00 4e 00 00 00 00 00  00 00 00 00 00 00 00 00  |A.N.............|
00000040  00 00 01 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*

示例.idx文件SCAN00356.idx

与 不同SCAN00356-sample.dat, 的结构SCAN00356.idx相当统一: idx 文件熵

可视化:

idx 字节类 1 小 idx 细节 1 小

SCAN00356.idx还有一个非常小的标题。ASCII 字符串“dism”随后出现在大量编码数据之前。

 $ hexdump -C -n 2208 SCAN00356.idx
00000000  fe 53 02 02 04 04 03 ff  00 01 07 04 00 08 00 00  |.S..............|
00000010  00 00 02 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 1f ac 54 00 00 f9  3d 03 8a f0 33 00 00 00  |....T...=...3...|
00000030  01 00 00 00 00 00 08 00  00 00 00 00 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000003f0  00 00 00 00 00 00 00 00  00 00 00 00 64 69 73 6d  |............dism|
00000400  00 1c 00 00 00 00 00 16  00 00 00 03 00 00 04 00  |................|
00000410  08 06 00 08 00 00 0d 00  02 00 16 05 00 00 00 00  |................|
00000420  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000007f0  00 00 00 00 00 00 00 00  00 00 00 00 00 ff 7e 00  |..............~.|
00000800  02 9c 88 0a 00 00 ff f9  71 9f ce 72 2d 7e 00 00  |........q..r-~..|
00000810  00 00 a3 1e 0d 16 00 00  ff 77 18 28 86 72 2d 7e  |.........w.(.r-~|
00000820  00 00 00 00 4c d2 99 18  00 00 ff 03 71 b9 f1 72  |....L.......q..r|
00000830  2d 7e 00 00 00 00 a0 06  1e 28 00 00 ff 63 c4 ff  |-~.......(...c..|
00000840  ed 72 2d 7e 00 00 00 00  28 c3 94 35 00 00 7f c9  |.r-~....(..5....|
00000850  28 94 e2 72 2d 7e 00 00  00 00 a1 42 21 41 00 00  |(..r-~.....B!A..|
00000860  7f dd 10 f2 f1 72 2d 7e  00 00 00 00 4e 5e 24 51  |.....r-~....N^$Q|
00000870  00 00 ff 1c 82 c0 c5 72  2d 7e 00 00 00 00 95 50  |.......r-~.....P|
00000880  58 5b 00 00 7f 5c f5 c5  f1 72 2d 7e 00 00 00 00  |X[...\...r-~....|
00000890  16 34 02 69 00 00 ff 6f  79 56 e5 72 2d 7e 00 00  |.4.i...oyV.r-~..|

图像是使用binwalkbinvis.io创建的

SCAN00356.idx 文件具有易于识别的结构。数据区域从偏移量 0x800 开始,一直到文件的末尾。每个 0x400 页包含 18 字节的记录。当页面填满(或数据结束)时,它会在最后一条记录之后以 1 个字的索引值结束当前记录集。

仅供参考 - 只需将十六进制编辑器的视图宽度更改为 18 字节。这些结构会在你面前弹出。以下是您文件的摘录:

EF 73 05 50 01 00 FF 72 7F 46 88 72 2D 7E 00 00 00 05 
C7 14 05 50 01 00 7F E4 1C 09 8C 72 2D 7E 00 00 00 05 
A0 20 05 50 01 00 FF 55 BA CB 8F 72 2D 7E 00 00 00 05 
67 18 05 50 01 00 7F C7 57 8E 93 72 2D 7E 00 00 00 05 
44 D6 05 50 01 00 FF 38 F5 50 97 72 2D 7E 00 00 00 05 
0F 84 05 50 01 00 7F AA 92 13 9B 72 2D 7E 00 00 00 04 
CA A0 05 50 01 00 FF 1B 30 D6 9E 72 2D 7E 00 00 00 04 
A9 49 05 50 01 00 7F 8D CD 98 A2 72 2D 7E 00 00 00 04 
76 89 05 50 01 00 FF FE 6A 5B A6 72 2D 7E 00 00 00 04 
4D 6F 05 50 01 00 7F 70 08 1E AA 72 2D 7E 00 00 00 04 
2C BF 05 50 01 00 FF E1 A5 E0 AD 72 2D 7E 00 00 00 03 
FD 5B 05 50 01 00 7F 53 43 A3 B1 72 2D 7E 00 00 00 03

有些列似乎永远不会改变,例如字节串 0x72 7D 7E 00 00 00。

其他显示为标志,例如在 0xFF 和 0x7F 之间交替的列。

似乎存储了几种不同类型的记录,尽管它们都符合这种格式。有些将使用比其他更多的数据字节。

这有某种类型的日志记录的感觉,虽然我不知道数据字段的值是什么意思。我希望这有帮助。