Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
LogFileParser — NTFS 上 $LogFile 的解析器 | Kitploit
工具/GitHubGitHub/jschicht/logfileparser
磁盘取证取证分析数据恢复数字取证二进制分析日志分析
GitHubjschicht/logfileparser

LogFileParser

NTFS 上 $LogFile 的解析器

查看仓库
2182993个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

功能 解码并转储 $LogFile 记录和事务条目。 解码 NTFS 属性更改。 可选地解析 $LogFile 中所有可用的数据运行列表信息。选项:“重建数据运行”。 从 $LogFile 内的松弛空间中恢复事务。 选择重建在松弛空间中发现的事务的缺失或损坏的头部。选项:“重建头部”。 可选地使用 LSN 错误级别值微调结果。选项:“LSN 错误级别”。 记录到 csv 并导入到包含多个表的 sqlite 数据库。 可选地将 mft2csv 的 csv 输出导入到数据库。 在 6 种不同的时间戳格式中选择。 选择时间戳精度:无、毫秒和纳秒。 选择毫秒精度分隔符。 选择纳秒精度分隔符。 选择时间戳的区域调整。默认以 UTC 0.0 呈现时间戳。 选择输出分隔符。选项:“设置分隔符”。 可配置 UNICODE 或 ANSI 输出。选项“Unicode”。 可配置 MFT 记录大小(1024 或 4096)。选项“MFT 记录大小”。 可选地解码单个事务或部分事务(片段)。 选项从单个或多个事务(片段)重建 RCRD。 选项配置损坏的 $LogFile。在将雕刻出的 RCRD 作为输入时有用。 选项跳过修复(用于损坏的 $LogFile,通常从内存中雕刻)。 将详细的详细输出写入 debug.log。 可配置的逗号分隔的 lsn 列表,用于触发将特定事务的超详细信息化输出到 debug.log。 32 位操作系统的配置。 用于提取常驻数据更新的二进制数据的配置。 自动生成的 sql,用于将输出导入 MySql 数据库。 选项跳过所有 sqlite3 相关内容以加快总解析速度。 可选命令行模式。支持适用于批处理脚本的 errorlevel。

背景 NTFS 被设计为可恢复的文件系统。这是通过记录所有更改卷结构的事务来实现的。因此,对卷上文件的任何更改都需要将某些内容记录到 $LogFile 中,以便在系统随时发生故障时可以回滚。因此,大量信息被写入此文件,并且由于它是循环的,这意味着新事务会覆盖文件中的旧记录。因此,从此文件中可以检索的历史数据量在某种程度上是有限的。同样,这取决于卷的类型以及 $LogFile 的大小。在经常使用的系统的系统驱动器上,您可能只能获得几个小时的历史记录,而带有备份文件的外部/辅助磁盘则可能包含更多历史信息。并且 2MB 文件包含的历史记录远少于 256MB 文件。那么此文件可以配置为多大范围?从 256 KB 及以上。将大小配置为 2 GB 可以这样做:“chkdsk D: /L:2097152”。大型日志文件如何影响性能超出了本文的范围。通常不可能将其设置为低于 2048。但是通过修补 untfs.dll 是可能的:http://code.google.com/p/mft2csv/wiki/Tiny_NTFS

简介 此解析器将解码并转储 NTFS 上 $LogFile 中的大量事务信息。会生成多个 csv 以及一个名为 ntfs.db 的 sqlite 数据库,其中包含所有相关信息。输出极其详细且非常底层,这意味着需要相当不错的 NTFS 知识才能理解它。当前处理的具有有意义输出解码的 Redo 事务类型包括:

InitializeFileRecordSegment CreateAttribute DeleteAttribute UpdateResidentValue UpdateNonResidentValue UpdateMappingPairs SetNewAttributeSizes AddindexEntryRoot DeleteindexEntryRoot AddIndexEntryAllocation DeleteIndexEntryAllocation WriteEndOfIndexBuffer SetIndexEntryVcnRoot SetIndexEntryVcnAllocation UpdateFileNameRoot UpdateFileNameAllocation SetBitsInNonresidentBitMap ClearBitsInNonresidentBitMap OpenNonresidentAttribute OpenAttributeTableDump AttributeNamesDump DirtyPageTableDump TransactionTableDump UpdateRecordDataRoot UpdateRecordDataAllocation CompensationlogRecord

当前支持的属性列表: $STANDARD_INFORMATION $ATTRIBUTE_LIST $FILE_NAME $OBJECT_ID $SECURITY_DESCRIPTOR $VOLUME_NAME $VOLUME_INFORMATION $DATA $INDEX_ROOT $INDEX_ALLOCATION $REPARSE_POINT $EA_INFORMATION $EA $LOGGED_UTILITY_STREAM

所以基本上支持所有属性。

生成的不同输出的说明:

LogFile.csv: 从解析器生成的主要 csv。

LogFile_DataRuns.csv 重建数据运行所需的输入信息

LogFile_DataRunsResolved.csv 重建数据运行的最终输出

LogFile_INDX_I30.csv 所有转储并解码的索引记录(IndexRoot/IndexAllocation)

LogFileJoined.csv 与 LogFile.csv 相同,但从 $UsnJrnl 或 mft2csv 的 csv 中联接了文件名信息。

MFTRecords.bin 基于 InitializeFileRecordSegment 事务中找到的 MFT 记录重建的虚拟 $MFT。可以对此使用 mft2csv(记得正确配置“损坏的 MFT”和“修复”)。

LogFile_lfUsnJrnl.csv 在 $LogFile 中解码的 $UsnJrnl 记录

LogFile_UndoWipe_INDX_I30.csv 清除目录索引(INDX)的所有撤销操作。

LogFile_AllTransactionHeaders.csv 所有已解码事务的头部。

LogFile_BitsInNonresidentBitMap.csv 所有已解码的 SetBitsInNonresidentBitMap 操作。

LogFile_DirtyPageTable32bit.csv 和 LogFile_DirtyPageTable64bit.csv 每个已解码的 DirtyPageTableDump 操作中针对 32 位和 64 位操作系统的所有条目。

LogFile_Mft_ObjectId_Entries.csv 已解码的 $ObjectId 属性。

LogFile_ObjIdO.csv 来自系统文件 $ObjId:$O 的所有解码。

LogFile_OpenAttributeTable.csv 每个已解码的 OpenAttributeTableDump 操作中的所有条目。

LogFile_QuotaO.csv 来自系统文件 $Quota:$O 的所有解码。

LogFile_QuotaQ.csv 来自系统文件 $Quota:$Q 的所有解码。

LogFile_RCRD.csv 所有已解码 RCRD 记录的头部。

LogFile_ReparseR.csv 来自系统文件 $Reparse:$R 的所有解码。

LogFile_SecureSDH.csv 来自系统文件 $Secure:$SDH 的所有解码。

LogFile_SecureSII.csv 来自系统文件 $Secure:$SII 的所有解码。

LogFile_SecurityDescriptors.csv 已解码的安全描述符。来源可以是 $SECURITY_DESCRIPTOR 或 $Secure:$SDS。

LogFile_SlackAttributeNamesDump.csv 在松弛空间中找到的已解码 AttributeNamesDump 事务中的所有条目。

LogFile_SlackOpenAttributeTable.csv 在松弛空间中找到的已解码 OpenAttributeTableDump 事务中的所有条目。

LogFile_TransactionTable.csv 已解码的 TransactionTableDump 事务。

LogFile_Filenames.csv 所有已解析的文件名,包含 MftRef、MftRefSeqNo 和 Lsn。

LogFile_TxfData.csv 来自 $LOGGED_UTILITY_STREAM 中 $DATA:$TXF_DATA 的已解码数据。

LogFile_UpdateFileName_I30.csv UpdateFileNameRoot 和 UpdateFileNameAllocation 的 redo 和 undo 操作的所有解码。

