C/C++一线开发 [2022]逃离Windows注册表回调重定向与链接的地狱 如果你开发过Windows的注册表回调相关的内容,比如hips、edr.那你一定会被里面的各种由于历史造成的 软连接、重定向、wow64等等等措施折磨的无法脱身. 如WOW6432Node这个东西本来就是个WOW32兼容重定向假路径: https://learn.microsoft.com/zh-cn/windows/win32/winprog64/shared-registry-keys?redirectedfrom=MSDN 阅读全文 2022-12-05 huoji 0 条评论
系统安全二进制安全C/C++ [2022]从微软代码中学习C/C++项目代码规范 ### 1.变量用abcd: ```cpp PCONSOLE_READCONSOLE_MSG a = (PCONSOLE_READCONSOLE_MSG)&Message->u.ApiMessageData; ``` 一个项目里面用abc来命名是大忌,因为这会完全让其他人不知道这个变量的意思,一般情况下一个项目的规范命名有两种: > 驼峰 下划线 而不是微软这种 abcd 阅读全文 2022-01-12 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 条评论