0

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

{
    WINTRUST_FILE_INFO wtfi;
    wtfi.cbStruct = sizeof(WINTRUST_FILE_INFO);
    wtfi.pcwszFilePath = TEXT("*****.dll");
    //wtfi.hFile = DllHandle;
    wtfi.pgKnownSubject = NULL;

    GUID wtvPolicyGUID = DRIVER_ACTION_VERIFY;

    WINTRUST_DATA wtd;
    wtd.cbStruct = sizeof(WINTRUST_DATA);
    wtd.pPolicyCallbackData = NULL;
    wtd.pSIPClientData = NULL;
    wtd.dwUIChoice = WTD_UI_NONE;
    wtd.fdwRevocationChecks = WTD_REVOKE_NONE;
    wtd.dwUnionChoice = WTD_CHOICE_FILE;
    wtd.pFile = &wtfi;
    wtd.dwStateAction = WTD_STATEACTION_IGNORE;
    wtd.pwszURLReference = NULL;
    wtd.dwProvFlags = WTD_REVOCATION_CHECK_NONE;
    //wtd.pSignatureSettings = NULL;            // Win8 and Server2012 only?

    LONG result = WinVerifyTrust( NULL, &wtvPolicyGUID, &wtd);
    debugf(TEXT("Validation result: 0x%08x"), result);
}

这将返回 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,并得到以下输出:

SignTool Error: A certificate chain processed, but terminated in a root
        certificate which is not trusted by the trust provider.

Number of errors: 1

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

4

1 回答 1

0

根据MSDN,您似乎应该设置

dwStateAction = WTD_STATEACTION_VERIFY;

我也会尝试设置

wtfi.hFile = NULL;

或者在给出文件句柄设置时

wtfi.pcwszFilePath = NULL;

(我不太清楚您是否提供 hFile。而且我不会将 hFile 和 pcwszFilePath 都设置为有效值。)

还有一点要检查:如果您正在为 Windows 8 或 Windows Server 2012 进行编译,您将拥有 struct 成员pSignatureSettings并且需要对其进行初始化。注意设置cbStructpSignatureSettings包括在内或正确初始化pSignatureSettings

于 2015-06-11T15:10:35.610 回答