问题标签 [winverifytrust]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2097 浏览

certificate-revocation - 如何仅从 CRL 检查撤销列表?

我正在使用 WinVerifyTrust 来验证文件签名。

与互联网的连接非常糟糕,所以我只想检查本地缓存。

问题是我对如何在WinTrustData中设置参数感到困惑

关于fdwRevocationChecks - 文档如下:

当 WTD_REVOKE_NONE 标志与 WinVerifyTrust 函数的 pgActionID 参数中设置的 HTTPSPROV_ACTION 值结合使用时,不会进行额外的吊销检查。为确保 WinVerifyTrust 函数在验证代码签名时不会尝试任何网络检索,必须在 dwProvFlags 参数中设置 WTD_CACHE_ONLY_URL_RETRIEVAL。

“没有额外的撤销检查”是什么意思 - 除了什么?它是否使用 CRL 进行吊销检查?如果我将此字段设置为 *WTD_REVOKE_WHOLECHAIN* 它也会在线检查吗?

如果我设置 WTD_CACHE_ONLY_URL_RETRIEVAL 是否足以确保它不会尝试从 Internet 获取吊销列表?

底线:我如何确保CRL 检查,但没有任何在线检查。

谢谢

0 投票
1 回答
809 浏览

winapi - WinVerifyTrust 在作为 MSI 自定义操作的一部分运行时使用 Windows 驱动程序验证策略

我有一些(c++ win32 api)代码可以验证文件的签名。在 ActiveX 和 MSI 的自定义操作中执行相同的代码。

当它作为 ActiveX 的一部分运行时,检查成功,但当它作为 MSI 的自定义操作的一部分执行时,验证失败。

我使用了 signtool.exe 并检查了文件。因此,如果没有 /pa 标志,验证将失败。出于某种原因,我假设在 ActiveX 中执行默认身份验证验证策略时以及在 MSI 的自定义操作中执行时 - 它使用 Windows 驱动程序验证策略。

任何想法如何使它适用于 MSI ?

谢谢扎基

0 投票
1 回答
662 浏览

windows - winverifytrust 内存泄漏

我对 winverifytrust 的目录签名有疑问。我们正在使用 winverifytrust 并且在调用之后我们不会调用 WTD_ACTION_STATE_CLOSE,只有当 hWVTStateData 不为 NULL 时才会调用它。我们看到的是系统内存消耗持续飙升

消费上升,然后稳定下来,一段时间后再次上升,然后在更长的时间后再次上升,金额更大。我们认为这可能是目录签名信任 API 完成的内部缓存的副作用。有人可以帮助确认行为吗

  1. 这是预期的行为吗?

  2. 我们对 API 的使用(不是无条件调用 STATE_ACTION_CLOSE 正确吗?)

  3. 内部缓存是否以这种方式运行,如果是这样,它是否达到缓存大小不会超过某个限制的稳定状态,可以预测该限制吗?

仅供参考:我在验证可执行文件的 Authenticode 签名时查看了主题内存泄漏?同样,那里的讨论没有结论性,并且与目录签名无关,因此提出了新问题

0 投票
1 回答
1006 浏览

c++ - 在 Windows 8 上从 mmc.exe 获取数字签名

我有一个尝试验证 mmc.exe(服务)签名的应用程序。(我认为应用程序的上下文无关紧要)我正在尝试使用 WinVerifyTrust 都失败的 winapi 函数。当我尝试从目录进行验证时,我得到 TRUST_E_BAD_DIGEST,而当我从文件信息中尝试验证时,我得到了 TRUST_E_NOSIGNATURE。值得一提的是,我的功能在win7、XP上成功,但在win8上失败。

这是函数的代码片段

我认为这个功能从 win7 到 win 8 没有任何变化,所以可能会出现什么问题?

更新

我确实注意到我的功能确实适用于 win 8 的任务管理器。但对于 mmc,它再次不起作用。

0 投票
1 回答
1949 浏览

c++ - WinVerifyTrust 错误代码处理

