我的任务是确定某个第三方公司的特定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收集到的信息,错误来自提供的信任提供程序。我不知道信任提供者是什么,也不知道它能返回什么错误消息。
提前谢谢。
编辑:我发现这个库使用winerror.h提供的错误代码。0x57是"ERROR_INVALID_PARAMETER",所以我正在回顾它可能抱怨的内容。我还尝试将策略GUID切换到WINTRUST_ACTION_GENERIC_VERIFY_V2,这将返回错误TRUST_E_SUBJECT_FORM_UNKNOWN。这两种错误代码都没有特别说明最终问题是什么。
编辑2:我还在所讨论的dll上运行了微软的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因此,我似乎需要改变我正在使用的信任提供者。在与软件制造商讨论之后,这项任务被放弃,转而采用另一种方法。
发布于 2015-06-11 15:10:35
根据MSDN的说法,你应该设置
dwStateAction = WTD_STATEACTION_VERIFY;我也会试着设置
wtfi.hFile = NULL;或在授予文件句柄设置时
wtfi.pcwszFilePath = NULL;(我不太清楚你是否提供hFile。)并且我不会同时将hFile和pcwszFilePath设置为有效值。)
另一点需要检查:如果您正在为Windows8或Windows 2012进行编译,您将拥有结构成员pSignatureSettings,并需要对其进行初始化。注意设置cbStruct,以便不包括pSignatureSettings,或者正确初始化pSignatureSettings。
https://stackoverflow.com/questions/30765385
复制相似问题