系统安全二进制安全C/C++ [2021]R0驱动内对Windows数字签名验证的大概流程 因为某些原因我不得不抛弃wintrust机制而自己在内核实现驱动数字签名验证,因此有了这篇文章: 首先PE文件有两种信息,一个是catalog一个是pe自带签名,目前文章只介绍PE自带签名,catalog签名较为简单,不做论述 数字签名验证分为几步: 1. 解析pe拿到security data 2. 通过asn1解析"signed security data"拿到证书信息(最为复杂) 3. 交叉验证证书链上的证书,拿到root证书,这个过程中还需要对证书是否被窜改进行确认,这个过程中确认时间戳 4. 检查root证书是否可信 5. 拿到证书hash算法,并且计算PE的hash,再拿PE的hash跟证书hash进行匹配,这一步确认PE是否有效 由于某些问题,不能直接开源代码,但是能稍微的介绍一下这个过程: 阅读全文 2021-09-23 huoji 0 条评论
C/C++一线开发 [2020]C++验证文件数字签名(无内存泄露版本) 傻逼百度 一堆复制粘贴的帖子 这些帖子无一例外都有内存泄露. 给个没内存泄露的自己的修改版: ```cpp LONG CdigitalSig::GetSoftSign(PCWSTR v_pszFilePath, char* v_pszSign, int v_iBufSize) { VMProtectBeginVirtualization("GetSoftSign"); //首先判断参数是否正确 if (v_pszFilePath == NULL) return -1; HCERTSTORE hStore = NULL; HCRYPTMSG hMsg = NULL; PCCERT_CONTEXT pCertContext = NULL; BOOL bResult; DWORD dwEncoding, dwContentType, dwFormatType; PCMSG_SIGNER_INFO pSignerInfo = NULL; PCMSG_SIGNER_INFO pCounterSignerInfo = NULL; DWORD dwSignerInfo; CERT_INFO CertInfo; SYSTEMTIME st; LONG lRet; DWORD dwDataSize = 0; char chTemp[MAX_PATH] = { 0 }; do { //从签名文件中获取存储句柄 bResult = CryptQueryObject( CERT_QUERY_OBJECT_FILE, //指示要查询的对象的类型 v_pszFilePath, CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED, CERT_QUERY_FORMAT_FLAG_BINARY, 0, &dwEncoding, &dwContentType, &dwFormatType, &hStore, &hMsg, NULL ); if (!bResult) { lRet = -1; break; } //获取签名信息所需的缓冲区大小 bResult = CryptMsgGetParam( hMsg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &dwSignerInfo ); if (!bResult) { lRet = -1; break; } //分配缓冲区 pSignerInfo = (PCMSG_SIGNER_INFO)LocalAlloc(LPTR, dwSignerInfo); if (pSignerInfo == NULL) { lRet = -1; break; } //获取签名信息 bResult = CryptMsgGetParam( hMsg, CMSG_SIGNER_INFO_PARAM, 0, pSignerInfo, &dwSignerInfo ); if (!bResult) { lRet = -1; break; } CertInfo.Issuer = pSignerInfo->Issuer; CertInfo.SerialNumber = pSignerInfo->SerialNumber; pCertContext = CertFindCertificateInStore( hStore, CRYPT_ASN_ENCODING, 0, CERT_FIND_SUBJECT_CERT, (PVOID)&CertInfo, NULL ); if (pCertContext == NULL) { lRet = -1; break; } //获取数字键名 //没有给定缓冲区,那么说明只要获取下需要的长度 if (v_pszSign == NULL) { dwDataSize = CertGetNameString( pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, NULL, 0 ); if (dwDataSize != 0) { lRet = dwDataSize; } else { lRet = -1; } break; } if (!(CertGetNameStringA( pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, v_pszSign, v_iBufSize ) ) ) { lRet = -1; break; } lRet = 0; } while (FALSE); if (pSignerInfo != NULL) { LocalFree((HLOCAL)pSignerInfo); } if (hStore != NULL) CertCloseStore(hStore, 0); if (hMsg != NULL) CryptMsgClose(hMsg); if (pCertContext != NULL) CertFreeCertificateContext(pCertContext); return lRet; VMProtectEnd(); } ``` 阅读全文 2020-10-29 huoji 0 条评论