我的任务是确定第三方公司的特定 DLL 在安装到用户系统后是否被篡改。我以前从未做过任何与数字签名相关的事情。我正在尝试使用 WinVerifyTrust 在我自己的系统上设置测试。

这将返回 0x57。根据我从MSDN收集的信息,错误来自提供的信任提供程序。我真的不知道信任提供者是什么或它可以返回什么错误消息。

  1. 我在 WinTrust.dll 和 WinTrust.lib 中进行了链接,所以我认为这意味着我正在使用 Microsoft 的“软件发布者信任提供程序”。这是推荐的,还是有更好的?您是否应该使用特定于/由您正在分析其产品的软件发行商提供的软件?
  2. SoftPub.h 包含 GUID 输入值,但似乎不提供输出错误代码。感谢您在追踪他们的响应代码列表方面的任何帮助。

提前致谢。

编辑:我后来发现这个库使用了 winerror.h 提供的错误代码。0x57 是“ERROR_INVALID_PARAMETER”,所以我正在审查它可能抱怨的内容。我还尝试将策略 GUID 切换到 WINTRUST_ACTION_GENERIC_VERIFY_V2,它返回错误 TRUST_E_SUBJECT_FORM_UNKNOWN。这两个错误代码都没有特别说明最终问题是什么。

编辑 2:我还在有问题的 dll 上运行了 Microsoft 的 SignTool.exe,并得到以下输出:

所以看来我需要更改我正在使用的信任提供者。在与软件制造商讨论后,该任务被放弃,转而采用另一种方法。

0 投票
0 回答
565 浏览

winapi - 如何验证 PE 文件的 SHA-2 签名?

我想在 Windows 平台上验证 PE 文件的 SHA-2 验证码数字签名。

我尝试使用WinVerifyTrustEx(). WinVerifyTrustEx在 Windows 7 上运行良好。但WinVerifyTrustEx在 Windows Vista 上无法运行。

我在 Windows 7 和 Windows Vista 上使用了相同的代码。

如何在 Window Vista 上验证 SHA-2 签名?

[更新]

WinVerifyTrustExTRUST_E_NOSIGNATURE(0x800B0100)在 Windows Vista 上返回。

WinVerifyTrustExERROR_SUCCESS在 Windows 7 上返回。

我使用了相同的示例代码并验证了已签名的相同可执行文件。签名的可执行文件具有 SHA-256 签名。

区别仅在于操作系统(vista 和 7)。

当我尝试验证另一个由 SHA-1 签名的可执行文件时,在 Vista 和 7 上都WinVerifyTrustEx返回。ERROR_SUCCESS

0 投票
0 回答
622 浏览

c# - 在 C# 中验证数字签名的 vbscript

需要使用 WinVerifyTrust 在 C# 中验证签名的 vbscript 的示例代码。

每个 MS - 你可以签署一个 vbscript - https://technet.microsoft.com /en-us/library/ee176795.aspx

我从用 C 语言编写的 msdn 中获取了一个示例,并成功检测到了篡改。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa382384(v=vs.85).aspx

C 代码将成功检测到篡改,但使用 pinvoke.net 和 MS 代码库中的示例以 C# 编写的类似代码失败,结果为 0x800b0100。我尝试了 C# 代码的几种不同变体,更改了 WTDProvFlags、dwStateAction 等的值,但均未成功。

这是我修改 CSCCreateCabinet 项目并破解了一个函数来验证我的脚本的一次尝试——

这是 NativeMethods.cs 类文件

有什么建议么?

0 投票
1 回答
707 浏览

certificate - WinVerifyTrust 为有效(已加载)驱动程序返回 CERT_E_UNTRUSTEDROOT

在以下代码片段中,WinVerifyTrust 为系统上加载并运行的内核驱动程序文件 (.sys) 返回 CERT_E_UNTRUSTEDROOT:

一些有趣的点: - 驱动程序使用 SHA-256 使用有效(购买的)证书进行签名。- KB3033929 安装在系统上 (Win7/32) - 从文件属性查看证书时,整个证书链显示为有效