LogFile_CompensationlogRecord.csv CompensationlogRecord 的所有解码。与 nt5.x 无关。

Ntfs.db 一个 sqlite 数据库文件,其表与上述 csv 几乎等效。该数据库包含 5 个表: DataRuns IndexEntries LogFile LogFileTmp(重建数据运行时使用的临时表)。 UsnJrnl

时间戳 默认以 UTC 0.00 呈现,并具有纳秒精度。默认格式为 YYYY-MM-DD HH:MM:SS:MSMSMS:NSNSNSNS。这些可以配置。不同的时间戳指的是: CTime 表示文件创建时间。 ATime 表示文件修改时间。 MTime 表示 MFT 条目修改时间。 RTime 表示文件最后访问时间。

重建数据运行。

文件系统上的许多操作都会触发 $LogFile 中的事务。与 $DATA 属性(即文件内容)相关的事务目前被识别为;

InitializeFileRecordSegment CreateAttribute UpdateMappingPairs SetNewAttributeSizes

它们都在 $LogFile 中留下不同的信息。常驻数据修改的行为不同,不能就这样重建,至少在来自现代 Windows 版本的 NTFS 卷上是这样。

InitializeFileRecordSegment 是在创建新文件时。因此它将具有 $FILE_NAME 属性,以及原始 $DATA 属性内容,包括数据运行。由于 $LogFile 是循环的,旧事件会被新事件覆盖,因此 $LogFile 的挑战在于获取足够久远的信息。但是,如果存在 InitializeFileRecordSegment,那么我们应该能够重建所有内容,因为在此之后写入的所有记录也将可用。我们还将拥有关于数据运行列表偏移量的信息。这是从 $DATA 属性开头计算的相对偏移量。在计算 UpdateMappingPairs 在数据运行列表中的修改位置时,这是重要的信息。

CreateAttribute 是属性首次创建时的原始属性(如果不是作为 InitializeFileRecordSegment 的一部分写入)。对于这个也是如此,我们应该能够重建数据运行,因为我们拥有所有可用的事务。但是,这个本身不会为我们提供文件名。这里同样,我们有可用的数据运行列表偏移量,这在解决 UpdateMappingPairs 时非常有用。

UpdateMappingPairs 是执行对 $DATA/数据运行修改(文件内容已更改)时的事务。此事务中找到的信息并不完整,它只包含添加到现有数据运行列表中的新值。它还包含一个相对偏移量,告诉我们更改已写入数据运行列表中的位置。此偏移量与 InitializeFileRecordSegment 和 CreateAttribute 中找到的数据运行偏移量结合使用。

SetNewAttributeSizes 是一个事务,包含有关对 $DATA 属性所做的任何大小值相关修改的信息。这与仅包含数据运行更改的 UpdateMappingPairs 紧密相关。

通过上述 4 种不同的 redo 操作,对于给定的引用号(不同文件),可以重建文件的某些文件系统更改历史。由于其循环性,我们只有部分历史记录,即最近的部分。我们可以检索的历史范围高度取决于目标是什么类型的卷。如果是系统卷,那么一周的历史记录可能超出您的预期,而可移动或外部或辅助磁盘将包含更多的历史记录。因此,我们可能重建已删除文件(其 $MFT 记录已被覆盖)的完整历史,进而重新创建数据运行列表以执行恢复。在其他情况下,我们可能无法重建完整历史,因此只能重建部分数据运行列表。包含调整后数据运行的最终 csv 文件 LogFile_DatarunsModified.csv 将以不同方式显示数据运行。

说明: 以“!”开头的表示完整的数据运行列表已被重建。 以“?”开头的表示部分恢复,其中“**”的数量表示原始数据运行列表中缺失的字节数。

为了简化基于数据运行的文件恢复,可以使用附带的 PoC,称为 ExtractFromDataRuns。它相当不言自明。只需填写完整的数据运行列表、实际大小和初始大小,以及输出文件的名称。可选地选择处理镜像文件(磁盘或分区)。如果检测到任何压缩/稀疏标志,也请勾选。向其提供部分重建的数据运行列表将无法工作!请注意,备用数据流可以通过数据名称的存在以及给定 fileref 的不同 OffsetInMft 值来区分。

