impl cert hook

This commit is contained in:
Hay1tsme 2024-02-14 14:26:11 -05:00
parent eedd32c8f9
commit fe7d1269ea
3 changed files with 32 additions and 53 deletions

View File

@ -39,6 +39,7 @@ shlwapi_lib = cc.find_library('shlwapi')
dinput8_lib = cc.find_library('dinput8') dinput8_lib = cc.find_library('dinput8')
dxguid_lib = cc.find_library('dxguid') dxguid_lib = cc.find_library('dxguid')
xinput_lib = cc.find_library('xinput') xinput_lib = cc.find_library('xinput')
crypt_lib = cc.find_library('crypt32')
inc = include_directories('.') inc = include_directories('.')
capnhook = subproject('capnhook') capnhook = subproject('capnhook')

View File

@ -16,14 +16,6 @@
static CRITICAL_SECTION cert_lock; static CRITICAL_SECTION cert_lock;
static wchar_t path[MAX_PATH]; static wchar_t path[MAX_PATH];
HCERTSTORE WINAPI hook_CertOpenStore(
LPCSTR lpszStoreProvider,
DWORD dwEncodingType,
HCRYPTPROV_LEGACY hCryptProv,
DWORD dwFlags,
const void *pvPara
);
PCCERT_CONTEXT WINAPI hook_CertFindCertificateInStore( PCCERT_CONTEXT WINAPI hook_CertFindCertificateInStore(
HCERTSTORE hCertStore, HCERTSTORE hCertStore,
DWORD dwCertEncodingType, DWORD dwCertEncodingType,
@ -33,19 +25,6 @@ PCCERT_CONTEXT WINAPI hook_CertFindCertificateInStore(
PCCERT_CONTEXT pPrevCertContext PCCERT_CONTEXT pPrevCertContext
); );
BOOL WINAPI hook_CertCloseStore(
HCERTSTORE hCertStore,
DWORD dwFlags
);
HCERTSTORE (WINAPI *next_CertOpenStore)(
LPCSTR lpszStoreProvider,
DWORD dwEncodingType,
HCRYPTPROV_LEGACY hCryptProv,
DWORD dwFlags,
const void *pvPara
);
PCCERT_CONTEXT (WINAPI *next_CertFindCertificateInStore)( PCCERT_CONTEXT (WINAPI *next_CertFindCertificateInStore)(
HCERTSTORE hCertStore, HCERTSTORE hCertStore,
DWORD dwCertEncodingType, DWORD dwCertEncodingType,
@ -55,24 +34,11 @@ PCCERT_CONTEXT (WINAPI *next_CertFindCertificateInStore)(
PCCERT_CONTEXT pPrevCertContext PCCERT_CONTEXT pPrevCertContext
); );
BOOL (WINAPI *next_CertCloseStore)(
HCERTSTORE hCertStore,
DWORD dwFlags
);
static const struct hook_symbol cert_syms[] = { static const struct hook_symbol cert_syms[] = {
{ {
.name = "CertOpenStore",
.patch = hook_CertOpenStore,
.link = (void **) &next_CertOpenStore,
}, {
.name = "CertFindCertificateInStore", .name = "CertFindCertificateInStore",
.patch = hook_CertFindCertificateInStore, .patch = hook_CertFindCertificateInStore,
.link = (void **) &next_CertFindCertificateInStore, .link = (void **) &next_CertFindCertificateInStore,
}, {
.name = "CertCloseStore",
.patch = hook_CertCloseStore,
.link = (void **) &next_CertCloseStore,
}, },
}; };
@ -107,17 +73,6 @@ void cert_hook_insert_hooks(HMODULE target)
_countof(cert_syms)); _countof(cert_syms));
} }
HCERTSTORE WINAPI hook_CertOpenStore(
LPCSTR lpszStoreProvider,
DWORD dwEncodingType,
HCRYPTPROV_LEGACY hCryptProv,
DWORD dwFlags,
const void *pvPara
)
{
}
PCCERT_CONTEXT WINAPI hook_CertFindCertificateInStore( PCCERT_CONTEXT WINAPI hook_CertFindCertificateInStore(
HCERTSTORE hCertStore, HCERTSTORE hCertStore,
DWORD dwCertEncodingType, DWORD dwCertEncodingType,
@ -127,13 +82,35 @@ PCCERT_CONTEXT WINAPI hook_CertFindCertificateInStore(
PCCERT_CONTEXT pPrevCertContext PCCERT_CONTEXT pPrevCertContext
) )
{ {
uint8_t bfr[4096] = {0};
wchar_t cert_path[MAX_PATH] = {0};
DWORD num_read = 0;
} if (dwFindType == CERT_FIND_ISSUER_STR || dwFindType == CERT_FIND_SUBJECT_STR) {
wcscat_s(cert_path, _countof(cert_path), path);
BOOL WINAPI hook_CertCloseStore( wcscat_s(cert_path, _countof(cert_path), L"/");
HCERTSTORE hCertStore, wcscat_s(cert_path, _countof(cert_path), (wchar_t *)pvFindPara); // use the search string as a name
DWORD dwFlags
) dprintf("Cert: Look for override cert at %S", cert_path);
{
HANDLE f = CreateFileW((LPCWSTR)pvFindPara, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (f != INVALID_HANDLE_VALUE) {
ReadFile(f, bfr, sizeof(bfr), &num_read, NULL);
CloseHandle(f);
if (bfr[0]) {
return CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, bfr, num_read);
}
}
}
return next_CertFindCertificateInStore(
hCertStore,
dwCertEncodingType,
dwFindFlags,
dwFindType,
pvFindPara,
pPrevCertContext
);
} }

View File

@ -6,6 +6,7 @@ platform_lib = static_library(
dependencies : [ dependencies : [
capnhook.get_variable('hook_dep'), capnhook.get_variable('hook_dep'),
shlwapi_lib, shlwapi_lib,
crypt_lib
], ],
sources : [ sources : [
'cert.c', 'cert.c',