WinVerifyTrust 到底在驗證甚麼 ? 是數位簽章嗎 ? |
尚未結案
|
pcboy
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
WinVerifyTrust 到底在驗證甚麼 ? 是數位簽章嗎 ?
但是 Notepad.exe 沒有數位簽章,驗證結果是 true ? WinVerifyTrust Function http://msdn.microsoft.com/en-us/library/aa388208(VS.85).aspx ![]() ![]() ![]() [code delphi] // WinVerifyTrust // Delphi 7 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const //Kostanten f?Nor die dwUnionChoice in WINTRUST_DATA WTD_CHOICE_FILE = 1; WTD_CHOICE_CATALOG = 2; //Konstanten f?Nor dwStateAction WTD_STATEACTION_IGNORE = 0; WTD_STATEACTION_VERIFY = 1; //UI Konstanten f?Nor WINTRUST_DATA WTD_UI_NONE = 2; //kein UI anzeigen //Konstanten zur Pr?Nofung auf zur?Nockgezogene Zertifikate WTD_REVOKE_NONE = 0; // keine zus?tzliche Pr?Nofun //Konstanten f?Nor TrustProvider WTD_SAFER_FLAG = 256; // f?Nor Winxp Sp2 ben?tigt //Wintrust Action GUID??s WINTRUST_ACTION_GENERIC_VERIFY_V2: TGUID = '{00AAC56B-CD44-11d0-8CC2-00C04FC295EE}'; type CATALOG_INFO = record cbStruct: DWORD; // = sizeof(WINTRUST_CATALOG_INFO) sCatalogFile: array[0..MAX_PATH] of WCHAR; // Dateiname incl. Pfad zur CAT Datei end; PCATALOG_INFO = ^CATALOG_INFO; WINTRUST_CATALOG_INFO = record cbStruct: DWORD; // = sizeof(WINTRUST_CATALOG_INFO) dwCatalogVersion: DWORD; // optional pcwszCatalogFilePath: LPCWSTR; // ben?tigt, Dateiname incl. Pfad zur CAT Datei pcwszMemberTag: LPCWSTR; // ben?tigt, tag zum Mitglied im Katalog pcwszMemberFilePath: LPCWSTR; // ben?tigt, Dateiname incl. Pfad hMemberFile: THANDLE; // optional end; PWINTRUST_CATALOG_INFO = ^WINTRUST_CATALOG_INFO; WINTRUST_FILE_INFO = record cbStruct: DWORD; // = sizeof(WINTRUST_FILE_INFO) pcwszFilePath: LPCWSTR; // ben?tigt, Dateiname incl. Pfad pgKnownSubject: PGUID; // optional hFile: THANDLE; // optional end; PWINTRUST_FILE_INFO = ^WINTRUST_FILE_INFO; WINTRUST_DATA = packed record cbStruct: DWORD; // = sizeof(WINTRUST_DATA) pPolicyCallbackData: pointer; // optional - auf 0 setzen pSIPClientData: pointer; // optional - auf 0 setzen dwUIChoice: DWORD; // ben?tigt, UI auswahl fdwRevocationChecks: DWORD; // ben?tigt, auf zur?Nockgezogene Zertifikate pr?Nofen (online ben.) dwUnionChoice: DWORD; // ben?tigt, welche Datenstruktur soll verwendet werden pWTDINFO: pointer; // Pointer zu einer der Wintrust_X_Info Strukturen pFake: pointer; //Fake Pointer - n?tig damit der Speicer wieder freigegeben wird pFake1: pointer; //Fake Pointer - n?tig damit der Speicer wieder freigegeben wird pFake2: pointer; //Fake Pointer - n?tig damit der Speicer wieder freigegeben wird pFake3: pointer; //Fake Pointer - n?tig damit der Speicer wieder freigegeben wird dwStateAction: DWORD; hWVTStateData: THANDLE; pwszURLReference: PWChar; dwProvFlags: DWORD; dwUIContext: DWORD; end; PWINTRUST_DATA = ^WINTRUST_DATA; //Handle und Pointer auf KatalogAdminKontext HCatAdmin = THANDLE; PHCatAdmin = ^HCatAdmin; var Form1: TForm1; hLibWintrust: THANDLE; //dynamische Dll Aufrufe - keine Statische einbindung m?glich CryptCATAdminAcquireContext: function(PHCatAdmin: PHCatAdmin; pgSubsystem: PGUID; dwFlags: DWORD): BOOL; stdcall; CryptCATAdminReleaseContext: function(HCatAdmin: HCatAdmin; dwFlags: DWORD): BOOL; stdcall; CryptCATAdminCalcHashFromFileHandle: function(hFile: THANDLE; pHashSize: PDWORD; pbHash: PByteArray; dwFlags: DWORD): BOOL; stdcall; CryptCATAdminEnumCatalogFromHash: function(HCatAdmin: HCatAdmin; pbHash: PByteArray; pHashSize: DWORD; dwFlags: DWORD; phPrevCatInfo: PHandle): THANDLE; stdcall; CryptCATCatalogInfoFromContext: function(hCatInfo: THANDLE; psCatInfo: PCATALOG_INFO; dwFlags: DWORD): BOOL; stdcall; CryptCATAdminReleaseCatalogContext: function(HCatAdmin: HCatAdmin; hCatInfo: THANDLE; dwFlags: DWORD): BOOL; stdcall; WinVerifyTrust: function(hwnd: THANDLE; pgActionID: PGUID; pWintrustData: PWINTRUST_DATA): Longint; stdcall; implementation {$R *.dfm} function FileIsTrusted(const sFilename: string): Boolean; var //Byte Array und Counter aByteHash: array[0..255] of Byte; iByteCount: Integer; hCatAdminContext: HCatAdmin; WTrustData: WINTRUST_DATA; WTDCatalogInfo: WINTRUST_CATALOG_INFO; WTDFileInfo: WINTRUST_FILE_INFO; CatalogInfo: CATALOG_INFO; hFile: THANDLE; hCatalogContext: THANDLE; swFilename: WideString; swMemberTag: WideString; ilRet: Longint; x: Integer; begin //Standard Result setzen Result := False; //Sicherheitsabfrage ob Datei existiert if FileExists(sFilename) = False then Exit; //String in Widestring wandeln swFilename := sFilename; ZeroMemory(@CatalogInfo, SizeOf(CatalogInfo)); ZeroMemory(@WTDFileInfo, SizeOf(WTDFileInfo)); ZeroMemory(@WTDCatalogInfo, SizeOf(WTDCatalogInfo)); ZeroMemory(@WTrustData, SizeOf(WTrustData)); //Catalog Admin Kontext ?ffnen und falls nicht m?glich Prozedur verlassen if CryptCATAdminAcquireContext(@hCatAdminContext, nil, 0) = False then Exit; //Filehandle auf die zu pr?Nofende Datei holen hFile := CreateFile(PChar(string(sFilename)), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); //Wenn das Handle nicht erhalten wurde Prozedur verlassen if hFile = INVALID_HANDLE_VALUE then Exit; //iaBytescount nach gr??e des Arrays setzen iByteCount := SizeOf(aByteHash); //ByteArray mit Hash f?Nollen lassen und die Gr??e in iByteCount bekommen CryptCATAdminCalcHashFromFileHandle(hFile, @iByteCount, @aByteHash, 0); // MemberTag brechnen (vom ByteArray auf HEX) for x := 0 to iByteCount - 1 do begin swMemberTag := swMemberTag IntToHex(aByteHash[x], 2); end; //FileHandle schlie?en - wird nicht mehr gebraucht CloseHandle(hFile); //Erste Pr?Nofung erfolgt mit WINTRUST_DATA.dwUnionChoice := WTD_CHOICE_CATALOG; //also muss WINTRUST_CATALOG_INFO gef?Nollt werden // //Handle auf den Katalog Kontext holen hCatalogContext := CryptCATAdminEnumCatalogFromHash(hCatAdminContext, @aByteHash, iByteCount, 0, nil); //Wenn das Handle 0 ist muss die Pr?Nofung mit der //WINTRUST_DATA.dwUnionChoice := WTD_CHOICE_FILE; Struktur durchgef?Nohrt werden if hCatalogContext = 0 then begin //CatalogContext = 0 also // //WINTRUST_FILE_INFO Struktur initialisieren und f?Nollen WTDFileInfo.cbStruct := SizeOf(WTDFileInfo); WTDFileInfo.pcwszFilePath := PWideChar(swFilename); WTDFileInfo.pgKnownSubject := nil; WTDFileInfo.hFile := 0; //WINTRUST_DATA Struktur initialisieren und f?Nollen WTrustData.cbStruct := SizeOf(WTrustData); WTrustData.dwUnionChoice := WTD_CHOICE_FILE; //WINTRUST_FILE_INFO Struktur w?hlen WTrustData.pWTDINFO := @WTDFileInfo; //Pointer zu WINTRUST_FILE_INFO WTrustData.dwUIChoice := WTD_UI_NONE; WTrustData.fdwRevocationChecks := WTD_REVOKE_NONE; WTrustData.dwStateAction := WTD_STATEACTION_IGNORE; WTrustData.dwProvFlags := WTD_SAFER_FLAG; //UI bei XP SP2 unterbinden WTrustData.hWVTStateData := 0; WTrustData.pwszURLReference := nil; end else begin //CatalogContext <> 0 also CATALOG_INFO benutzen // //CATALOG_INFO Struktur f?Nollen CryptCATCatalogInfoFromContext(hCatalogContext, @CatalogInfo, 0); //WINTRUST_CATALOG_INFO Struktur initialisieren und f?Nollen WTDCatalogInfo.cbStruct := SizeOf(WTDCatalogInfo); WTDCatalogInfo.pcwszCatalogFilePath := CatalogInfo.sCatalogFile; WTDCatalogInfo.pcwszMemberFilePath := PWideChar(swFilename); WTDCatalogInfo.pcwszMemberTag := PWideChar(swMemberTag); //WINTRUST_DATA Struktur initialisieren und f?Nollen WTrustData.cbStruct := SizeOf(WTrustData); WTrustData.dwUnionChoice := WTD_CHOICE_CATALOG; //WINTRUST_CATALOG_INFO Struktur w?hlen WTrustData.pWTDINFO := @WTDCatalogInfo; //Pointer zu WINTRUST_CATALOG_INFO WTrustData.dwUIChoice := WTD_UI_NONE; WTrustData.fdwRevocationChecks := WTD_REVOKE_NONE; WTrustData.pPolicyCallbackData := nil; WTrustData.pSIPClientData := nil; WTrustData.dwStateAction := WTD_STATEACTION_VERIFY; WTrustData.dwProvFlags := 0; //WTD_SAFER_FLAG; //UI bei XP SP2 unterbinden WTrustData.hWVTStateData := 0; WTrustData.pwszURLReference := nil; end; //WinVerifyTrust aufrufen um die Pr?Nofung durchzuf?Nohren ilRet := WinVerifyTrust(INVALID_HANDLE_VALUE, @WINTRUST_ACTION_GENERIC_VERIFY_V2, @WTrustData); //Wenn Erg. 0 ist dann ist das File Trusted - alle anderen Werte sind Fehlercodes if ilRet = 0 then begin Result := True end else Result := False; //Handle zum Catalogfile schlie?en CryptCATAdminReleaseCatalogContext(hCatAdminContext, hCatalogContext, 0); //Catalog Admin Kontext schlie?en CryptCATAdminReleaseContext(hCatAdminContext, 0); end; procedure TForm1.Button1Click(Sender: TObject); var sFilename: string; begin Memo1.Lines.Clear; sFilename:='C:\WINDOWS\NOTEPAD.EXE'; if FileIsTrusted(sFilename) then Memo1.Lines.Add(sFilename ' is trusted') else Memo1.Lines.Add(sFilename ' is not trusted'); sFilename:='C:\Program Files\Adobe\Reader 9.0\Reader\reader_sl.exe'; if FileIsTrusted(sFilename) then Memo1.Lines.Add(sFilename ' is trusted') else Memo1.Lines.Add(sFilename ' is not trusted'); sFilename:=Application.ExeName; if FileIsTrusted(sFilename) then Memo1.Lines.Add(sFilename ' is trusted') else Memo1.Lines.Add(sFilename ' is not trusted'); end; initialization //Dynamisches laden der Dll und deren Funktionen hLibWintrust := LoadLibrary('wintrust.dll'); if hLibWintrust >= 32 then { success } begin CryptCATAdminAcquireContext := GetProcAddress(hLibWintrust, 'CryptCATAdminAcquireContext'); CryptCATAdminReleaseContext := GetProcAddress(hLibWintrust, 'CryptCATAdminReleaseContext'); CryptCATAdminCalcHashFromFileHandle := GetProcAddress(hLibWintrust, 'CryptCATAdminCalcHashFromFileHandle'); CryptCATAdminEnumCatalogFromHash := GetProcAddress(hLibWintrust, 'CryptCATAdminEnumCatalogFromHash'); CryptCATCatalogInfoFromContext := GetProcAddress(hLibWintrust, 'CryptCATCatalogInfoFromContext'); CryptCATAdminReleaseCatalogContext := GetProcAddress(hLibWintrust, 'CryptCATAdminReleaseCatalogContext'); WinVerifyTrust := GetProcAddress(hLibWintrust, 'WinVerifyTrust'); end; finalization FreeLibrary(hLibWintrust); end. [/code]
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
AndrewK
高階會員 ![]() ![]() ![]() ![]() 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
------
Just Do It ------------------------- 其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2010-07-16 11:30:59, 註解 無‧
|
pcboy
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
AndrewK
高階會員 ![]() ![]() ![]() ![]() 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
兩者皆可做驗證之動作
提供以下三篇文章參考 1.基本原理說明 http://hi.baidu.com/7ctt/blog/item/11484cdfb5a0f21749540391.html 2.文件說明 http://msdn.microsoft.com/en-us/library/aa388205(v=VS.85).aspx 3. 2007年12月1日 微軟修補程式 http://support.microsoft.com/kb/329115/zh-tw
------
Just Do It ------------------------- 其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2010-07-16 19:29:09, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |