全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2528
推到 Plurk!
推到 Facebook!

WinVerifyTrust 到底在驗證甚麼 ? 是數位簽章嗎 ?

尚未結案
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-07-15 21:08:53 IP:203.73.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-07-16 11:24:40 IP:211.74.xxx.xxx 訂閱
Hello 

suggest as follows
try the CertGetCertificateChain and CertVerifyCertificateChainPolicy
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2010-07-16 11:30:59, 註解 無‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-07-16 17:43:24 IP:203.73.xxx.xxx 訂閱
您的意思是說 CertGetCertificateChain 和 CertVerifyCertificateChainPolicy 才是驗證數位簽章的 ?
請問 WinVerifyTrust 到底在驗證甚麼 ?
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-07-16 19:28:18 IP:211.74.xxx.xxx 訂閱
兩者皆可做驗證之動作
提供以下三篇文章參考

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, 註解 無‧
系統時間:2017-12-13 13:36:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!