单独的下载包“SampleTinyNtfsVolume.zip”包含一个带有小型 NTFS 卷的分区镜像,可用于测试。该卷上有 2 个已删除的非常驻文件,它们的 MFT 记录都被新文件覆盖。任何基于签名搜索的像样的恢复软件都应该能够恢复 jpg 文件(Tulips.jpg),因为它是连续的。但是,它们很可能无法识别其文件名或有关该文件的任何其他信息。第二个文件很可能无法使用标准工具恢复,因为它是碎片化的(压缩的),并且由于其 MFT 记录被覆盖,在没有数据运行列表的情况下解析该文件是不可能的。使用 PoC,我们可以识别文件名(suspicious.zip)并将其提取为完美状态(别担心,它只包含 Windows 附带的一个示例图像)。阅读文件 readme.DataRunsResolved.txt 以了解有关示例图像的详细信息以及如何解释输出和恢复文件。

我们通过此实现的是恢复 MFT 记录被覆盖的碎片化文件。由于我们已经重建了部分/完整的数据运行历史,我们可以确定地(至少在完整历史被重建的情况下)判断文件松弛数据是否属于给定文件。

限制。 数据运行重建在 UNICODE 下会损坏(ANSI 可以)。 如果 csv 是 UNICODE,则导入 Mft2Csv 输出会损坏(ANSI 可以)。 对 IndexRecords(IndexRoot/IndexAllocation)的部分更新非常难以解释,因为我们可能不了解原始索引。不过完整记录是可以的。 65 MB 文件的循环性对可保留多少历史 FS 事务施加了固有且绝对的限制。因此系统驱动器的 $LogFile 中历史记录有限,而外部/辅助驱动器存储的历史事务更多。可以使用 chkdsk 增加 $LogFile 的大小(chkdsk c: /L:262144)。 对常驻文件数据的更改不会存储在 $LogFile 中,只存储已执行更改的信息。

注意 $UsnJrnl 以更人性化的方式包含信息。例如,每条记录包含 fileref、文件名、时间戳以及对所发生情况的说明。它还包含比 $LogFile 多得多的历史信息,尽管没有很多细节。如果 $UsnJrnl 处于活动状态,那么在 $LogFile 的回收生命周期内写入其中的所有事务也存在于 $LogFile 中。这意味着没有理由为了更好理解 $LogFile 而解码 $UsnJrnl。

松弛空间 在此上下文中,松弛空间是指 RCRD 记录中最后一个事务之后剩余的空间。我认为这之前没有被描述过,所以让我解释一下。卷松弛是文件系统末尾与文件系统所在分区末尾之间的未使用空间。MFT 记录松弛有点类似,但指的是记录结束签名(0xFFFFFFFF)之后到物理记录结束(0x400 或 0x1000)之间找到的空间。而 $LogFile 内的松弛空间则是最后一个事务之后到 RCRD 记录结束(通常为 0x1000)之间找到的空间。这些来自松弛空间的事务实际上是在 $LogFile 被回收(覆盖)之前就存在的。还有一种算法可以从松弛空间中识别有效事务。此外,还可能存在多层这样的松弛空间。 示例: 假设给定 RCRD 记录中的最后一个事务结束于偏移 0x00007D27。从此偏移到 0x00007FFF,我们有 0x2D8 字节的松弛空间。那么可能从 0x00007D28 开始的字节不是有效的事务头部,因为它位于事务中间。程序随后将(如果配置为这样做)尝试重建具有有效值的伪头部以解码该事务。如果它未能重建任何有效头部,则认为原始头部中太多信息已丢失,并将这些字节视为丢失,并继续扫描松弛空间的其余部分以查找任何有效事务头部。丢失的字节将记录到 debug.log 中供您调查。另一方面,如果它能够重建有效头部,则有关此信息的信息将出现在 lf_TextInformation 字段中。假设它识别出一个从偏移 0x00007D48 开始且大小为 0xB0 的事务。然后紧接着在偏移 0x00007DF8 处识别出另一个有效事务,大小为 0xE0。然而在偏移 0x00007ED8 处没有有效事务头部。这意味着我们现在处于该 RCRD 记录内的第二层松弛空间。现在假设程序在重新扫描后能够在偏移 0x00007F18 处识别出有效事务头部。该事务将在 csv 中标记为 FromRcrdSlack 字段值为 2。但是,考虑事务总大小使偏移超过 RCRD 记录大小。本质上,这将是一个部分恢复的事务,可能解码正常,但会在 IncompleteTransaction 字段中发现值为 1。请记住 debug.log 非常详细,将有助于理解解码输出,尤其是来自松弛空间的内容。

32 位与 64 位配置。 正确设置此设置很重要。它表示哪个操作系统处理过目标卷。关键在于 OpenAttributeTable 的处理在 32 位和 64 位操作系统之间不同。当然也可能存在某些情况(例如 usb 磁盘),其中卷已被多个不同操作系统处理过,在这种情况下可能很难使此设置 100% 正确。从版本 2.0.0.8 开始实现了自动检测机制。但是仍然建议尝试正确设置此配置。在 TextEinformation 字段中,当检测到与配置不同的 OpenAttributeTableDump 格式或检测到两种类型时,将打印“Mixed OS detected”消息。无论如何,查看 LogFile_OpenAttributeTable.csv 以评估输出可能是有用的。如果您看到列中包含奇怪值的条目,那么此特定设置可能是错误的。如果是这样,那么大多数值都会严重偏离。例如大多数 AttributeType 字段为 UNKNOWN,Lsn 不在当前范围内,MftRef 太高且 MftRefSeqNo 为 0。请注意,对于表中未初始化的条目,AttributeType 会解析为 UNKNOWN,但这些很容易发现,因为 AllocatedOrNextFree 之后的所有值都是 0,并且完全有效。这些挑战似乎在版本 2.0.0.8 中实现的自动检测后已修复。提取常驻属性更新(UpdateResidentValue)。 UpdateResidentValue 操作用于更新常驻属性的内容。“提取常驻更新的最小大小”配置允许您提取对常驻属性的二进制修改。输入字段用于指定要提取的最小字节数。此功能最有用的场景可能是处理由 Nt5.x(XP、2003)管理的卷,其中对 $DATA 属性(普通文件内容)的完整更新通过 UpdateResidentValue 存储在 redo 和 undo 字段中。具有常驻 $DATA 内容的文件是较小尺寸的文件,最多 744 字节(MFT 记录大小为 1024 时),但通常更小。提取的数据被写入名为 ResidentExtract 的子文件夹。输出文件的命名逻辑如下:MFT($MFTRef)$OffsetInMft$AttributeOffset_LSN($Lsn)$Operation.bin。例如 MFT(1643)_0x0098_0x00B8_LSN(1415242628)redo.bin 表示 MFT 记录号为 1643,目标属性在 MFT 中的偏移为 0x98,修改在目标属性内的偏移为 0xB8,事务的 LSN 为 1415242628,且这是一次 redo 操作。因此,undo 操作的提取内容包含修改前该偏移处的数据。启用此功能会触发一些无关且无趣的输出。大多数误报会被自动过滤,但有些无法避免。例如,可能包含 $INDEX_ROOT、$ATTRIBUTE_LIST 和 $BITMAP 的更新。不过,可以通过将 OffsetInMft 与相关的 InitializeFileRecordSegment 中找到的内容(或如果适用,与 $MFT 本身中的内容)进行比较,手动追溯属性以过滤掉非 $DATA 的内容。从版本 2.0.0.13 起,添加了 $EA 的提取。参见关于 $EA 属性的说明。

