ПредишенСледващото

Имаше проблем с тестване на подписването на водача в Windows XP.

По-конкретно, аз съм се интересуват от haspnt.sys, hardlock.sys - това е драйверите защита срещу копиране ключ HASP (ключови емулатори заменят тези файлове са неподписани версии, така че те могат да бъдат проверени).

Изведнъж се сблъскват с трудности при решаването на този проблем.

В Windows 7 шофьори имат електронен подпис. Можете да проверите това с десния бутон върху файла на системата EXE, DLL или SYS и изберете "Properties" паднаха меню - прозорец Properties ще се появи с раздела "Електронен подпис". Научих се как да се провери тези файлове с помощта на WinVerifyTrust функция на wintrust.dll, тя работи добре (ActionID = WINTRUST_ACTION_GENERIC_VERIFY_V2).

Въпреки това, в Windows XP в раздел на файловете на драйвера, като правило, не, съответно, на WinVerifyTrust извежда грешка проверка за всеки такъв файл. Въпреки това, стандартните инструменти на Windows (например Verifier.exe, Process Explorer Марк Русинович) по някакъв начин да видят въпросния файл или не. От това, което означава, че те се използват за това, не мога да разбера!

Може би някой има опит в тази област? Интересува се от Windows XP, но би било интересно да се провери автентичността на dreyverov в по-ранни версии назад към Windows 98.

В verifier.exe се случва следното:
преодолее всички драйвери в системната папка и за всяка функция се нарича IsDriverSigned.
Виждаме, че за всеки водач, тази функция се нарича WinVerifyTrust до 3 пъти, но за по-голямата част от липсващите и един разговор, т.е. да функционира VerifyIsFileSigned не е достигната.

Той използва C синтаксис

BOOL __stdcall VerifyIsFileSigned # 40; LPWSTR lpFileName. структура DRIVER_VER_INFO_ * driver_info # 41;
# 123;
LONG резултат;
GUID policyGUID1 = DRIVER_ACTION_VERIFY;
GUID policyGUID2 = 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. sizeof # 40; структура DRIVER_VER_INFO_ # 41; # 41; ;
driver_info -> cbStruct = 1088;

memset # 40; wtData. 0. sizeof # 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;
резултат = WinVerifyTrust # 40; AfxGetThread # 40; # 41; -> GetMainWnd # 40; # 41; -> m_hWnd. policyGUID1. wtData # 41; ;
ако # 40; резултат # 41;
# 123;
резултат = WinVerifyTrust # 40; AfxGetThread # 40; # 41; -> GetMainWnd # 40; # 41; -> m_hWnd. policyGUID2. wtData # 41; ;
# 125;
ако # 40; driver_info -> pcSignerCertContext # 41;
# 123;
CertFreeCertificateContext # 40; * v5 # 41; ;
driver_info -> pcSignerCertContext = 0;
# 125;
върне резултат == 0;
# 125;

вътр __stdcall IsDriverSigned # 40; LPCWSTR lpFileName # 41;
# 123;
Int isSigned;
GUID policyGUID1 = DRIVER_ACTION_VERIFY;
МАНИПУЛАЦИИ 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; ;
ако # 40; hFile == # 40; МАНИПУЛАЦИИ # 41; - 1 # 41;
# 123;
isSigned = 1;
# 125;
още
# 123;
memset # 40; pbHash. 0. sizeof # 40; pbHash # 41; # 41; ;
pcbHash = 100;
hash_ok = CryptCATAdminCalcHashFromFileHandle # 40; hFile. cbHash. pbHash. 0 # 41; ;
CloseHandle # 40; hFile # 41; ;
ако # 40; hash_ok == 1 # 41;
# 123;
memset # 40; wtCatInfo. 0. sizeof # 40; wtCatInfo # 41; # 41; ;
wtCatInfo. cbStruct = 36;
wtCatInfo. pcwszMemberTag = lpFileName;
wtCatInfo. pbCalculatedFileHash = pbHash;
wtCatInfo. cbCalculatedFileHash = cbHash;

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

memset # 40; wtData. 0. sizeof # 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;

ако # 40; g_hCatAdmin || # 40; CryptCATAdminAcquireContext # 40; g_hCatAdmin. 0 0 # 41. g_hCatAdmin # 41; # 41;
# 123;
за # 40; phPrevCatInfo = 0; ; phPrevCatInfo = hCatInfo # 41;
# 123;
hCatInfo = CryptCATAdminEnumCatalogFromHash # 40; g_hCatAdmin. pbHash. cbHash. 0. phPrevCatInfo # 41; ;
ако # 40. hCatInfo # 41;
прекъсване;
memset # 40; psCatInfo. 0. sizeof # 40; psCatInfo # 41; # 41; ;
psCatInfo. cbStruct = 524;
ако # 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;
ако # 40; driver_info -> pcSignerCertContext # 41;
# 123;
CertFreeCertificateContext # 40; * v5 # 41; ;
driver_info -> pcSignerCertContext = 0;
# 125;
# 125;
ако # 40; isSigned == 1 # 41;
върнете isSigned;
# 125;
isSigned = VerifyIsFileSigned # 40; lpFileName. driver_info # 41; ;
# 125;
# 125;
# 125;
върнете isSigned;
# 125;

Много благодаря на всички отговорили!

Ако WinVerifyTrust връща TRUST_E_NOSIGNATURE, това не означава непременно, че няма подпис - можете да се обадите в GetLastError (), по-точно да се установи причината.

GetLastError () също се завръща TRUST_E_NOSIGNATURE.

12d3. Опитах вашия пример. Аз също не работи. За разлика от моите експерименти, които в WinVerifyTrust предавани дръжка прозорец (давам 0, аз не разполагат с прозорци) и че допълнително проверена DRIVER_ACTION_VERIFY (аз не знаех за кода), но тя все още не работи.
Но нещо осъзнах:

Виждаме, че за всеки водач, тази функция се нарича WinVerifyTrust до 3 пъти, но за по-голямата част от липсващите и един разговор, т.е. да функционира VerifyIsFileSigned не е достигната.


Това означава, че трябва да работи CryptCATAdminEnumCatalogFromHash. Ето функцията не исках да работят. Това означава, че хеш файл (имам подобно, нормално, 22 байта) в "каталога подписан файлове", или каквото и да е правилно нарича, не е нищо друго. Благодаря отново! Сега проблемът е намалял от спешността.

Подкрепете проекта - споделете линка, благодаря!