M2Team / NanaZip

The 7-Zip derivative intended for the modern Windows experience
https://sourceforge.net/projects/nanazip/
Other
8.87k stars 224 forks source link

关于多文件哈希校验的一些疑问 #355

Open MMMMMoris opened 11 months ago

MMMMMoris commented 11 months ago

今天怀疑中了勒索病毒,想用哈希校验做些测试。

有两个不同的文件夹,文件夹下的文件数目是一致的,但是文件名不一致。

我的目的是,分别校验两个文件夹下所有文件的哈希总和,然后对比。

我当时想到了NanaZip,因为之前用NanaZip 对多个文件做校验的时候,很惊奇这出来的结果竟然不是各自的哈希,而是总的哈希!

用来试了一下,校验结果是两个文件夹下各个文件单独校验的哈希值完全不同,所有文件总和的哈希一致

现在有个疑问是,NanaZip 是怎么校验所有选中的文件的哈希总和的?

请问原理是把所有文件的元数据加起来计算一遍总的元数据的哈希,

还是把所有文件分别计算出哈希数值之后,再对这些哈希数值进行哈希运算?

这个过程能用PowerShell 的 get-hash 函数配和其他函数实现吗?

Artoria2e5 commented 10 months ago

建议看 https://github.com/M2Team/NanaZip/blob/61723a7eb2472dc1b8fbbc06bba70775eff84ec9/NanaZip.UI.Modern/SevenZip/CPP/7zip/UI/Common/HashCalc.cpp 的实现。看上去是用正常的 EnumerateItems 列文件,然后对每个不是文件夹的东西都整个读入跑 hb.Update,没有把文件名混进去。

大概的调用栈,也是我找到有 HashCalc 这个东西的过程 右键菜单会从这里调用 CalcChecksum,使 arcFileName 为空 https://github.com/M2Team/NanaZip/blob/61723a7eb2472dc1b8fbbc06bba70775eff84ec9/NanaZip.UI.Modern/SevenZip/CPP/7zip/UI/Explorer/ContextMenu.cpp#L1250-L1251 CalcChecksum 会……变成命令行 `h -scrc ... -i ...`? https://github.com/M2Team/NanaZip/blob/61723a7eb2472dc1b8fbbc06bba70775eff84ec9/NanaZip.UI.Modern/SevenZip/CPP/7zip/UI/Common/CompressCall.cpp#L374 然后进 Main 调 HashCalc... https://github.com/M2Team/NanaZip/blob/61723a7eb2472dc1b8fbbc06bba70775eff84ec9/NanaZip.UI.Modern/SevenZip/CPP/7zip/UI/Console/Main.cpp#L1456 发现有个 hashOptions 没跟上,去看 parser.Parse1 里面设置这玩意的东西…… https://github.com/M2Team/NanaZip/blob/61723a7eb2472dc1b8fbbc06bba70775eff84ec9/NanaZip.UI.Modern/SevenZip/CPP/7zip/UI/Common/ArchiveCommandLine.cpp#L1634 ……看上去只是砍文件名砍到了相对级别,应该不影响我们 NWildcard::k_RelatPath