文件名 csv 从版本 2.0.0.6 起,实现了一项新功能,用于转储所有已识别的文件名。这些条目的来源包括 InitializeFileRecordSegment、UpdateNonResidentValue、AddindexEntryRoot、DeleteindexEntryRoot、AddIndexEntryAllocation、DeleteIndexEntryAllocation 和 WriteEndOfIndexBuffer。因此,包含这些文件名的 csv 文件 LogFile_FileNames.csv 包含了在 $LogFile 历史期间所有文件名、MftRef 和 MftRefSeqNo 的重建历史。这样您就能看到给定 Mft 记录在 $LogFile 覆盖的时间段内曾拥有过的所有不同文件名。当文件被重命名时,MftrefSeqNo 不会递增。当 MFT 记录被标记为已删除,并在之后被重用时,MftRefSeqNo 会随着新的初始化递增一。

$TXF_DATA 使用事务性 NTFS(TxF)时,会在 $LOGGED_UTILITY_STREAM 属性中出现名为 $TXF_DATA 的命名流。它始终是常驻的,且每个文件可以有多个。其使用并不广泛,Microsoft 实际上鼓励使用替代方法。[quote]Microsoft 强烈建议开发人员利用替代手段来满足您的应用程序需求。[/quote]。似乎只有少数软件更新机制使用它。每个用它创建的文件/文件夹都会获得一个唯一的 fileref(不要与 MFT 记录号混淆)。这个唯一的 fileref 就是该文件在之后被删除时(并移入 $Extend$RmMetadata$Txf 文件夹)所使用的名称。$Tops 文件的标准未命名 $DATA 属性包含有关下一个事务将进入 $TxfLogContainer00000000000000000001 中哪个位置的信息。$Tops 的命名 $DATA 流 $T 包含被回收的实际数据(来自事务性文件操作)。在 $TXF_DATA 中还有一个名为 LsnUserData 的字段,它是指向 $TxfLogContainer00000000000000000001 中某个位置的偏移,在那里可以找到更多事务详细信息。LsnNtfsMetadata 也包含指向同一个 $TxfLogContainer00000000000000000001 文件的偏移。请注意,这些偏移可能会在稍后阶段被更改,并在 $LogFile 中的 UpdateResidentValue 操作中被引用。MftRef_RM_Root 字段是负责与此文件关联事务的资源管理器根的文件记录号(默认为 5,即根目录)。对于通过 UpdateResidentValue 对 $TXF_DATA 进行的更新,会在 TextInformation 字段中附加文本“Partial update”。因此,LsnUserData 中也可能存在类似 0x0000000000007E-- 的值。这是因为大小为 31 字节的 UpdateResidentValue 意味着完整结构的前 3 个成员缺失,并且 LsnUserData 中也有 1 个字节缺失。缺失的字节是“低字节”,因此用 2 个字符/半字节的“-”作为替代,以表示缺失的未知字节(实际上只是现有字节)。如果 UpdateResidentValue 为 32 字节,则不需要替代字符/半字节,因为提供了完整的 LsnUserData。

debug.log 此日志中写入了错误消息和详细(verbose)信息。如果在输出中发现奇怪的值或注释,请在 debug.log 中搜索该 lsn。通常会转储整个事务,这可能有助于理解。为了帮助调查事务,在输入字段中填写以逗号分隔的 lsn 列表可能会有所帮助。然后,这些 lsn 的详细(verbose)信息将被打印出来。

$EA $EA 属性是一组名称-值对,被认为是为了与 OS/2 兼容而存在。它很少被看到使用,尽管一些恶意软件使用过它。每个属性可以有多个对,但所有对的最大大小为 65535 字节。每个文件只能有 1 个 $EA 属性。更大的内容可以分散在多个文件中,如 EaTools PoC 所示;https://github.com/jschicht/EaTools 现有的 $EA 属性不能直接被修改。只要所有对的大小低于 0xFFFF 字节,就可以随时添加额外的名称/值对。此属性的奇怪行为是,对于任何新对,整个 $EA 的所有内容都会被写入 $LogFile。这适用于常驻和非常驻 $EA 内容。这意味着如果向 $EA 添加第三个名称/值对,所有 3 个对都会通过 UpdateResidentValue 或 UpdateNonResidentValue 写入 $LogFile。

