<a target="_blank" href="http://forum.sysinternals.com/howto-verify-the-digital-signature-of-a-file_topic19247.html">http://forum.sysinternals.com/howto-verify-the-digital-signature-of-a-file_topic19247.html</a> <div><br></div> <div>실행파일 디지털 서명 확인하는 오픈소스인데 자꾸 CreateFileW 부분에서 막히네요 ㅠ</div> <div><br></div> <div><div>#include <stdio.h></div> <div>#include <tchar.h></div> <div><span style="font-size:9pt;line-height:1.5;">#include <locale.h></span></div> <div>#include <Windows.h></div> <div>#include <Softpub.h></div> <div>#include <wincrypt.h></div> <div>#include <wintrust.h></div> <div>#include <mscat.h></div> <div>#pragma comment(lib, "wintrust")</div> <div><br></div> <div>BOOLEAN IsFileDigitallySigned(TCHAR* FilePath)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Author: AD, 2009</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>PVOID Context;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>HANDLE FileHandle;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>DWORD HashSize = 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>PBYTE Buffer;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>PVOID CatalogContext;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CATALOG_INFO InfoStruct;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WINTRUST_DATA WintrustStructure;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WINTRUST_CATALOG_INFO WintrustCatalogStructure;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WINTRUST_FILE_INFO WintrustFileStructure;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>PWCHAR MemberTag;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>BOOLEAN ReturnFlag = FALSE;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>ULONG ReturnVal;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>GUID ActionGuid = WINTRUST_ACTION_GENERIC_VERIFY_V2;</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Zero our structures.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>memset(&InfoStruct, 0, sizeof(CATALOG_INFO));</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>InfoStruct.cbStruct = sizeof(CATALOG_INFO);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>memset(&WintrustCatalogStructure, 0, sizeof(WINTRUST_CATALOG_INFO));</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustCatalogStructure.cbStruct = sizeof(WINTRUST_CATALOG_INFO);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>memset(&WintrustFileStructure, 0, sizeof(WINTRUST_FILE_INFO));</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustFileStructure.cbStruct = sizeof(WINTRUST_FILE_INFO);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Get a context for signature verification.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (!CryptCATAdminAcquireContext(&Context, NULL, 0))</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return FALSE;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Open file.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>FileHandle = CreateFileW(FilePath, GENERIC_READ, 7, NULL, OPEN_EXISTING, 0, NULL);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (INVALID_HANDLE_VALUE == FileHandle)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CryptCATAdminReleaseContext(Context, 0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return FALSE;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Get the size we need for our hash.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CryptCATAdminCalcHashFromFileHandle(FileHandle, &HashSize, NULL, 0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (HashSize == 0)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//0-sized has means error!</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CryptCATAdminReleaseContext(Context, 0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CloseHandle(FileHandle);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return FALSE;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Allocate memory.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>Buffer = (PBYTE)calloc(HashSize, 1);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Actually calculate the hash</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (!CryptCATAdminCalcHashFromFileHandle(FileHandle, &HashSize, Buffer, 0))</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CryptCATAdminReleaseContext(Context, 0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>free(Buffer);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CloseHandle(FileHandle);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return FALSE;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Convert the hash to a string.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>MemberTag = (PWCHAR)calloc((HashSize * 2) + 1, sizeof(WCHAR));</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (unsigned int i = 0; i < HashSize; i++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>swprintf(&MemberTag[i * 2], L"%02X", Buffer[i]);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Get catalog for our context.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CatalogContext = CryptCATAdminEnumCatalogFromHash(Context, Buffer, HashSize, 0, NULL);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (CatalogContext)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//If we couldn't get information</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (!CryptCATCatalogInfoFromContext(CatalogContext, &InfoStruct, 0))</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Release the context and set the context to null so it gets picked up below.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CryptCATAdminReleaseCatalogContext(Context, CatalogContext, 0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CatalogContext = NULL;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//If we have a valid context, we got our info. </div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Otherwise, we attempt to verify the internal signature.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (!CatalogContext)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustFileStructure.cbStruct = sizeof(WINTRUST_FILE_INFO);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustFileStructure.pcwszFilePath = FilePath;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustFileStructure.hFile = NULL;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustFileStructure.pgKnownSubject = NULL;</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.cbStruct = sizeof(WINTRUST_DATA);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.dwUnionChoice = WTD_CHOICE_FILE;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.pFile = &WintrustFileStructure;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.dwUIChoice = WTD_UI_NONE;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.fdwRevocationChecks = WTD_REVOKE_NONE;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.dwStateAction = WTD_STATEACTION_IGNORE;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.dwProvFlags = WTD_SAFER_FLAG;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.hWVTStateData = NULL;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.pwszURLReference = NULL;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//If we get here, we have catalog info! Verify it.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.cbStruct = sizeof(WINTRUST_DATA);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.pPolicyCallbackData = 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.pSIPClientData = 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.dwUIChoice = WTD_UI_NONE;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.fdwRevocationChecks = WTD_REVOKE_NONE;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.dwUnionChoice = WTD_CHOICE_CATALOG;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.pCatalog = &WintrustCatalogStructure;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.dwStateAction = WTD_STATEACTION_VERIFY;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.hWVTStateData = NULL;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.pwszURLReference = NULL;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.dwProvFlags = 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.dwUIContext = WTD_UICONTEXT_EXECUTE;</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Fill in catalog info structure.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustCatalogStructure.cbStruct = sizeof(WINTRUST_CATALOG_INFO);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustCatalogStructure.dwCatalogVersion = 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustCatalogStructure.pcwszCatalogFilePath = InfoStruct.wszCatalogFile;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustCatalogStructure.pcwszMemberTag = MemberTag;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustCatalogStructure.pcwszMemberFilePath = FilePath;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustCatalogStructure.hMemberFile = NULL;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Call our verification function.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>ReturnVal = WinVerifyTrust(0, &ActionGuid, &WintrustStructure);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Check return.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>ReturnFlag = SUCCEEDED(ReturnVal);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Free context.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (CatalogContext)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CryptCATAdminReleaseCatalogContext(Context, CatalogContext, 0);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//If we successfully verified, we need to free.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (ReturnFlag)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WintrustStructure.dwStateAction = WTD_STATEACTION_CLOSE;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>WinVerifyTrust(0, &ActionGuid, &WintrustStructure);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Free memory.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>free(MemberTag);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>free(Buffer);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CloseHandle(FileHandle);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CryptCATAdminReleaseContext(Context, 0);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return ReturnFlag;</div> <div>}</div> <div><br></div> <div><br></div> <div>int main(void)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_tsetlocale(LC_ALL, _T("korean"));</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>TCHAR * test = _T("C:\Users\Ko-PC\Documents\Visual Studio 2015\Projects\IsFileDigitallySigned\Debug");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>IsFileDigitallySigned(test);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 0;</div> <div>}</div></div> <div><br></div> <div>그리고 main의 두번째줄 에서 문자열이 길어지면 "유니버설 문자 이름의 형식이 잘못되었습니다" 이런 오류가 뜨는데 왜 뜨는건가요?</div> <div>그래서 C 바로 밑에 넣고 실행 해보았었습니다. 역시나 안열리구요....</div> <div>나름 수정해봤는데도 잘 안되고 방법좀 알려주시면 감사하겠습니다. ㅠㅠ </div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.