Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.04.2010, 20:40
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка Перевод на Delphi кода получения информации о цифровой подписи файла

Привет, может кто поможет перевести на Delphi код представленный ниже, я думаю многим это будет интересно

СССЫЛКА на код, так как он великоват, относительно

ЗЫ
Возможен бартер на какие-нибудь исходники
Ответить с цитированием
  #2  
Старый 20.04.2010, 20:50
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Знаешь, что. Ты навываешься второй (по моему раз), если банить предоставяи мне 0 баен ьулет вкяеыйю
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 20.04.2010, 20:55
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Это на каком наречии?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 20.04.2010, 20:58
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

Цитата:
Сообщение от Aristarh Dark
Знаешь, что. Ты навываешься второй (по моему раз), если банить предоставяи мне 0 баен ьулет вкяеыйю

Я тоже не совсем понял о чем речь, но видать я нарушил какое то правило , ткните носом плиз, просто очень нужно было, кроме Делфи я ни в чем практически не разбираюсь. И еще какое 2 нарушение, аналогичное?

ЗЫ
Как уже писал код не влез по ограничениям самого форума, пришлось кинуть ссыль на первоисточник

Последний раз редактировалось Vayrus, 20.04.2010 в 21:02.
Ответить с цитированием
  #5  
Старый 22.04.2010, 20:08
Zorkov Igor Zorkov Igor вне форума
Новичок
 
Регистрация: 28.07.2009
Сообщения: 85
Репутация: 50
По умолчанию

СССЫЛКА на код, так как он великоват, относительно

Здесь пример получения информации о сертификате который внутри самого файла, большинство Microsoft файлов пописаны сертификатами которые находятся на жестком диске, например с файлом ":\Windows\system32\svchost.exe" будет облом

Вот держи http://www.onlinedisk.ru/file/413467/ перевод
Ответить с цитированием
  #6  
Старый 23.04.2010, 08:48
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

О, спасибо, выручил

ЗЫ
Cуществует 2 способа подписи файлов:
1. Цифровыми сертификатами *.cat которые лежат в папке %windir%\system32\CatRoot
2. Цифровыми подписями вшитыми в файл

Последний раз редактировалось Vayrus, 23.04.2010 в 09:01.
Ответить с цитированием
  #7  
Старый 23.04.2010, 09:22
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

К сожалению получение Издателя неработает, так хотел на основе него написать получение остальной инфы

У меня был код проверки валидности подписи, но мне важно получить полную информацию, такую например как, кем и когда подписано, до какой даты валидна подпись и тд

ЗЫ
Файл svchost у меня определился как подписанный
Я по коду получения издателя понял что Издатель как раз получается из сертификата в папке CatRoot, а так как большинство файлов с вшитой подписью, то она и не может получить издателя, но винда же как то это показывает в свойствах файла

Вот код, который у меня был:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
unit TrustCheckMod;//Author:    ACE-ppc
 
interface
 
function FileIsTrusted(const sFilename: string): Boolean;
 
implementation
 
uses
  Windows, SysUtils;
 
const
  //Kostanten fЁ№r die dwUnionChoice in WINTRUST_DATA
  WTD_CHOICE_FILE = 1;
  WTD_CHOICE_CATALOG = 2;
 
  //Konstanten fЁ№r dwStateAction
  WTD_STATEACTION_IGNORE = 0;
  WTD_STATEACTION_VERIFY = 1;
 
  //UI Konstanten fЁ№r WINTRUST_DATA
  WTD_UI_NONE = 2; //kein UI anzeigen
 
  //Konstanten zur PrЁ№fung auf zurЁ№ckgezogene Zertifikate
  WTD_REVOKE_NONE = 0; // keine zus?tzliche PrЁ№fun
 
  //Konstanten fЁ№r TrustProvider
  WTD_SAFER_FLAG = 256; // fЁ№r 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Ё№ckgezogene Zertifikate prЁ№fen (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
  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;
 
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Ё№fende 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Ё№llen 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Ё№fung erfolgt mit WINTRUST_DATA.dwUnionChoice := WTD_CHOICE_CATALOG;
  //also muss WINTRUST_CATALOG_INFO gefЁ№llt werden
  //
  //Handle auf den Katalog Kontext holen
  hCatalogContext := CryptCATAdminEnumCatalogFromHash(hCatAdminContext, @aByteHash, iByteCount, 0, nil);
  //Wenn das Handle 0 ist muss die PrЁ№fung mit der
  //WINTRUST_DATA.dwUnionChoice := WTD_CHOICE_FILE; Struktur durchgefЁ№hrt werden
  if hCatalogContext = 0 then
  begin
    //CatalogContext = 0 also
    //
    //WINTRUST_FILE_INFO Struktur initialisieren und fЁ№llen
    WTDFileInfo.cbStruct := SizeOf(WTDFileInfo);
    WTDFileInfo.pcwszFilePath := PWideChar(swFilename);
    WTDFileInfo.pgKnownSubject := nil;
    WTDFileInfo.hFile := 0;
    //WINTRUST_DATA Struktur initialisieren und fЁ№llen
    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Ё№llen
    CryptCATCatalogInfoFromContext(hCatalogContext, @CatalogInfo, 0);
    //WINTRUST_CATALOG_INFO Struktur initialisieren und fЁ№llen
    WTDCatalogInfo.cbStruct := SizeOf(WTDCatalogInfo);
    WTDCatalogInfo.pcwszCatalogFilePath := CatalogInfo.sCatalogFile;
    WTDCatalogInfo.pcwszMemberFilePath := PWideChar(swFilename);
    WTDCatalogInfo.pcwszMemberTag := PWideChar(swMemberTag);
    //WINTRUST_DATA Struktur initialisieren und fЁ№llen
    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Ё№fung durchzufЁ№hren
  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;
 
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.

Последний раз редактировалось Vayrus, 23.04.2010 в 09:40.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:39.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025