分类: WINDOWS
2009-07-01 09:13:42
//filename:MicrosoftVerify.h typedef struct _CRYPTOAPI_BLOB { typedef struct _CTL_USAGE { |
#include #include #include #include "MicrosoftVerify.h" //filename:MicrosoftVerify.c //′ú??à′×?£o BOOL CheckFileTrust( LPCWSTR lpFileName ) { BOOL bRet = FALSE; WINTRUST_DATA wd = { 0 }; WINTRUST_FILE_INFO wfi = { 0 }; WINTRUST_CATALOG_INFO wci = { 0 }; CATALOG_INFO ci = { 0 }; HCATADMIN hCatAdmin = NULL; HANDLE hFile = NULL; DWORD dwCnt = 100; BYTE byHash[100]; DWORD dw = 0; HCATINFO hCatInfo; GUID action = WINTRUST_ACTION_GENERIC_VERIFY_V2; HRESULT hr; LPWSTR pszMemberTag = (LPWSTR)malloc(sizeof(WCHAR)*(dwCnt * 2 + 1));//new WCHAR[dwCnt * 2 + 1]; if ( !CryptCATAdminAcquireContext( &hCatAdmin, NULL, 0 ) ) { return FALSE; } hFile = CreateFileW( lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL ); if ( INVALID_HANDLE_VALUE == hFile ) { CryptCATAdminReleaseContext( hCatAdmin, 0 ); return FALSE; } //对整个文件做hash,采用标准SHA1_160bit算法 CryptCATAdminCalcHashFromFileHandle( hFile, &dwCnt, byHash, 0 ); CloseHandle( hFile ); //将hash的结果 变换成unicode 例如0x8c -> 38 00 43 00 for ( dw = 0; dw < dwCnt; ++dw ) { wsprintfW( &pszMemberTag[dw * 2], L"%02X", byHash[dw] ); } hCatInfo = CryptCATAdminEnumCatalogFromHash( hCatAdmin, byHash, dwCnt, 0, NULL ); if ( NULL == hCatInfo ) { wfi.cbStruct = sizeof( WINTRUST_FILE_INFO ); wfi.pcwszFilePath = lpFileName; wfi.hFile = NULL; wfi.pgKnownSubject = NULL; wd.cbStruct = sizeof( WINTRUST_DATA ); wd.dwUnionChoice = WTD_CHOICE_FILE; // wd.pFile = &wfi; wd.DUMMYUNIONNAME.pFile = &wfi; wd.dwUIChoice = WTD_UI_NONE; wd.fdwRevocationChecks = WTD_REVOKE_NONE; wd.dwStateAction = WTD_STATEACTION_IGNORE; wd.dwProvFlags = WTD_SAFER_FLAG; wd.hWVTStateData = NULL; wd.pwszURLReference = NULL; } else { CryptCATCatalogInfoFromContext( hCatInfo, &ci, 0 ); wci.cbStruct = sizeof( WINTRUST_CATALOG_INFO ); wci.pcwszCatalogFilePath = ci.wszCatalogFile; wci.pcwszMemberFilePath = lpFileName; wci.pcwszMemberTag = pszMemberTag; wd.cbStruct = sizeof( WINTRUST_DATA ); wd.dwUnionChoice = WTD_CHOICE_CATALOG; wd.DUMMYUNIONNAME.pCatalog = &wci; wd.dwUIChoice = WTD_UI_NONE; wd.fdwRevocationChecks = WTD_STATEACTION_VERIFY; wd.dwProvFlags = 0; wd.hWVTStateData = NULL; wd.pwszURLReference = NULL; } hr = WinVerifyTrustX( NULL, &action, &wd ); //关键在于跟踪WinVerifyTrust()的过程了,OD载入不了,IDA看的话又太复杂。郁闷啊!20090212 bRet = SUCCEEDED( hr ); if ( NULL != hCatInfo ) { CryptCATAdminReleaseCatalogContext( hCatAdmin, hCatInfo, 0 ); } CryptCATAdminReleaseContext( hCatAdmin, 0 ); // 2007.4.10?DD?íˉ???÷?y??3?ò?′|?ú′?D1?? free(pszMemberTag);// delete[] pszMemberTag; return bRet; } BOOL InitFunc() { HMODULE dllHandle = NULL; dllHandle = LoadLibrary("wintrust.dll"); if (NULL == dllHandle) { printf("LoadLibrary wintrust.dll error!%d\n",GetLastError()); return FALSE; } (FARPROC &)CryptCATAdminAcquireContext = GetProcAddress(dllHandle,"CryptCATAdminAcquireContext"); (FARPROC &)CryptCATAdminReleaseContext = GetProcAddress(dllHandle,"CryptCATAdminReleaseContext"); (FARPROC &)CryptCATAdminCalcHashFromFileHandle = GetProcAddress(dllHandle,"CryptCATAdminCalcHashFromFileHandle"); (FARPROC &)CryptCATAdminEnumCatalogFromHash = GetProcAddress(dllHandle,"CryptCATAdminEnumCatalogFromHash"); (FARPROC &)CryptCATAdminReleaseCatalogContext = GetProcAddress(dllHandle,"CryptCATAdminReleaseCatalogContext"); (FARPROC &)CryptCATCatalogInfoFromContext = GetProcAddress(dllHandle,"CryptCATCatalogInfoFromContext"); (FARPROC &)WinVerifyTrustX = GetProcAddress(dllHandle,"WinVerifyTrust"); if (CryptCATAdminAcquireContext == NULL || CryptCATAdminReleaseContext == NULL || CryptCATAdminCalcHashFromFileHandle == NULL || CryptCATAdminEnumCatalogFromHash == NULL || CryptCATAdminReleaseCatalogContext == NULL || CryptCATCatalogInfoFromContext == NULL || WinVerifyTrustX == NULL) { printf("GetProcAddress error 1%d\n",GetLastError()); return FALSE; } return TRUE; } //测试驱动 int main(int argc,char **argv) { BOOL ret; if (!InitFunc()) { printf("%s %d error!",__FILE__,__LINE__); return 0; } ret = CheckFileTrust(L"C:\\111.exe"); if (ret) { printf("OK!\n"); } else { printf("Sorry!\n"); } return 0; } |