Winapi CryptMsggetRAM是否足以确保文件完整性?

Winapi CryptMsggetRAM是否足以确保文件完整性?,winapi,cryptography,digital-signature,Winapi,Cryptography,Digital Signature,我目前有一堆代码来检查PE是否由我的公司签名,但它只检查签名(不是我写的) //之前使用CryptQueryObject获得了hMsg 德沃德·德西涅里夫; bool-ret=加密数据集(hMsg, CMSG\u签名者\u信息参数, 0, 无效的 &dwSignerInfo); PCMSG\u签名者\u信息pSignerInfo=NULL; pSignerInfo=(PCMSG_SIGNER_INFO)LocalAlloc(LPTR,dwSignerInfo); ret=加密数据集(hMsg,

我目前有一堆代码来检查PE是否由我的公司签名,但它只检查签名(不是我写的)

//之前使用CryptQueryObject获得了hMsg
德沃德·德西涅里夫;
bool-ret=加密数据集(hMsg,
CMSG\u签名者\u信息参数,
0, 
无效的
&dwSignerInfo);
PCMSG\u签名者\u信息pSignerInfo=NULL;
pSignerInfo=(PCMSG_SIGNER_INFO)LocalAlloc(LPTR,dwSignerInfo);
ret=加密数据集(hMsg,
CMSG\u签名者\u信息参数,
0, 
(PVOID)pSignerInfo,
&dwSignerInfo);
向量文件序列;
分配(pSignerInfo->SerialNumber.pbData,pSignerInfo->SerialNumber.pbData+pSignerInfo->SerialNumber.cbData);
常量std::数组k_serial={0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}
const std::vector k_SerialKey(k_serial.cbegin(),k_serial.cend());
if(fileSerial==k_SerialKey)
{
//既然签名是我们做的,那就去做吧
}
上面的代码看起来工作得很好,但似乎没有真正检查文件本身的完整性。我希望能够验证可执行文件没有被病毒或其他东西损坏,但保持了签名的完整性

我想我可以继续使用CryptmsgettParam和params

CMSG\u计算的\u散列\u参数

CMSG_散列_数据_参数

这些参数返回2个不同的散列,如果我比较它们,它们匹配,这是否意味着我的文件匹配签名中的散列


注意:我看了WinVerifyTrust,但我觉得它的方式对我想要的东西来说太过分了,我只想验证文件是否与签名的文件匹配。

我想你会使用
CMSG\u CTRL\u verify\u HASH
来验证文件的完整性。但是文档有点混乱。
// 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
}