我打电话给 WinVerifyTrust 错了吗?

替代问题:是否有另一种方式知道(通过存在注册表项或类似的东西)基于 SHA-256 的代码签名验证在目标系统上可用?(我需要在安装过程中验证这一点......)

谢谢 :)

0 投票
1 回答
1274 浏览

c# - 为什么 WinVerifyTrust() 仅在未连接到互联网的机器上失败?

我想检查我正在使用 C# 的项目中的 .exe 文件之一的信任度。

我已经提到 - http://pinvoke.net/default.aspx/wintrust/WinVerifyTrust.html

这是我的代码片段。

文件名 - 只是 .exe 文件路径。

上面代码中提到的 WinVerifyTrust() 仅在机器至少连接到 Internet 一次时才返回“WinVerifyTrustResult.Success”。

然而在新机器上它返回“0x800b0100”即“Trust_e_nosignature”。

这是预期的行为吗?如果是,那么如何解决它?

我搜索了这个特定的行为,但没有找到任何令人满意的答案。

0 投票
0 回答
1343 浏览

windows - WinVerifyTrust() 和 WinVerifyTrustEx() 有什么区别?

MSDN 记录了WinVerifyTrust()WinVerifyTrustEx()函数,并不太清楚它们之间的区别是什么。

除了最后一个参数外,函数签名相同:

但是,LPVOID pWVTDatato 的参数WinVerifyTrust()实际上是 a WINTRUST_DATA*,就像 WinVerifyTrustEx()

pWVTData [in]
一个指针,当转换为 WINTRUST_DATA 结构时,它包含信任提供者处理指定操作标识符所需的信息。

我比较了两个文档页面以查找任何其他差异,这就是我发现的内容,省略了微不足道的差异:

WinVerifyTrust()

如果信任提供者未验证指定操作的主题是否受信任,则该函数从信任提供者返回状态代码。注意返回值是 LONG,而不是之前记录的 HRESULT。不要使用 SUCCEEDED 等 HRESULT 宏来判断函数是否成功。相反,检查返回值是否等于零。

评论

WinVerifyTrust 函数使应用程序能够调用信任提供程序来验证指定对象是否满足指定验证操作的条件。pgActionID 参数标识验证操作,pWinTrustData 参数标识要验证其信任的对象。信任提供程序是向操作系统注册的 DLL。对 WinVerifyTrust 的调用将该调用转发给已注册的信任提供者(如果有的话)支持该指定的操作标识符。
例如,软件发布者信任提供者可以验证可执行映像文件是否来自受信任的软件发布者,并且该文件自发布以来未被修改。在这种情况下,pWinTrustData 参数指定文件的名称和文件的类型,例如 Microsoft 可移植可执行映像文件。
每个信任提供者都支持它可以评估的一组特定操作。每个操作都有一个标识它的 GUID。一个信任提供者可以支持任意数量的动作标识符,但两个信任提供者不能支持相同的动作标识符。
有关演示如何使用此函数来验证可移植可执行 (PE) 文件的签名的示例,请参阅示例 C 程序:验证 PE 文件的签名

WinVerifyTrustEx()

此函数没有关联的导入库。您必须使用 LoadLibrary 和 GetProcAddress 函数动态链接到 Wintrust.dll。

WINTRUST_ACTION_GENERIC_CERT_VERIFY
仅验证证书链。这仅在 WinVerifyTrust 输入结构中传入证书上下文时有效。
注意:我们不建议使用此功能进行证书验证。要执行证书验证,请使用 CertGetCertificateChain 和 CertVerifyCertificateChainPolicy 函数。

如果信任提供者验证指定操作的主题是受信任的,则返回值为 ERROR_SUCCESS。否则,该函数会从信任提供者返回状态代码。

作为测试,我采用了列出的示例程序WinVerifyTrust()并将其改为使用WinVerifyTrustEx()。它与任一 API 调用都给出相同的结果。

如果有人熟悉这两个功能并知道它们之间的真正区别,任何见解将不胜感激!