Verificarea software a semnăturii șoferului în programarea Windows XP

A fost o sarcină de verificare a semnăturii driverului în Windows XP.

În mod specific, mă interesează haspnt.sys, hardlock.sys sunt driverele cheii hardware pentru protecția copiilor HASP (emulatorii cheie înlocuiesc aceste fișiere cu versiuni nesemnate, astfel încât să le puteți verifica).







În mod neașteptat, am întâmpinat dificultăți în rezolvarea acestei probleme.

În Windows 7, șoferii au o semnătură electronică. Acest lucru poate fi verificat făcând clic dreapta pe fișierul sistemului EXE, DLL sau SYS și selectând Proprietăți din meniul derulant - apare o fereastră de proprietăți cu fila Digital Signatures. Am învățat să verific aceste fișiere utilizând funcția WinVerifyTrust a wintrust.dll, funcționează bine (ActionID = WINTRUST_ACTION_GENERIC_VERIFY_V2).

Cu toate acestea, în Windows XP, de obicei nu există astfel de file pentru fișierele driver, respectiv, WinVerifyTrust returnează o eroare de validare pe un astfel de fișier. În ciuda acestui fapt, instrumentele standard Windows (de exemplu, Verifier.exe, Process Explorer Mark Russinovich) văd cumva dacă fișierul este semnat sau nu. Ce înseamnă să folosească pentru asta, nu pot să înțeleg!

Poate cineva are experiență în acest domeniu? Sunt interesat de Windows XP, dar ar fi interesant să verificați autenticitatea driverelor în versiuni anterioare, până la Windows 98.

Următoarele lucruri se întâmplă în verifier.exe:
toate driverele sunt mutate în dosarul de sistem și pentru fiecare funcție este apelată IsDriverSigned.
Vedem că pentru fiecare șofer această funcție WinVerifyTrust este apelată de până la 3 ori, deși pentru majoritatea covârșitoare este suficient un apel, adică până la funcționare Compania VerifyIsFileSigned nu ajunge.

Sintaxa C este utilizată

BOOL __stdcall VerifyIsFileSigned # 40; LPWSTR lpFileName. struct DRIVER_VER_INFO_ * driver_info # 41;
# 123;
Rezultate LONG;
Politica GUIDGUID1 = DRIVER_ACTION_VERIFY;
Politica GUIDGUID2 = WINTRUST_ACTION_GENERIC_VERIFY_V2;

WINTRUST_DATA wtData;
WINTRUST_FILE_INFO wtFileInfo;

wtFileInfo. cbStruct = 16;
wtFileInfo. hFile = 0;
wtFileInfo. pcwszFilePath = lpFileName;
wtFileInfo. pgKnownSubject = 0;

memset # 40; driver_info. 0. dimensiune # 40; struct DRIVER_VER_INFO_ # 41; # 41; ;
driver_info -> cbStruct = 1088;

memset # 40; wtData. 0. dimensiune # 40; wtData # 41; # 41; ;
wtData. cbStruct = 44;
wtData. dwUIChoice = 2;
wtData. dwUnionChoice = 1;
wtData. dwStateAction = 3;
wtData. pPolicyCallbackData = driver_info;
wtData. fdwRevocationChecks = 0;
wtData. pFile = wtFileInfo;
rezultat = WinVerifyTrust # 40; AfxGetThread # 40; # 41; -> GetMainWnd # 40; # 41; -> m_hWnd. policyGUID1. wtData # 41; ;
dacă # 40; rezultat # 41;
# 123;
rezultat = WinVerifyTrust # 40; AfxGetThread # 40; # 41; -> GetMainWnd # 40; # 41; -> m_hWnd. policyGUID2. wtData # 41; ;






# 125;
dacă # 40; driver_info -> pcSignerCertContext # 41;
# 123;
CertFreeCertificateContext # 40; * v5 # 41; ;
driver_info -> pcSignerCertContext = 0;
# 125;
rezultatul returnat == 0;
# 125;

int __stdcall IsDriverSigned # 40; LPCWSTR lpFileName # 41;
# 123;
int esteSignat;
Politica GUIDGUID1 = DRIVER_ACTION_VERIFY;
HANDLE hFile;
BYTE pbHash # 91; 100 # 93; ;
DWORD cbHash;
int hash_ok;
HCATINFO phPrevCatInfo;
HCATINFO hCatInfo;

CATALOG_INFO psCatInfo;
WINTRUST_CATALOG_INFO wtCatInfo;
DRIVER_VER_INFO driver_info;
WINTRUST_DATA wtData;

isSigned = 0;
hFile = CreateFileW # 40; lpFileName. 0x80000000. 3U. 0. 3u. 0x80u. 0 # 41; ;
dacă # 40; hFile == # 40; HANDLE # 41; - 1 # 41;
# 123;
isSigned = 1;
# 125;
altfel
# 123;
memset # 40; pbHash. 0. dimensiune # 40; pbHash # 41; # 41; ;
pcbHash = 100;
hash_ok = CryptCATAdminCalcHashFromFileHandle # 40; hFile. cbHash. pbHash. 0 # 41; ;
CloseHandle # 40; hFile # 41; ;
dacă # 40; hash_ok == 1 # 41;
# 123;
memset # 40; wtCatInfo. 0. dimensiune # 40; wtCatInfo # 41; # 41; ;
wtCatInfo. cbStruct = 36;
wtCatInfo. pcwszMemberTag = lpFileName;
wtCatInfo. pbCalculatedFileHash = pbHash;
wtCatInfo. cbCalculatedFileHash = cbHash;

memset # 40; driver_info. 0. dimensiune # 40; driver_info # 41; # 41; ;
driver_info. cbStruct = 1088;

memset # 40; wtData. 0. dimensiune # 40; wtData # 41; # 41; ;
wtData. dwUIChoice = 2;
wtData. dwUnionChoice = 2;
wtData. pPolicyCallbackData = driver_info;
wtData. cbStruct = 44;
wtData. fdwRevocationChecks = 0;
wtData. dwStateAction = 3;
wtData. pCatalog = wtCatInfo;

dacă # 40; g_hCatAdmin || # 40; CryptCATAdminAcquireContext # 40; g_hCatAdmin. 0. 0 # 41;. g_hCatAdmin # 41; # 41;
# 123;
pentru # 40; phPrevCatInfo = 0; ; phPrevCatInfo = hCatInfo # 41;
# 123;
hCatInfo = CryptCATAdminEnumCatalogFromHash # 40; g_hCatAdmin. pbHash. cbHash. 0. phPrevCatInfo # 41; ;
dacă # 40; hCatInfo # 41;
pauză;
memset # 40; psCatInfo. 0. dimensiune # 40; psCatInfo # 41; # 41; ;
psCatInfo. cbStruct = 524;
dacă # 40; CryptCATCatalogInfoFromContext # 40; hCatInfo. psCatInfo. 0 # 41; # 41;
# 123;
wtCatInfo. pcwszCatalogFilePath = psCatInfo. wszCatalogFile;
isSigned = WinVerifyTrust # 40; AfxGetThread # 40; # 41; -> GetMainWnd # 40; # 41; -> m_hWnd. policyGUID1. wtData # 41;> = 0;
dacă # 40; driver_info -> pcSignerCertContext # 41;
# 123;
CertFreeCertificateContext # 40; * v5 # 41; ;
driver_info -> pcSignerCertContext = 0;
# 125;
# 125;
dacă # 40; isSigned == 1 # 41;
return este semnat;
# 125;
isSigned = VerifyIsFileSigned # 40; lpFileName. driver_info # 41; ;
# 125;
# 125;
# 125;
return este semnat;
# 125;

Multe mulțumiri tuturor celor care au răspuns!

Dacă WinVerifyTrust returnează TRUST_E_NOSIGNATURE, aceasta nu înseamnă neapărat că nu există nicio semnătură - trebuie să apelați GetLastError () pentru a afla motivul mai precis.

GetLastError () returnează și TRUST_E_NOSIGNATURE.

12d3. a încercat exemplul tău. Și eu nu lucrez. Spre deosebire de experimentele mele, care în WinVerifyTrust transmise fereastra mâner (I dau 0, nu au ferestre) și că, în plus, verificat DRIVER_ACTION_VERIFY (nu știam despre codul), dar încă nu funcționează.
Cu toate acestea, ceva a început să se clarifice:

Vedem că pentru fiecare șofer această funcție WinVerifyTrust este apelată de până la 3 ori, deși pentru majoritatea covârșitoare este suficient un apel, adică până la funcția VerifyIsFileSigned, problema nu ajunge la subiect.


Aceasta înseamnă că CryptCATAdminEnumCatalogFromHash trebuie să declanșeze focalizarea. Aici această funcție la mine nu vrea să funcționeze în nici un fel. Adică, prin fișierul hash (în mod normal, 22 de octeți) în "directorul fișierelor semnate", sau orice se numește corect, nu se găsește nimic. Multumesc din nou! Acum, urgența problemei a scăzut.







Trimiteți-le prietenilor: