Winapi CryptMsggetRAM是否足以确保文件完整性?
我目前有一堆代码来检查PE是否由我的公司签名,但它只检查签名(不是我写的)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,
//之前使用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
}