我目前有一堆代码来检查PE是否由我的公司签名,但它只检查签名(不是我写的)
// hMsg was obtained earlier by using CryptQueryObject
DWORD dwSignerInfo;
bool ret = CryptMsgGetParam(hMsg,
CMSG_SIGNER_INFO_PARAM,
0,
NULL,
&dwSignerInfo);
PCMSG_SIGNER_INFO pSignerInfo = NULL;
pSignerInfo = (PCMSG_SIGNER_INFO)LocalAlloc(LPTR, dwSignerInfo);
ret = CryptMsgGetParam(hMsg,
CMSG_SIGNER_INFO_PARAM,
0,
(PVOID)pSignerInfo,
&dwSignerInfo);
std::vector<BYTE> fileSerial;
fileSerial.assign(pSignerInfo->SerialNumber.pbData, pSignerInfo->SerialNumber.pbData + pSignerInfo->SerialNumber.cbData);
const std::array<BYTE, 16> k_serial = {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}
const std::vector<BYTE> k_SerialKey(k_serial.cbegin(), k_serial.cend());
if (fileSerial == k_SerialKey)
{
// Do stuff since signature is made by us
}
上面的代码看起来效果不错,但它似乎并没有真正检查文件本身的完整性。我希望能够验证可执行文件没有被病毒或其他东西破坏,但保持签名完整。
我在想我可以继续使用CryptMsgGetParam并使用params
CMSG_COMPUTED_HASH_PARAM
CMSG_HASH_DATA_PARAM
这些参数返回2个不同的哈希值,如果我比较它们并且它们匹配是否意味着我的文件与签名中的哈希匹配?
N.B。我看了WinVerifyTrust,但我觉得它对我想要的东西太过分了,我想要的只是验证文件仍然与签名所针对的文件相匹配。