Todo 实现对 ntfs.db 中存在的更多分析。目前,理解输出需要一定程度的 NTFS 知识。 转储非常驻 $EA 内容。

命令行使用 如果未提供参数,GUI 将默认启动。有效开关如下:

开关: /LogFileFile: 输入的 $LogFile 提取文件。除非使用 /LogFileFragmentFile:,否则为必需。 /LogFileFragmentFile: 可选,输入一个 $LogFile 片段。可以是任何至少包含 1 个事务的损坏片段。 /MftCsvFile: 最新 Mft2Csv 的输出 csv。可选。 /OutputPath: 所有解析器输出的输出路径。默认为程序目录。 /TimeZone: 时区的字符串值。有效值见下文说明。 /OutputFormat: csv 的输出格式。有效值可以是 l2t、BodyFile、all。 /BrokenMft: 用于处理格式错误的 MFT 的布尔值。默认为 0。可以是 0 或 1。 /SkipFixups: 用于跳过 fixups 的布尔值。主要用于内存转储。默认为 0。可以是 0 或 1。 /Separator: csv 中使用的分隔符。默认为 | /Unicode: 用于解码 unicode 字符串的布尔值。默认为 0。可以是 0 或 1。 /TSFormat: 1 - 6 的整数,用于指定时间戳格式。启动 gui 以查看它们的含义。默认为 6。 /TSPrecision: 时间戳中使用的精度。有效值为 None、MilliSec 和 NanoSec。默认为 NanoSec。 /TSPrecisionSeparator: 用于分隔精度部分的分隔符。默认为“.”。启动 gui 以查看其含义。 /TSPrecisionSeparator2: 用于在时间戳精度中分隔 MilliSec 和 NanoSec 的分隔符。默认为空/无。启动 gui 以查看其含义。 /TSErrorVal: 在时间戳解码出错时放置的自定义错误值。默认值为 '0000-00-00 00:00:00',它与 MySql 兼容,并表示 NTFS 的无效时间戳值。 /ReconstructDataruns: 用于指定是否应执行 dataruns 重建的布尔值。默认为 0。可以是 0 或 1。 /MftRecordSize: MFT 记录的大小。有效值为 1024 和 4096。默认为 1024。 /RebuildHeadersSlack: 用于指定是否尝试从 slack 中恢复的损坏事务重建头部的布尔值。默认为 0。可以是 0 或 1。 /SectorsPerCluster: 每个簇的扇区数。默认为 8。可以是 1、2、4、8、16、32、64 和 128。 /LsnErrorLevel: 介于 0 和 1(100%)之间的值,作为基于前一个 lsn 从 slack 中识别有效/无效事务的阈值。默认为 0.1(10%)。 /SourceIs32bit: 用于指定卷是否来自 32 位系统的布尔值。默认为 0(x64)。可以是 0 或 1。 /ExtractDataUpdates: 用于指定是否应执行常驻数据内容提取的布尔值。默认为 0。可以是 0 或 1。 /ExtractDataUpdatesSize: 用于设置要提取内容的最小字节数的值。仅与 ExtractDataUpdates 设置一起使用。默认最小值为 2(字节)。 /VerboseLsnList: 以逗号分隔的 lsn 列表,将触发详细(verbose)模式。详细日志信息可在 debug.log 中找到。 /SkipSqlite3: 用于指定解析器是否应省略所有 sqlite3 操作的布尔值。如果不使用生成的 ntfs.db(dataruns 重建、mft csv 导入),则可以安全地忽略/省略此项。默认为 0。可以是 0 或 1。 /VerifyFragment: 用于仅对片段激活简单验证,而不是完整解析器的布尔值。可以是 0 或 1。默认情况下会将修复后的片段写入 OutFragment.bin,除非在 /OutFragmentName: 中另有指定。 /OutFragmentName: 如果 /VerifyFragment: 设置为 1,则写入修复后片段的输出文件名。如果省略,默认文件名为 OutFragment.bin。 /SkipFixups: 用于跳过 fixups 的布尔值。与重建片段一起使用。参见示例。默认为 0。可以是 0 或 1。 /BrokenLogFile: 用于将 $LogFile 视为损坏的布尔值。与重建的 RCRD 一起使用,并将绕过若干验证检查。默认为 0。可以是 0 或 1。

