我的任务是确定第三方公司的特定 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收集的信息,错误来自提供的信任提供程序。我真的不知道信任提供者是什么或它可以返回什么错误消息。
- 我在 WinTrust.dll 和 WinTrust.lib 中进行了链接,所以我认为这意味着我正在使用 Microsoft 的“软件发布者信任提供程序”。这是推荐的,还是有更好的?您是否应该使用特定于/由您正在分析其产品的软件发行商提供的软件?
- 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
所以看来我需要更改我正在使用的信任提供者。在与软件制造商讨论后,该任务被放弃,转而采用另一种方法。