【问题标题】:Why do I get a different SHA1 hash between Powershell and 32bit-Python on a system DLL?为什么我在系统 DLL 上的 Powershell 和 32 位 Python 之间得到不同的 SHA1 哈希?
【发布时间】:2015-12-27 16:53:04
【问题描述】:

我正在尝试针对二进制文件计算 Python 中的 SHA1 哈希值,以便以后进行比较。为了确保一切正常,我使用了几种方法来检查我的结果的有效性。而且,我很高兴我做到了。 Powershell 和 Python 返回不同的值。 7zip 的 SHA1 函数与 Powershell 的结果一致,Microsoft 的 FCIV 与 Python 的结果一致。

Python:

import hashlib
with open("C:\\Windows\\system32\\wbem\\wmiutils.dll", "rb") as f:
     print(hashlib.sha1(f.read()).hexdigest())

Powershell:

PS C:\> Get-FileHash C:\Windows\System32\wbem\wmiutils.dll -Algorithm SHA1

结果:

Python: d25f5b57d3265843ed3a0e7b6681462e048b29a9
Powershell: B8C757BA70F6B145AD191A1B09C225FBA2BD55FB

编辑:针对 system32 dll 的 32 位 Python 和 64 位 Powershell。那 是问题所在。我有一些功课要做,但基本上是 32 位和 64 位应用程序接收不同的文件,因此,不同的哈希 结果。我启动了 64 位 python 并运行了完全相同的代码 dll 并作为 64 位 powershell 进程。收到一致 以 32 位运行两个进程时的结果。

EDIT2:发现这个资源可以解释一些事情。至少它 帮助我了解发生了什么: https://www.sepago.com/blog/2008/04/20/windows-x64-all-the-same-yet-very-different-part-7-file-system-and-registry

【问题讨论】:

  • 我不记得 Windows 是如何做到这一点的,但会不会是 Python 是 32 位进程而您获得的是 32 位版本的 wmiutils.dll?在另一个不是 dll 且不在 system32 中的文件上测试它。
  • 成功了!启动一个 32 位 Powershell 窗口并返回:D25F5B57D3265843ED3A0E7B6681462E048B29A9
  • 这也可能是由于 python/FCIV 和 7zip/Powershell 处理字符串到位转换的方式不同:参见Is SHA-1 Hash Always the Same
  • 好吧,现在我有另一个问题:为什么在二进制文件上的 GNU/sha1sum 和 Python 之间会得到不同的 SHA1 哈希?
  • 现在我想知道是否有办法确定文件系统重定向器返回的实际文件。这感觉就像兔子洞的开始......

标签: python powershell x86 64-bit


【解决方案1】:

发生这种情况是因为您正在运行 32 位版本的 Python 并访问系统 dll - Windows 神奇地将您重定向到 32 位版本的 dll,而 PowerShell 作为 64 位进程运行并看到 64 位版本的 DLL .

我不确定我是高兴知道这一点还是为此感到难过。

【讨论】:

  • 鉴于这是专门用于 dll 的散列的,您的见解非常有帮助。谢谢!
猜你喜欢
  • 2015-01-05
  • 2010-10-11
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 2015-07-11
  • 2021-01-22
  • 2012-03-16
  • 2011-05-26
相关资源
最近更新 更多