可用的 TimeZone 如下: -12.00 -11.00 -10.00 -9.30 -9.00 -8.00 -7.00 -6.00 -5.00 -4.30 -4.00 -3.30 -3.00 -2.00 -1.00 0.00 1.00 2.00 3.00 3.30 4.00 4.30 5.00 5.30 5.45 6.00 6.30 7.00 8.00 8.45 9.00 9.30 10.00 10.30 11.00 11.30 12.00 12.45 13.00 14.00

错误级别 当前的退出(错误)代码已在命令行模式下实现,这使其更适合批处理脚本。

  1. 无法解码任何有效事务。输出为空。
  2. 检测到可能不正确的输入参数。最常见的是 SectorsPerCluster,较少见的是 MftRecordSize。默认值为 SectorsPerCluster=8 和 MftRecordSize=1024。
  3. 片段验证失败。
  4. 将修复后的片段写入输出失败。不过片段验证已成功。

因此,如果得到 %ERRORLEVEL% == 1,表示没有解码出任何内容;如果得到 %ERRORLEVEL% == 2,则很可能 SectorsPerCluster 参数设置不正确。

示例: LogFileParser.exe /LogFileFile:c:\temp$LogFile /TimeZone:2.00 /MftRecordSize:4096 /ExtractDataUpdates:1 /ExtractDataUpdatesSize:8 /SectorsPerCluster:64 /TSFormat:1 /TSPrecision:NanoSec /Unicode:1 LogFileParser.exe /LogFileFile:c:\temp$LogFile /TimeZone:-5.00 /MftRecordSize:1024 /SectorsPerCluster:1 /TSFormat:1 /TSPrecision:MilliSec /Unicode:0 LogFileParser.exe /LogFileFile:c:\temp$LogFile /TSFormat:3 /ReconstructDataruns:1 LogFileParser.exe /LogFileFile:c:\temp$LogFile /TimeZone:7.00 /MftRecordSize:1024 /TSFormat:2 /TSPrecision:None /SourceIs32bit:1 LogFileParser.exe /LogFileFile:c:\temp$LogFile /TimeZone:7.00 /MftRecordSize:1024 /TSFormat:2 /TSPrecision:None /SourceIs32bit:1 /SkipSqlite3:1 LogFileParser.exe /LogFileFile:c:\temp$LogFile /OutputPath:E:\LFP-Output LogFileParser.exe /LogFileFile:c:\temp$LogFile /MftCsvFile:c:\temp$MFT LogFileParser.exe /LogFileFragmentFile:c:\temp\fragment.bin /OutputPath:E:\LFP-Output LogFileParser.exe /LogFileFragmentFile:c:\temp\fragment.bin /OutputPath:E:\LFP-Output /VerifyFragment:1 LogFileParser.exe /LogFileFragmentFile:c:\temp\fragment.bin /OutputPath:E:\LFP-Output /VerifyFragment:1 /OutFragmentName:FragmentsRCRDCollection.bin LogFileParser.exe /LogFileFile:E:\LFP-Output\FragmentsRCRDCollection.bin /OutputPath:E:\LFP-Output /SkipFixups:1 /BrokenLogFile:1

最后一个示例是一个基本示例,使用常见的默认值,在许多情况下都能正常工作。也与 MySql 导入兼容。

参考资料: Windows Internals 6th Edition http://www.opensource.apple.com/source/ntfs/ntfs-80/kext/ntfs_logfile.h https://dl.dropbox.com/s/c0u980a53ipaq7h/CEIC-2012_Anti-Anti_Forensics.pptx?dl=1

下载工具