Win32 API功能封装
+ -

获取应用程序数字签名

2021-08-30 261 0

一般的应用程序在正式发布前都会进行数字签名。
如我们经常听歌的酷狗音乐,其通过查看文件属性,可以看到数字签名如下:

数字签名

那么怎么通过编程来获取数字签名的内容?
数字签名的获取一般是需要动态载入以下DLL:

  • Wintrust.dll
  • Crypt32.dll

相关的函数

  1. #define C_WinVerifyTrust "WinVerifyTrust"
  2. #define C_WTHelperProvDataFromStateData "WTHelperProvDataFromStateData"
  3. #define C_WTHelperGetProvSignerFromChain "WTHelperGetProvSignerFromChain"
  4. #define C_WTHelperGetProvCertFromChain "WTHelperGetProvCertFromChain"
  5. #define C_CertGetNameStringA "CertGetNameStringA"

函数原型:

  1. typedef LONG(__stdcall *FUN_WinVerifyTrust)(HWND hwnd, GUID *pgActionID, LPVOID pWVTData);
  2. typedef CRYPT_PROVIDER_DATA* (__stdcall *FUN_WTHelperProvDataFromStateData)(HANDLE hStateData);
  3. typedef CRYPT_PROVIDER_SGNR * (__stdcall *FUN_WTHelperGetProvSignerFromChain)(CRYPT_PROVIDER_DATA *pProvData, DWORD idxSigner, BOOL fCounterSigner, DWORD idxCounterSigner);
  4. typedef CRYPT_PROVIDER_CERT * (__stdcall *FUN_WTHelperGetProvCertFromChain)(CRYPT_PROVIDER_SGNR *pSgnr, DWORD idxCert);
  5. typedef WINCRYPT32API DWORD(__stdcall * FUN_CertGetNameStringA)(PCCERT_CONTEXT pCertContext,DWORD dwType,DWORD dwFlags,void *pvTypePara,LPSTR pszNameString,DWORD cchNameString);
  6. typedef HMODULE (__stdcall *FUN_LoadLibraryA)(LPCSTR lpLibFileName);
  7. typedef PVOID(__stdcall *FUN_GetProcAddress)(HMODULE hModule, LPCSTR lpProcName);

全部代码如下:

  1. #include <windows.h>
  2. #include <Softpub.h>
  3. #include <Wincrypt.h>
  4. #define DLL_WINTRUST "Wintrust.dll"
  5. #define DLL_CRYPT32 "Crypt32.dll"
  6. #define C_WinVerifyTrust "WinVerifyTrust"
  7. #define C_WTHelperProvDataFromStateData "WTHelperProvDataFromStateData"
  8. #define C_WTHelperGetProvSignerFromChain "WTHelperGetProvSignerFromChain"
  9. #define C_WTHelperGetProvCertFromChain "WTHelperGetProvCertFromChain"
  10. #define C_CertGetNameStringA "CertGetNameStringA"
  11. typedef LONG(__stdcall *FUN_WinVerifyTrust)(HWND hwnd, GUID *pgActionID, LPVOID pWVTData);
  12. typedef CRYPT_PROVIDER_DATA* (__stdcall *FUN_WTHelperProvDataFromStateData)(HANDLE hStateData);
  13. typedef CRYPT_PROVIDER_SGNR * (__stdcall *FUN_WTHelperGetProvSignerFromChain)(CRYPT_PROVIDER_DATA *pProvData, DWORD idxSigner, BOOL fCounterSigner, DWORD idxCounterSigner);
  14. typedef CRYPT_PROVIDER_CERT * (__stdcall *FUN_WTHelperGetProvCertFromChain)(CRYPT_PROVIDER_SGNR *pSgnr, DWORD idxCert);
  15. typedef WINCRYPT32API DWORD(__stdcall * FUN_CertGetNameStringA)(PCCERT_CONTEXT pCertContext,DWORD dwType,DWORD dwFlags,void *pvTypePara,LPSTR pszNameString,DWORD cchNameString);
  16. typedef HMODULE (__stdcall *FUN_LoadLibraryA)(LPCSTR lpLibFileName);
  17. typedef PVOID(__stdcall *FUN_GetProcAddress)(HMODULE hModule, LPCSTR lpProcName);
  18. typedef struct _DLL_STRUCT
  19. {
  20. FUN_LoadLibraryA pLoadLibraryA;
  21. FUN_GetProcAddress pGetProcAddress;
  22. char StrBuff[128];
  23. ULONG WinTrusDll;
  24. ULONG Crypt32Dll;
  25. ULONG WinVerifyTrust;
  26. ULONG WTHelperProvDataFromStateData;
  27. ULONG WTHelperGetProvSignerFromChain;
  28. ULONG WTHelperGetProvCertFromChain;
  29. ULONG CertGetNameStringA;
  30. }DLL_STRUCT,*PDLL_STRUCT;
  31. BOOL CheckProcessValid(WCHAR* pProcessName, PDLL_STRUCT pDllST)
  32. {
  33. GUID guidAction = WINTRUST_ACTION_GENERIC_VERIFY_V2;
  34. WINTRUST_FILE_INFO sWintrustFileInfo;
  35. WINTRUST_DATA sWintrustData;
  36. HRESULT hr = 0;
  37. sWintrustFileInfo.cbStruct = 0;
  38. sWintrustFileInfo.hFile = 0;
  39. sWintrustFileInfo.pcwszFilePath = 0;
  40. sWintrustFileInfo.pgKnownSubject = 0;
  41. sWintrustData.cbStruct = 0;
  42. sWintrustData.dwProvFlags = 0;
  43. sWintrustData.dwStateAction = 0;
  44. sWintrustData.dwUIChoice = 0;
  45. sWintrustData.dwUnionChoice = 0;
  46. sWintrustData.fdwRevocationChecks = 0;
  47. sWintrustData.hWVTStateData = 0;
  48. sWintrustData.pBlob = 0;
  49. sWintrustData.pCatalog = 0;
  50. sWintrustData.pCert = 0;
  51. sWintrustData.pFile = 0;
  52. sWintrustData.pPolicyCallbackData = 0;
  53. sWintrustData.pSgnr = 0;
  54. sWintrustData.pSignatureSettings = 0;
  55. sWintrustData.pSIPClientData = 0;
  56. sWintrustData.pwszURLReference = 0;
  57. sWintrustFileInfo.cbStruct = sizeof(WINTRUST_FILE_INFO);
  58. sWintrustFileInfo.pcwszFilePath = pProcessName;
  59. sWintrustFileInfo.hFile = NULL;
  60. sWintrustData.cbStruct = sizeof(WINTRUST_DATA);
  61. sWintrustData.dwUIChoice = WTD_UI_NONE;
  62. sWintrustData.fdwRevocationChecks = WTD_REVOKE_NONE;
  63. sWintrustData.dwUnionChoice = WTD_CHOICE_FILE;
  64. sWintrustData.pFile = &sWintrustFileInfo;
  65. sWintrustData.dwStateAction = WTD_STATEACTION_VERIFY;
  66. HMODULE hWintrust = pDllST->pLoadLibraryA(DLL_WINTRUST);
  67. FUN_WinVerifyTrust pFUN_WinVerifyTrust = NULL;
  68. FUN_WTHelperProvDataFromStateData pWTHelperProvDataFromStateData = NULL;
  69. FUN_WTHelperGetProvSignerFromChain pWTHelperGetProvSignerFromChain = NULL;
  70. FUN_WTHelperGetProvCertFromChain pWTHelperGetProvCertFromChain = NULL;
  71. HMODULE hCrypt32 = pDllST->pLoadLibraryA(DLL_CRYPT32);
  72. FUN_CertGetNameStringA pCertGetNameStringA = NULL;
  73. do
  74. {
  75. if (hWintrust == NULL)
  76. {
  77. break;;
  78. }
  79. pFUN_WinVerifyTrust = (FUN_WinVerifyTrust)pDllST->pGetProcAddress(hWintrust, C_WinVerifyTrust);
  80. if (pFUN_WinVerifyTrust == NULL)
  81. {
  82. break;
  83. }
  84. pWTHelperProvDataFromStateData = (FUN_WTHelperProvDataFromStateData)pDllST->pGetProcAddress(hWintrust, C_WTHelperProvDataFromStateData);
  85. if (pWTHelperProvDataFromStateData == NULL)
  86. {
  87. break;
  88. }
  89. pWTHelperGetProvSignerFromChain = (FUN_WTHelperGetProvSignerFromChain)pDllST->pGetProcAddress(hWintrust, C_WTHelperGetProvSignerFromChain);
  90. if (pWTHelperGetProvSignerFromChain == NULL)
  91. {
  92. break;
  93. }
  94. pWTHelperGetProvCertFromChain = (FUN_WTHelperGetProvCertFromChain)pDllST->pGetProcAddress(hWintrust, C_WTHelperGetProvCertFromChain);
  95. if (pWTHelperGetProvCertFromChain == NULL)
  96. {
  97. break;
  98. }
  99. if (hCrypt32 == NULL)
  100. {
  101. break;
  102. }
  103. pCertGetNameStringA = (FUN_CertGetNameStringA)pDllST->pGetProcAddress(hCrypt32, C_CertGetNameStringA);
  104. if (pCertGetNameStringA == NULL)
  105. {
  106. break;
  107. }
  108. hr = pFUN_WinVerifyTrust((HWND)INVALID_HANDLE_VALUE, &guidAction, &sWintrustData);
  109. if (TRUST_E_NOSIGNATURE == hr)
  110. {
  111. // _tprintf(_T("No signature found on the file.\n"));
  112. break;
  113. }
  114. else if (TRUST_E_BAD_DIGEST == hr)
  115. {
  116. //_tprintf(_T("The signature of the file is invalid\n"));
  117. break;
  118. }
  119. else if (TRUST_E_PROVIDER_UNKNOWN == hr)
  120. {
  121. //_tprintf(_T("No trust provider on this machine can verify this type of files.\n"));
  122. break;
  123. }
  124. else if (S_OK != hr)
  125. {
  126. // _tprintf(_T("WinVerifyTrust failed with error 0x%.8X\n"), hr);
  127. break;
  128. }
  129. else
  130. {
  131. // retreive the signer certificate and display its information
  132. CRYPT_PROVIDER_DATA const *psProvData = NULL;
  133. CRYPT_PROVIDER_SGNR *psProvSigner = NULL;
  134. CRYPT_PROVIDER_CERT *psProvCert = NULL;
  135. FILETIME localFt;
  136. SYSTEMTIME sysTime;
  137. psProvData = pWTHelperProvDataFromStateData(sWintrustData.hWVTStateData);
  138. if (psProvData)
  139. {
  140. psProvSigner = pWTHelperGetProvSignerFromChain((PCRYPT_PROVIDER_DATA)psProvData, 0, FALSE, 0);
  141. if (psProvSigner)
  142. {
  143. FileTimeToLocalFileTime(&psProvSigner->sftVerifyAsOf, &localFt);
  144. FileTimeToSystemTime(&localFt, &sysTime);
  145. _tprintf(_T("Signature Date = %.2d/%.2d/%.4d at %.2d:%2.d:%.2d\n"), sysTime.wDay, sysTime.wMonth, sysTime.wYear, sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
  146. psProvCert = pWTHelperGetProvCertFromChain(psProvSigner, 0);
  147. if (psProvCert)
  148. {
  149. DWORD dwStrType;
  150. DWORD dwCount;
  151. LPTSTR szSubjectRDN = NULL;
  152. char buff[2048] = { 0 };
  153. dwStrType = CERT_X500_NAME_STR;
  154. dwCount = pCertGetNameStringA(psProvCert->pCert,
  155. CERT_NAME_RDN_TYPE,
  156. 0,
  157. &dwStrType,
  158. buff,
  159. sizeof(buff));
  160. printf("%s\n", buff);
  161. dwCount = dwCount;
  162. }
  163. }
  164. }
  165. }
  166. } while (0);
  167. if (hWintrust)
  168. {
  169. FreeLibrary(hWintrust);
  170. }
  171. return TRUE;
  172. }
  173. int _tmain(int argc, _TCHAR* argv[])
  174. {
  175. PWCHAR pProcessName = L"D:\\KuGou.exe";
  176. DLL_STRUCT dll;
  177. dll.pLoadLibraryA = LoadLibraryA;
  178. dll.pGetProcAddress = (FUN_GetProcAddress)GetProcAddress;
  179. dll.WinTrusDll = 0;
  180. memcpy(dll.StrBuff + 0, DLL_WINTRUST, (ULONG)strlen(DLL_WINTRUST) + 1);
  181. dll.Crypt32Dll = dll.WinTrusDll + (ULONG)strlen(DLL_WINTRUST) + 1;
  182. memcpy(dll.StrBuff + dll.Crypt32Dll, DLL_CRYPT32, (ULONG)strlen(DLL_CRYPT32) + 1);
  183. dll.WinVerifyTrust = dll.Crypt32Dll + (ULONG)strlen(DLL_CRYPT32) + 1;
  184. memcpy(dll.StrBuff + dll.WinVerifyTrust, C_WinVerifyTrust, (ULONG)strlen(C_WinVerifyTrust) + 1);
  185. dll.WTHelperProvDataFromStateData = dll.WinVerifyTrust + (ULONG)strlen(C_WinVerifyTrust) + 1;
  186. memcpy(dll.StrBuff + dll.WTHelperProvDataFromStateData, C_WTHelperProvDataFromStateData, (ULONG)strlen(C_WTHelperProvDataFromStateData) + 1);
  187. dll.WTHelperGetProvSignerFromChain = dll.WTHelperProvDataFromStateData + (ULONG)strlen(C_WTHelperProvDataFromStateData) + 1;
  188. memcpy(dll.StrBuff + dll.WTHelperGetProvSignerFromChain, C_WTHelperGetProvSignerFromChain, (ULONG)strlen(C_WTHelperGetProvSignerFromChain) + 1);
  189. dll.WTHelperGetProvCertFromChain = dll.WTHelperGetProvSignerFromChain + (ULONG)strlen(C_WTHelperGetProvSignerFromChain) + 1;
  190. memcpy(dll.StrBuff + dll.WTHelperGetProvCertFromChain, C_WTHelperGetProvCertFromChain, (ULONG)strlen(C_WTHelperGetProvCertFromChain) + 1);
  191. dll.CertGetNameStringA = dll.WTHelperGetProvCertFromChain + (ULONG)strlen(C_WTHelperGetProvCertFromChain) + 1;
  192. memcpy(dll.StrBuff + dll.CertGetNameStringA, C_CertGetNameStringA, (ULONG)strlen(C_CertGetNameStringA) + 1);
  193. CheckProcessValid(pProcessName, &dll);
  194. return 0;
  195. }

运行结果:

  1. Signature Date = 13/08/2020 at 22:15:50
  2. C=CN, S=Guangdong, L=Guangzhou, O="Guangzhou KuGou Computer Technology Co., Ltd.", OU=IT, CN="Guangzhou KuGou Computer Technology Co., Ltd."

运行结果

0 篇笔记 写笔记

获取应用程序数字签名
一般的应用程序在正式发布前都会进行数字签名。如我们经常听歌的酷狗音乐,其通过查看文件属性,可以看到数字签名如下:那么怎么通过编程来获取数字签名的内容?数字签名的获取一般是需要动态载入以下DLL:Wintrust.dllCrypt32.dll相关的函数#define C_WinVerify......
win10企业版64位如何永久禁用驱动数字签名
在win10下用一个命令就可以禁用驱动程序强制签名禁止强制签名,以管理员的身份运行cmd 执行以下命令bcdedit.exe /set nointegritychecks on恢复默认验证,执行如下命令即可:bcdedit.exe /set nointegritychecks off......
win10,Win11如何关闭数字签名认证
数字签名认证可以让系统不加载未经过WHQL或者EV授权的的驱动程序的加载。但是我们在实际使用过程中,经常要调试,所以关闭数字签名证书就很有必要。win10,Win11如何关闭数字签名认证1、在桌面开始菜单中击右键,在弹出的菜单中选择“以管理员身份运行命令行窗口”页面。2、在打开的命令窗口页面中输入......
Win11怎么禁用驱动程序强制签名? 关闭Win11驱动强制签名的技巧
什么是驱动程序签名驱动程序签名又叫做驱动程序的数字签名,它是由微软的Windows硬件设备质量实验室完成的。硬件开发商将自己的硬件设备和相应的驱动程序交给该实验室,由实验室对其进行测试,测试合格后实验室将在其驱动程序中添加数字签名。由于数字签名是由微软完成的。Win11设备只有安装了驱动才能正常使......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!