Форум по 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,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

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

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 20.04.2010, 20:55
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 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, а так как большинство файлов с вшитой подписью, то она и не может получить издателя, но винда же как то это показывает в свойствах файла

Вот код, который у меня был:
Код:
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, время: 05:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter