From 4d2f4c5b2d1ee1751bd4b2cb3990f03d7937e0b1 Mon Sep 17 00:00:00 2001 From: Hay1tsme Date: Thu, 6 Feb 2025 02:43:11 -0500 Subject: [PATCH] redo cert stuff, build out winusb hook --- .rnd | Bin 0 -> 1024 bytes .vscode/settings.json | 7 +- Package.mk | 7 +- board/guid.h | 2 +- board/j9100647a.c | 45 ++++++-- doc/config/common.md | 21 +--- hooklib/dns.c | 6 +- hooklib/winusb.c | 233 +++++++++++++++++++++++++++++++++++++++++- hooklib/winusb.h | 7 +- initpki | 15 +-- ll3hook/dllmain.c | 7 +- pki/PREMIUM.cer | 18 ---- pki/PREMIUM.csr | 16 --- pki/PREMIUM.key | 28 ----- pki/ca.cer | 32 +++--- pki/ca.key | 52 +++++----- pki/cert.p12 | Bin 3202 -> 0 bytes pki/client.cer | 18 ++++ pki/client.key | 28 +++++ pki/client.p12 | Bin 0 -> 2341 bytes pki/nesys.cer | 26 ++--- pki/nesys.csr | 16 --- pki/nesys.key | 52 +++++----- pki/nesys.srl | 1 - pki/server.cer | 18 ---- pki/server.csr | 16 --- pki/server.key | 28 ----- platform/cert.c | 176 +++++++++++++++++-------------- platform/config.c | 2 +- 29 files changed, 529 insertions(+), 348 deletions(-) create mode 100644 .rnd delete mode 100644 pki/PREMIUM.cer delete mode 100644 pki/PREMIUM.csr delete mode 100644 pki/PREMIUM.key delete mode 100644 pki/cert.p12 create mode 100644 pki/client.cer create mode 100644 pki/client.key create mode 100644 pki/client.p12 delete mode 100644 pki/nesys.csr delete mode 100644 pki/nesys.srl delete mode 100644 pki/server.cer delete mode 100644 pki/server.csr delete mode 100644 pki/server.key diff --git a/.rnd b/.rnd new file mode 100644 index 0000000000000000000000000000000000000000..1fe293eafd981596a31c5c5c69deb4953c6eb762 GIT binary patch literal 1024 zcmV+b1poUr+|naeKYPXGv&E(oY?Ti1r88`vj-JWDR*EN|8?15@^L5b+ZK_N-`$iWn zsa~``)^NUs2{px8TI-!O5(s%8ico}43vfLhODm^`TPbj7UCPZsT_G}tF5D*DAl;SI`Kz@jMX zb4gUGfup8eOf^^@l3k0KV_(wB|8?%DX!Y?AUKx1G*a$@!jz~bN62L+4C(P@ZDIAB0 zFbNp5>@Gr%l|5BGDfc=Az?z`yrPnx`{?w`F5o?!HIAt))H@E19h9q zKc5qJ%PX$f=txGFe9Ao)OT&||+Mu2=6VL}yJ& zzZI#o*hFLlP3hr`&s+>*L2Q&3zfZ>^We8lC_+kt)v;w&5$iHB14l zO-?Lh)NYdPe4jD0jre`00S}T!)jLH+KcNrgd<0Es1ub0?uJwZ=aZ&h8U~or26TA~z zLSR&QEQ)kLV)@pY&l<3ORo>&;YEUDNqR(Z^{fe??&4>9JR!YKZFD@K9`N$A#!Cp&E z$CdSUt4&W@30fsg$f*>(O>e8!pdk~DR-Ro5xk>S-n}XjXas&bHn3oP|DGhqmbY zM0KdS0MaAj{#=+2V8KV0oeW(w*M?ZIcI^`MLnA@NhymGbPj~T@eMjldvFb^1{ urf5;5CW<*1jSTs6JydjdO5mLBf9_CBEe*N1XzF31%FP!uV7i9 #include "hook/table.h" +#include "hook/iohook.h" +#include "board/guid.h" +#include "hooklib/setupapi.h" #include "hooklib/winusb.h" #include "util/dprintf.h" @@ -16,6 +19,7 @@ static struct winusb_dev *winusb_classes; static size_t winusb_nclasses; static void winusb_hook_init(); +static HRESULT winusb_handle_irp(struct irp *irp); BOOL my_WinUsb_QueryPipe( WINUSB_INTERFACE_HANDLE InterfaceHandle, @@ -169,7 +173,7 @@ static const struct hook_symbol winusb_syms[] = { HRESULT winusb_add_phantom_dev(const struct winusb_dev *dev) { - struct winusb_dev *class_; + //struct winusb_dev *class_; struct winusb_dev *new_array; HRESULT hr; @@ -191,10 +195,14 @@ HRESULT winusb_add_phantom_dev(const struct winusb_dev *dev) winusb_classes = new_array; - // TODO: Copy the dev class to the new slot in the array - class_ = &winusb_classes[winusb_nclasses++]; + memcpy_s(&winusb_classes[winusb_nclasses++], sizeof(struct winusb_dev), dev, sizeof(*dev)); hr = S_OK; + setupapi_add_phantom_dev(&usbio_guid, dev->path); + iohook_push_handler(winusb_handle_irp); + + dprintf("WinUSB: Init\n"); + end: LeaveCriticalSection(&winusb_lock); @@ -217,7 +225,224 @@ void winusb_hook_insert_hooks(HMODULE target) { hook_table_apply( target, - "winusb.dll", + "WINUSB.dll", winusb_syms, _countof(winusb_syms)); } + +static HRESULT winusb_handle_irp(struct irp *irp) +{ + bool found = false; + if (irp->op != IRP_OP_OPEN && irp->op != IRP_OP_CLOSE) { + return iohook_invoke_next(irp); + } + + if (irp->open_filename == NULL || irp->open_filename[0] == L'\0') { + return iohook_invoke_next(irp); + } + + for (int i = 0; i < winusb_nclasses; i++) { + if (!wcscmp(irp->open_filename, winusb_classes[i].path)) { + dprintf("WinUSB: Open/close %ls\n", winusb_classes[i].path); + irp->fd = winusb_classes[i].fd; + found = true; + break; + } + } + + if (!found) { + return iohook_invoke_next(irp); + } + + return S_OK; +} + +// FIXME +int get_winusb_fake_dev_idx(WINUSB_INTERFACE_HANDLE InterfaceHandle) +{ + for (int i = 0; i < winusb_nclasses; i++) { + if (winusb_classes[i].fd == InterfaceHandle) { + return i; + } + } + return -1; +} + +BOOL my_WinUsb_QueryPipe(WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR AlternateInterfaceNumber, UCHAR PipeIndex, PWINUSB_PIPE_INFORMATION PipeInformation) +{ + dprintf("WinUSB: my_WinUsb_QueryPipe\n"); + UCHAR this_pipeid = 0; + + int idx = 0; + /*int idx = get_winusb_fake_dev_idx(InterfaceHandle); + if (idx == -1) { + return next_WinUsb_QueryPipe(InterfaceHandle, AlternateInterfaceNumber, PipeIndex, PipeInformation); + }*/ + + switch (PipeIndex) { + case 0: this_pipeid = 0x02; break; + case 1: this_pipeid = 0x81; break; + } + + if (!this_pipeid) { + return false; + } + + //PipeInformation = (PWINUSB_PIPE_INFORMATION)malloc(sizeof(WINUSB_PIPE_INFORMATION)); + + PipeInformation->PipeType = UsbdPipeTypeBulk; + PipeInformation->PipeId = this_pipeid; + PipeInformation->Interval = 0xff; // never checked? + PipeInformation->MaximumPacketSize = 128; // never checked? + + return true; +} + +BOOL my_WinUsb_QueryInterfaceSettings(WINUSB_INTERFACE_HANDLE InterfaceHandle, UCHAR AlternateInterfaceNumber, PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor) +{ + dprintf("WinUSB: my_WinUsb_QueryInterfaceSettings\n"); + int idx = 0; + /*int idx = get_winusb_fake_dev_idx(InterfaceHandle); + if (idx == -1) { + return next_WinUsb_QueryInterfaceSettings(InterfaceHandle, AlternateInterfaceNumber, UsbAltInterfaceDescriptor); + }*/ + + UsbAltInterfaceDescriptor->bNumEndpoints = 2; // nothing else is checked + return true; +} + +BOOL my_WinUsb_GetDescriptor( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR DescriptorType, + UCHAR Index, + USHORT LanguageID, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred +) +{ + int idx = 0; + /*int idx = get_winusb_fake_dev_idx(InterfaceHandle); + if (idx == -1) { + return next_WinUsb_GetDescriptor( + InterfaceHandle, + DescriptorType, + Index, + LanguageID, + Buffer, + BufferLength, + LengthTransferred + ); + }*/ + + dprintf("WinUSB: my_WinUsb_GetDescriptor %d\n", idx); + + if (BufferLength < winusb_classes[idx].descriptor.bLength) { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return false; + } + + // Surly this won't explode + memcpy_s(Buffer, BufferLength, &winusb_classes[idx].descriptor, winusb_classes[(uintptr_t)InterfaceHandle].descriptor.bLength); + + *LengthTransferred = winusb_classes[idx].descriptor.bLength; + + return true; +} + +BOOL my_WinUsb_WritePipe( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred, + LPOVERLAPPED Overlapped +) +{ + int idx = 0; + /*int idx = get_winusb_fake_dev_idx(InterfaceHandle); + if (idx == -1) { + return next_WinUsb_WritePipe( + InterfaceHandle, + PipeID, + Buffer, + BufferLength, + LengthTransferred, + Overlapped + ); + }*/ +#if 1 + dprintf("WritePipe %d\t", (int)BufferLength); + for (int i = 0; i < BufferLength; i++) { + dprintf("%02X", (char)Buffer[i]); + } + dprintf("\n"); +#endif + winusb_classes[idx].write_pipe(NULL, Buffer, BufferLength, (uint32_t *)LengthTransferred); + return true; +} + +BOOL my_WinUsb_QueryDeviceInformation( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + ULONG InformationType, + PULONG BufferLength, + PVOID Buffer +) +{ + //dprintf("WinUSB: my_WinUsb_QueryDeviceInformation\n"); + memset(Buffer, 0x03, 1); + return true; +} + +BOOL my_WinUsb_ReadPipe( + WINUSB_INTERFACE_HANDLE InterfaceHandle, + UCHAR PipeID, + PUCHAR Buffer, + ULONG BufferLength, + PULONG LengthTransferred, + LPOVERLAPPED Overlapped +) +{ + int idx = 0; + /*int idx = get_winusb_fake_dev_idx(InterfaceHandle); + if (idx == -1) { + return next_WinUsb_WritePipe( + InterfaceHandle, + PipeID, + Buffer, + BufferLength, + LengthTransferred, + Overlapped + ); + }*/ +#if 1 + dprintf("ReadPipe %d\n", (int)BufferLength); +#endif + winusb_classes[idx].read_pipe(NULL, Buffer, BufferLength, (uint32_t *)LengthTransferred); + return true; +} + +BOOL my_WinUsb_Initialize(HANDLE DeviceHandle, PWINUSB_INTERFACE_HANDLE InterfaceHandle) +{ + dprintf("WinUSB: my_WinUsb_Initialize\n"); + for (int i = 0; i < winusb_nclasses; i++) { + if (winusb_classes[i].fd == DeviceHandle) { + dprintf("WinUSB: Init %ls\n", winusb_classes[i].path); + InterfaceHandle = winusb_classes[i].fd; + return true; + } + } + + return next_WinUsb_Initialize(DeviceHandle, InterfaceHandle); +} + +BOOL my_WinUsb_Free(WINUSB_INTERFACE_HANDLE InterfaceHandle) +{ + if (get_winusb_fake_dev_idx(InterfaceHandle) == -1) { + return next_WinUsb_Free(InterfaceHandle); + } + + InterfaceHandle = NULL; + return true; + +} diff --git a/hooklib/winusb.h b/hooklib/winusb.h index 619af13..b01ba52 100644 --- a/hooklib/winusb.h +++ b/hooklib/winusb.h @@ -9,15 +9,16 @@ // usio - providor for winusb, passes along read/write // ll3io - gives usio the data to write +typedef void (*winusb_pipe_op_t) (void *ctx, uint8_t *bfr, uint32_t bfr_len, uint32_t *len_tx); + struct winusb_dev { HANDLE fd; - GUID class_guid; const wchar_t *path; //uint8_t read_pipe_id; // duno if this ever needs to change? //uint8_t write_pipe_id; struct _USB_DEVICE_DESCRIPTOR descriptor; - void (*read_pipe)(void *ctx, uint8_t pipe_id, uint8_t *bfr, uint32_t bfr_len); - void (*write_pipe)(void *ctx, uint8_t pipe_id, uint8_t *bfr, uint32_t bfr_len); + winusb_pipe_op_t read_pipe; + winusb_pipe_op_t write_pipe; }; #pragma pack(pop) diff --git a/initpki b/initpki index 59f3116..1c738dd 100644 --- a/initpki +++ b/initpki @@ -7,19 +7,20 @@ openssl req -newkey rsa:2048 -nodes -keyout pki/ca.key -x509 -days 3650 -out pki # -addext "subjectAltName = DNS:cert.nesys.jp,DNS:cert3.nesys.jp,DNS:data.nesys.jp,DNS:proxy.nesys.jp,DNS:nesys.taito.co.jp,DNS:fjm170920zero.nesica.net" # Generate Nesys CSR and key -openssl req -newkey rsa:2048 -nodes -keyout pki/nesys.key -out pki/nesys.csr -subj "/C=JP/ST=A/L=A/CN=nesys" -# -addext "subjectAltName = DNS:cert.nesys.jp,DNS:cert3.nesys.jp,DNS:data.nesys.jp,DNS:proxy.nesys.jp,DNS:nesys.taito.co.jp,DNS:fjm170920zero.nesica.net" -days 3650 +openssl req -newkey rsa:2048 -nodes -keyout pki/nesys.key -out pki/nesys.csr -subj "/C=JP/ST=A/L=A/CN=nesys" +#-addext "subjectAltName = DNS:cert.nesys.jp,DNS:cert3.nesys.jp,DNS:data.nesys.jp,DNS:proxy.nesys.jp,DNS:nesys.taito.co.jp,DNS:fjm170920zero.nesica.net" # Generate Nesys cert openssl x509 -req -sha256 -days 3650 -in pki/nesys.csr -CA pki/ca.cer -CAkey pki/ca.key -out pki/nesys.cer -set_serial 0 # Generate client CSR and key -openssl req -newkey rsa:2048 -nodes -keyout pki/PREMIUM.key -out pki/PREMIUM.csr -subj "/C=JP/ST=A/L=A/CN=PREMIUM" +openssl req -newkey rsa:2048 -nodes -keyout pki/client.key -out pki/client.csr -subj "/C=JP/ST=A/L=A/CN=PREMIUM" #-addext "subjectAltName = DNS:cert.nesys.jp,DNS:cert3.nesys.jp,DNS:data.nesys.jp,DNS:proxy.nesys.jp,DNS:nesys.taito.co.jp,DNS:fjm170920zero.nesica.net" # Generate client cert -openssl x509 -req -sha256 -days 3650 -in pki/PREMIUM.csr -CA pki/nesys.cer -CAkey pki/nesys.key -out pki/PREMIUM.cer -set_serial 0 +openssl x509 -req -sha256 -days 3650 -in pki/client.csr -CA pki/nesys.cer -CAkey pki/nesys.key -out pki/client.cer -set_serial 0 -# Generate server cert and key -openssl req -newkey rsa:2048 -nodes -keyout pki/server.key -out pki/server.csr -subj "/C=JP/ST=A/L=A/CN=*.nesys.jp" -openssl x509 -req -sha256 -days 3650 -in pki/server.csr -CA pki/nesys.cer -CAkey pki/nesys.key -out pki/server.cer -set_serial 0 +# Package as a p12 file for Theatrhythm +openssl pkcs12 -export -out pki/client.p12 -inkey pki/client.key -in pki/client.cer + +rm pki/*.csr \ No newline at end of file diff --git a/ll3hook/dllmain.c b/ll3hook/dllmain.c index b6516f5..e92973f 100644 --- a/ll3hook/dllmain.c +++ b/ll3hook/dllmain.c @@ -1,7 +1,7 @@ #include #include -#include "board/io4.h" +#include "board/j9100647a.h" #include "hook/process.h" @@ -40,6 +40,11 @@ static DWORD CALLBACK ll3_pre_startup(void) gfx_hook_init(&ll3_hook_cfg.gfx); gfx_d3d11_hook_init(&ll3_hook_cfg.gfx, ll3_hook_mod); + hr = usbio_hook_init(); + if (FAILED(hr)) { + goto fail; + } + /* Initialize emulation hooks */ hr = platform_hook_init( diff --git a/pki/PREMIUM.cer b/pki/PREMIUM.cer deleted file mode 100644 index ec60d95..0000000 --- a/pki/PREMIUM.cer +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC4DCCAcgCAQAwDQYJKoZIhvcNAQELBQAwNTELMAkGA1UEBhMCSlAxCjAIBgNV -BAgMAUExCjAIBgNVBAcMAUExDjAMBgNVBAMMBW5lc3lzMB4XDTI0MDIyMTAwNDcw -N1oXDTM0MDIxODAwNDcwN1owNzELMAkGA1UEBhMCSlAxCjAIBgNVBAgMAUExCjAI -BgNVBAcMAUExEDAOBgNVBAMMB1BSRU1JVU0wggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQC8r+G6iwuoHnz1FaBMJKDgV7ZnITlzmlN/3dFI+pvlpWa9ttdG -o5/teD/55IKIVlbwGd4pIzKy6HHEejWP3dJRmaPAg14hD397r2KKdVebBEPH/DtS -hlPVHtdLNFHoqBQXxutBtSL7j4AukTcxx/H0aIQ+9T342IFhJ//VRUN8rFjjyjMC -rSxHL4VPSYKqKFtTJAY4vfHSNRKBVNQJKJXA7DVJFnQTvALpSK3vTA7qGqKUx7Vl -7g3lHyoTKUfKzCNo8ARZsJspmlmFOKdR2vIh/Z/tzI/Ugp3nvSjbKndM7EK3u9IB -I83GIM+ouf9vBY0Zgr/uZjscURWlkXDE0ifvAgMBAAEwDQYJKoZIhvcNAQELBQAD -ggEBADdY4wDumvnbpdjUI66fWKeLtgZV7W3KdzryxstnYkHyffQ1fNHJlP7C3Y60 -sIF7ggweuRDdEq6ADgdzWQ1Qd/ngYQgNqBgGOmrPKQajFnf3AjeJvQbiW/AmkX7c -o3GoqXV62caD5JHqV/jS8qPmmBHvymVrT8AWecRU/d/k0e+bamdenMAqPON7A+NN -QHIeKC+zaE/rrauODAND2LfiVjLCJ9cBIm/8wIrSP8bc/+SuFI5chRm4W7b2E6iz -Yll1Jx6eKQxUQIjX/gNbDIHCbKVnm9HLRBJwCs3DfcME2if6SMVgWRMFJDKBgy+Y -EXE5ZLdXTjg2hg9/uQIaRA+73Dw= ------END CERTIFICATE----- diff --git a/pki/PREMIUM.csr b/pki/PREMIUM.csr deleted file mode 100644 index e9dade0..0000000 --- a/pki/PREMIUM.csr +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIICfDCCAWQCAQAwNzELMAkGA1UEBhMCSlAxCjAIBgNVBAgMAUExCjAIBgNVBAcM -AUExEDAOBgNVBAMMB1BSRU1JVU0wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC8r+G6iwuoHnz1FaBMJKDgV7ZnITlzmlN/3dFI+pvlpWa9ttdGo5/teD/5 -5IKIVlbwGd4pIzKy6HHEejWP3dJRmaPAg14hD397r2KKdVebBEPH/DtShlPVHtdL -NFHoqBQXxutBtSL7j4AukTcxx/H0aIQ+9T342IFhJ//VRUN8rFjjyjMCrSxHL4VP -SYKqKFtTJAY4vfHSNRKBVNQJKJXA7DVJFnQTvALpSK3vTA7qGqKUx7Vl7g3lHyoT -KUfKzCNo8ARZsJspmlmFOKdR2vIh/Z/tzI/Ugp3nvSjbKndM7EK3u9IBI83GIM+o -uf9vBY0Zgr/uZjscURWlkXDE0ifvAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEA -EmY4+uARSH5nPSHBBCRnwtGLs/0sU/dZDl6lC4aUz36aL+qPyQMuOhZ/P2muvb0r -9+IvqXhfvh7VpwNsJYWTj3K3fD6tCL789MDbp5gJcflTSqFxrFwV4rjibIa5fpBk -q6NCT7uQOJdEZwPJohaIBZXGLELktJCU5Z0Odhg+cm5BcxNqm7i8gcC3LL9CypnI -R9Heluo2LTKGwrLHr8QjexUM8vcKNSGRsVE/ujTiTjm62UaIdEbFipwc6reZY37O -FbjvXDQFuYZ+yTaX4cih9JHDMwh7g1GzMDT5+M+k+qtVttEhxsrSAnp/kq+CfGV/ -5wBFbKlQfM4bHEuNmTXFow== ------END CERTIFICATE REQUEST----- diff --git a/pki/PREMIUM.key b/pki/PREMIUM.key deleted file mode 100644 index 573d6c8..0000000 --- a/pki/PREMIUM.key +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC8r+G6iwuoHnz1 -FaBMJKDgV7ZnITlzmlN/3dFI+pvlpWa9ttdGo5/teD/55IKIVlbwGd4pIzKy6HHE -ejWP3dJRmaPAg14hD397r2KKdVebBEPH/DtShlPVHtdLNFHoqBQXxutBtSL7j4Au -kTcxx/H0aIQ+9T342IFhJ//VRUN8rFjjyjMCrSxHL4VPSYKqKFtTJAY4vfHSNRKB -VNQJKJXA7DVJFnQTvALpSK3vTA7qGqKUx7Vl7g3lHyoTKUfKzCNo8ARZsJspmlmF -OKdR2vIh/Z/tzI/Ugp3nvSjbKndM7EK3u9IBI83GIM+ouf9vBY0Zgr/uZjscURWl -kXDE0ifvAgMBAAECggEAbM5/vLKx5iCuriXqaf41RylNZesi1icIP5QKO6tIewUG -WiA1w+ZXMvlE6zV6kGQ5fftswQwrEEA6WrKecHfZ8HRImZsnjKkDOq/Ig09nVV0A -OTKagtwzO5KtVBC3qxJBg/SRdTKfGbGGmVPkIDDMtcQPfr6tHfK7qOsH/FQUtq8s -/sr0EDdBqGKeOi0MtmXOY32BejCqrEhiUEMI8YpBfndvDMWrYv0QIgdjLqw0Daz0 -WW3/LchZJz/NQrGcpeOskQxXsPOqOlDxBKHnhREnkKzUcfaGeK8evAdk1VWrPlKD -d4qmxbzLe1GwyF+ClozLZK9n3NtVBrPdEx2v8FCkAQKBgQD16aIBr7H+mav6gG+x -FLWaVnJ7o6PpUdorkTyZx+8VT+0yVBk5JgT4XcL4jVIa4pvwm+cxzgR4ul9m3bPt -TMdjCmCwn5ctVv9tyVJFjHVfOX1rpILLB3tpFa1NUulLZDdGWUjYMTdasHmPIc5n -vCByw9E0EjElPGs7G5v9Ac/pHwKBgQDEbVBiIQxmCgsxTjuIgq5U+ZQHD+KCIKHm -/Nj6Yujz6xU/MHWWj8xfFvW9r+hgdBZq1HHMBYt1oV4UQx9NU79C8EY3yFQ0gHvY -urAbtWffaf0GxhIcfOU7dvqb00rsC2eWo0jvS+Opi89FjYeW5ioFaCdhuYDVDEZJ -6LiFOZNXMQKBgQC7gi5aAtJCRILyO8Tuzc+7o3cf96MgYZ1t4wzGZcFUCuHeommp -PehESZpFU9zrSyeEzBv5yhF2zQW5tgtgQk82oc8gXlAz7kZOPFhTV8qXlYqg7Ywd -q9LaSgEfGL1zEzNinOoCj2SZ7j6CeVCdoMFNQSrf/Y8jyXIqW98RiLQ0GQKBgQC7 -xvCwTn2m0nUutmYtMxhrPYgoVCQqV/3ObusSOhoOjC5skOvoeiFayf00UASqqG+B -wwPikW5njlL8tconxyaxXDcUPptY8XbzkkymwH3DU3RC1Hkd6LvPZAdhjdUy4Bgw -Jnqj4H2MaI5GJG15cSC8uHvlbUve33QWVbaIDalwEQKBgBDw8c9aJe7zKMM6oX8X -WoGvf6t/qYXLoniC06A/VDEFShfR1n7lEavO/SibqN+k5T4E8Hayv0witjtIfF+6 -4EOzMdGHDdvnpmtRgLCQXzTnK4FLV4Kig0qeLjKyknxrVp/ZiD7qgREG3uhrahu/ -q6p2INBRts2uQQtVrBmOIJ87 ------END PRIVATE KEY----- diff --git a/pki/ca.cer b/pki/ca.cer index 38a1fae..9c2dd03 100644 --- a/pki/ca.cer +++ b/pki/ca.cer @@ -1,21 +1,21 @@ -----BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIJANXp0K4mLJbJMA0GCSqGSIb3DQEBCwUAMEcxCzAJBgNV +MIIDYTCCAkmgAwIBAgIJALbvDPgrR0wxMA0GCSqGSIb3DQEBCwUAMEcxCzAJBgNV BAYTAkpQMQowCAYDVQQIDAFBMQowCAYDVQQHDAFBMSAwHgYDVQQDDBdUYWl0byBB -cmNhZGUgTWFjaGluZSBDQTAeFw0yNDAyMjEwMDM3MjRaFw0zNDAyMTgwMDM3MjRa +cmNhZGUgTWFjaGluZSBDQTAeFw0yNTAyMDUyMzUwMDJaFw0zNTAyMDMyMzUwMDJa MEcxCzAJBgNVBAYTAkpQMQowCAYDVQQIDAFBMQowCAYDVQQHDAFBMSAwHgYDVQQD DBdUYWl0byBBcmNhZGUgTWFjaGluZSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAMeFW/ELRe8zoq9UKqs38o+NBeCfF85vGiB0ofpY83juq/ScKZ93 -y3/0KDkKywIxZM9OOL8rRZ+n+hRtKE3dh0NOULyWZaaXnhc8dFegj2f/CfW67RtA -UMKkFoWgWy4s850aB7/1koCI9dCMJ9Kxo9WAHIEH/DHN05m2WVmUR2rpxgy1qX1N -ZEfnWWcybFO05GBoWlnMuTewAoDUna+hrMR9yVZEVPo+5zXELT1Q+fdJaeCMes7u -EvA309jlbN/jyauhE6oKtxOLmfUW/ug+o0i3WhHOnA7q/2awx6QBxeeJJ+jqHZ03 -Wo56M0YSpYK6qUAgvbDyG7cdC492VevlBQkCAwEAAaNQME4wHQYDVR0OBBYEFICi -OTELnKwR7eleqpDecLGpDXq0MB8GA1UdIwQYMBaAFICiOTELnKwR7eleqpDecLGp -DXq0MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAAiMFrLniD8lFKhI -aFIdvOgU87qpfpe/FzTiHQZds751ktAl25n8QFon33SEsC8YUJjxN97Ng5xN4FM7 -0Sj0FBfC+SjrcfvUH7fMuatFHE2Z4bNkjXv+13k5vZDxRA8DUV17D3dSo6QSAcYs -DgFednjyVb8ihJrKbhdRb/j3JQh8MVYoJ0YX43u//XJAvJJI4XNp6++HE748eGNa -RZnaOCpcXxpGtuuoAgwmiIN/uMPTLAIzGecmagw2o0jlS67PuFzyMlCfvIC9dmYQ -9Ep92SU8Ode73sPlT/CaKd6ajIL3JUxp2LBMRWBYcZXee7zwE1VphmOonHrIJkn3 -y+IxMMg= +ADCCAQoCggEBANHF3SFgIV+Gz+zv/KOdkLHvWBjr1dTZC3jOyeiP6eBZGbqnOWH5 +L9MSUUva9BTWbxgOU1p5fihWLQHUrgHv8jM1QAeSrCiz7flAmSCNK3nN3KA0JiL/ +kK1g2+DfyS1aFqTbeKQpQ1rR61kqGFKtbFQBmWPLzPdNvdC72XBxKpyIieCX8j/G +5zc6vTrNV6m74AFCVQLK56Q7s2aMC8cJnW7zjmItgd/wtty/Tw90ksAfgJvXv+te +zR4WezxSlMeK22fHrUgpPK3O04NsBOhOpYRn1EJRLplDUOOWty1ESTe4tbA0o8hb +eR+ZhuzjX5+yPdULzW7MsVapvxdEXB47w2ECAwEAAaNQME4wHQYDVR0OBBYEFMbn +TayEU9K2mel1yhpgjhAZnIeMMB8GA1UdIwQYMBaAFMbnTayEU9K2mel1yhpgjhAZ +nIeMMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAGRb8Yl6FeV85bWx +X9k2XOaQQJa55WyVSLy6MQH9HihIge313JJxRvpGCRjAgnBYI4uawyzj1rs+Q7Xk +v+YH6lMHMkM550lwGN9McujBGHATT37gYFNv9jDbeG4DKwUVwJPdIA1iANnxtqdP +BmGhpoIDwK3pTbQ72LLMjc5GtXBRsMhH9uJH6HEKrnT7OCwfKb6WdLKhKNSBccwg +X/CreLdx2x5fPjnFuE3jAAMV6LwJ/rJWl/P88HSrHv0y+jGmokupbMgX2kbTmW8g +q2ZUamblmBhP2ch7PuyX+qM4/JTuPAdTjkX97SYnRFY1+7lVTqFHrHa2Hh5T6kq8 +nozJRpc= -----END CERTIFICATE----- diff --git a/pki/ca.key b/pki/ca.key index f3f6ac4..76013e4 100644 --- a/pki/ca.key +++ b/pki/ca.key @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHhVvxC0XvM6Kv -VCqrN/KPjQXgnxfObxogdKH6WPN47qv0nCmfd8t/9Cg5CssCMWTPTji/K0Wfp/oU -bShN3YdDTlC8lmWml54XPHRXoI9n/wn1uu0bQFDCpBaFoFsuLPOdGge/9ZKAiPXQ -jCfSsaPVgByBB/wxzdOZtllZlEdq6cYMtal9TWRH51lnMmxTtORgaFpZzLk3sAKA -1J2voazEfclWRFT6Puc1xC09UPn3SWngjHrO7hLwN9PY5Wzf48mroROqCrcTi5n1 -Fv7oPqNIt1oRzpwO6v9msMekAcXniSfo6h2dN1qOejNGEqWCuqlAIL2w8hu3HQuP -dlXr5QUJAgMBAAECggEAe18O9wGNgNdg5SEaMT0rE3CUDczSH6e7dA4qim6uPjz2 -vw5A/oZIoxoKNRtjZDu+piEsHalYJ9zqWe8VWPB+TzQB4FrvCBAAhUWweu6hPiEJ -u5SWQJ+IUJK+CmqZdvf8u0v5Ns1WhXwq44WGqlWFhOLuvSp+2xz2lrmWjjmN36EM -aIrZKwVyt2FpF3lhCXbkfhrKMNiRKN9hJ1EnQXHxxNfaMVsGz+I8RZuLPKEh1D+o -EUY70BC3KBu4h7pVnskRB6pKVrlo1IcAoRmwAUKE4UkwTNawwYzeMV1a8OAHwgip -sF+GSpC/dY9rjc/EkTWpRQIRnFSMxVyuY6AevjsiAQKBgQD/d3LYeiLDmIyQnv+h -qwkMTn5QXZE7liH6EOy+QpAHyfmNidXW7+OY782bq2MLBFwkxHcDiQP0BaReK/IA -Xul1gsLDGH5Sq8GzUjWptyo8BbzqefNx37RmXUp0Z4GSPjVEyrN0BhcBtR44URDR -n514dAmr3W1dwrPuBAf7BHN+0QKBgQDH8AGv/9CB7WoYJXNZw68qy1et4dWLA7is -l7cP5prpFgyquMO/sjY8NPvLQg1G02G7kJWmCA2Ak2E/BbPjnVz64TW7k4VeyJHl -xsXVSWxM9TZqGNXZJTJNvw+tBzcLSzkt+8OlgkKf0KYJYLuqfYs/IhWpzdHBQL0v -1mNmDuBguQKBgQCHrvGYeIYuTL+bsFcljqnnl2kPViLk+wBgyMx04PWOrX+V5Tdm -SVMgz3zsyUJ5f39RJ+fuQL+Qw85hFgYanE5y01iONlwhnIfsriVCVr5f0sxb3Rmn -yaEPHU2GNdNj0RaJyv81CGb/ySqbzrKYI6aHa1oXpiuIOPlH2WxDrkGJgQKBgBl6 -FMz3fPtBZHaFNyimDckXNin7D/nx1HNxtar6CJ1Q6PZMKu1faRfM7JTe6tAumVKM -PvV0KzxKC2c7c8u6PqHdVrp7NtB4IFc2N/lQrNM1n+RvG7jay4kqonW66KGwyS15 -2llZuuGgdbfWMrOr4bV+w2HqzyKf/Dt/RxU3KhJJAoGBAJTISS+1XD/GuO5EXnMJ -xkfhaG3Ju+D7zJJwDa96OQ4+X+aon99HDyyiz1SHbotzhzrCscoHCg6UL+cFHq8Q -E5hnGrMUxqs/Z+vE7LXNydg8yOyvxIbkThsRDcBMhR+Rb6FF6DG+iaZ2SPaC5iCs -RVI7MDPkI6tophsf9b4pKfF+ +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDRxd0hYCFfhs/s +7/yjnZCx71gY69XU2Qt4zsnoj+ngWRm6pzlh+S/TElFL2vQU1m8YDlNaeX4oVi0B +1K4B7/IzNUAHkqwos+35QJkgjSt5zdygNCYi/5CtYNvg38ktWhak23ikKUNa0etZ +KhhSrWxUAZljy8z3Tb3Qu9lwcSqciIngl/I/xuc3Or06zVepu+ABQlUCyuekO7Nm +jAvHCZ1u845iLYHf8Lbcv08PdJLAH4Cb17/rXs0eFns8UpTHittnx61IKTytztOD +bAToTqWEZ9RCUS6ZQ1DjlrctREk3uLWwNKPIW3kfmYbs41+fsj3VC81uzLFWqb8X +RFweO8NhAgMBAAECggEAXBdUK8nK/OfvMiJtM9sBYcwkTdSC7E1YpvGJXEqJrw8O +p42wOF2v7Ca3f+igjOFSpinr1+VMSCME4S/gMEOJfYecE3cFk1ziVTFRyCOReYix +mbcrIuQ1PJgwDznPVNSe6kLbZJ4kzqMngd5kDS/LRdnp4BDha5Q6h39gRue3gD34 +0ctkujwXfvDtza9TWW+KdGaJLHThKMO/yptucE7ji20wvgan45lX2efjuGaH5CRW +ofWdVzN5JIemCcWuYXnVtZyI6hn3+uX97V2PZmvxhrA8eHjnaJBkfvh6pVMAm0Pk +mGuSwW6uG1FTC9SBBTdCy41gCwDlds7NGa7Ee+lwPQKBgQD6Gkfv/0iwSMCYsTmV +9qvS4mx21NOlo2SoiEBF0HZt6c8r1OVR0jYb0DDScAlBJKBIWM5D5Hq9dSpO6Zxn +TatZx7eh39DfDNMX7cGBgVhiqdc5P/SVz43cXw8sIGpwZ+GyT3RrcbDrmv4+EoQI +gV2g5U5xXnFkotY4Uy2wCXDGQwKBgQDWuCLo7E2d7sjmXNi28/bvAHMIzOGGF8C2 +ely9t5oZvobWkapCs4U9wwSnT+ENcaOxreOc0S9jJfmKovR2EnyvaNu2LafwP6+D +7Oe2+7IBl2EbfOQBXnuMI2RR6zqn+B2y7gCxO8p0qE0InjoaqPuyXTnoCp45noN5 +Km7LhSofiwKBgQCEL4vB7v0uHuWcTl8PQbaC2SVWkRnju74hzRGbVJijcyYKFpW1 +bxMmFB0ZvBlIEuGcG0O5YnL0244m8xW1C7n607Hcnny4xwBy7ziNCB3816NnIMRW +wcJKrPtJ6UAYdO823QO9HfPSMrMZf5PFIwqnVUrmZHIuLFponp3RIsw2HQKBgDg6 +XBn215SGFWIN6kputLl9uqIRVPWSfsrKXELqM5aOSC0kVBvHexrjWPKffmXQ3ncG +/FXyiaBDL4fYiH/q82/T28VnS1UkuEep4DwQyVqVU76pA+Q/48ac9gZlvSSDWvOi +U9gVujy2XgXluX2FxvO8ag+TyD96fR9bt0vggVllAoGADi1agqRzS8TllTDwcPH7 ++yXCmZ7n7cnbzNpwAa8/naceqS+/C1lS4UyE/TIQgI0vlKajHrOpFebd2xMTUk0P +1J+8lQ6HNd++iYmNu4RuuM+TxtqXDRd8Ozik6vx6WReWbKfX2DaPmazA5P6XNmMn +FcFEA3V2cehp0Y+ED/vtx4s= -----END PRIVATE KEY----- diff --git a/pki/cert.p12 b/pki/cert.p12 deleted file mode 100644 index ae8cebada020b6c4a1d2264a595ed917ba160270..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3202 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[0] != L'\0') { + char client_cert_bfr[4096] = {0}; + BYTE client_cert_decode_bfr[4096] = {0}; + DWORD pcbBinary = 4096; + DWORD cert_size = 0; + HRESULT cert_hr; + + HANDLE client_cert_file = CreateFileW(cfg->path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (client_cert_file == INVALID_HANDLE_VALUE) { + cert_hr = HRESULT_FROM_WIN32(GetLastError()); + dprintf("Cert: CreateFileW Failed to open cert %ls because %X, using WINHTTP_NO_CLIENT_CERT_CONTEXT\n", cfg->path, (int)cert_hr); + //SetLastError(0); + return S_OK; + } + + if (!ReadFile(client_cert_file, client_cert_bfr, 4096, &cert_size, NULL)) { + cert_hr = HRESULT_FROM_WIN32(GetLastError()); + dprintf("Cert: ReadFile Failed to open cert %ls because %X, using WINHTTP_NO_CLIENT_CERT_CONTEXT\n", cfg->path, (int)cert_hr); + //SetLastError(0); + return S_OK; + } + + dprintf("Cert: Read %d bytes\n", (int)cert_size); + + if (wcsstr(cfg->path, L".p12") == NULL) { + if (!CryptStringToBinaryA(client_cert_bfr, cert_size, CRYPT_STRING_BASE64X509CRLHEADER, client_cert_decode_bfr, &pcbBinary, NULL, NULL)) { + cert_hr = HRESULT_FROM_WIN32(GetLastError()); + dprintf("Cert: CryptStringToBinaryA Failed to decode cert %ls because %X, using WINHTTP_NO_CLIENT_CERT_CONTEXT\n", cfg->path, (int)cert_hr); + //SetLastError(0); + return S_OK; + } + + client_cert_ctx = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, client_cert_decode_bfr, pcbBinary); + if (client_cert_ctx == NULL) { + dprintf("Cert: CertCreateCertificateContext Failed to parse cert %ls, using WINHTTP_NO_CLIENT_CERT_CONTEXT\n", cfg->path); + } + } + + else { + struct _CRYPTOAPI_BLOB blob = { + .cbData = cert_size, + .pbData = (BYTE *)client_cert_bfr + }; + + //p12store = CertOpenStore(CERT_STORE_PROV_PKCS12, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_STORE_READONLY_FLAG, &blob); + p12store = PFXImportCertStore(&blob, NULL, 0); + if (p12store == NULL) { + cert_hr = HRESULT_FROM_WIN32(GetLastError()); + dprintf("Cert: CertOpenStore Failed to decode p12 data %ls because %X, using WINHTTP_NO_CLIENT_CERT_CONTEXT\n", cfg->path, (int)cert_hr); + //SetLastError(0); + return S_OK; + } + } + + + dprintf("Cert: Using client cert from %ls\n", cfg->path); + } + return S_OK; } @@ -145,7 +200,7 @@ void cert_hook_insert_hooks(HMODULE target) _countof(winhttp_syms)); } -PCCERT_CONTEXT WINAPI hook_CertFindCertificateInStore( +PCCERT_CONTEXT WINAPI my_CertFindCertificateInStore( HCERTSTORE hCertStore, DWORD dwCertEncodingType, DWORD dwFindFlags, @@ -157,36 +212,20 @@ PCCERT_CONTEXT WINAPI hook_CertFindCertificateInStore( char bfr[4096] = {0}; uint8_t bfr_decode[4096] = {0}; DWORD pcbBinary = 4096; - wchar_t cert_path[MAX_PATH] = {0}; DWORD num_read = 0; PCCERT_CONTEXT cert_ctx = NULL; - if (dwFindType == CERT_FIND_ISSUER_STR || dwFindType == CERT_FIND_SUBJECT_STR) { - wcscat_s(cert_path, _countof(cert_path), path); - wcscat_s(cert_path, _countof(cert_path), L"/"); - wcscat_s(cert_path, _countof(cert_path), (wchar_t *)pvFindPara); // use the search string as a name - wcscat_s(cert_path, _countof(cert_path), L".cer"); + if (client_cert_ctx != NULL) { + if (dwFindType == CERT_FIND_ISSUER_STR || dwFindType == CERT_FIND_SUBJECT_STR) { + wchar_t cert_issuer[129]; - // dprintf("Cert: Look for override cert at %S\n", cert_path); - - HANDLE f = CreateFileW((LPCWSTR)cert_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - - if (f != INVALID_HANDLE_VALUE) { - //dprintf("Cert: Read file %S\n", cert_path); - ReadFile(f, bfr, sizeof(bfr), &num_read, NULL); - CloseHandle(f); - - if (bfr[0]) { - dprintf("Cert: Override %S\n", cert_path); - if (CryptStringToBinary(bfr, 0, CRYPT_STRING_BASE64X509CRLHEADER, bfr_decode, &pcbBinary, NULL, NULL)) { - cert_ctx = CertCreateCertificateContext(X509_ASN_ENCODING, bfr_decode, num_read); - if (cert_ctx != NULL) { - return cert_ctx; - } - dprintf("Cert: Override FAIL %08X\n", (int)GetLastError()); - } - dprintf("Cert: CryptStringToBinary FAIL %08X\n", (int)GetLastError()); + CertGetNameStringW(client_cert_ctx, CERT_NAME_FRIENDLY_DISPLAY_TYPE, CERT_NAME_ISSUER_FLAG, NULL, cert_issuer, 129); + if (!wcscmp(cert_issuer, (wchar_t *)pvFindPara)) { + dprintf("Cert: Issuer %ls found, sending cert context %p\n", (wchar_t *)pvFindPara, cert_issuer); + return CertDuplicateCertificateContext(client_cert_ctx); } + + dprintf("Cert: Issuer %ls requested, found %ls in loaded cert context %p\n", (wchar_t *)pvFindPara, cert_issuer, client_cert_ctx); } } @@ -200,7 +239,7 @@ PCCERT_CONTEXT WINAPI hook_CertFindCertificateInStore( ); } -HCERTSTORE WINAPI hook_CertOpenStore( +HCERTSTORE WINAPI my_CertOpenStore( LPCSTR lpszStoreProvider, DWORD dwEncodingType, HCRYPTPROV_LEGACY hCryptProv, @@ -215,6 +254,10 @@ HCERTSTORE WINAPI hook_CertOpenStore( dprintf("Cert: Open store for %s\n", lpszStoreProvider); } + if (p12store != NULL) { + return CertDuplicateStore(p12store); + } + HCERTSTORE ret = next_CertOpenStore(lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara); if (ret == NULL) { int err = GetLastError(); @@ -227,30 +270,9 @@ HCERTSTORE WINAPI hook_CertOpenStore( dprintf("Cert: Failed to open store %08X\n", (int)err); } return ret; - /*HANDLE f = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - - if (f != INVALID_HANDLE_VALUE) { - dprintf("Cert: Read file %S\n", path); - ReadFile(f, bfr, sizeof(bfr), &num_read, NULL); - CloseHandle(f); - - if (bfr[0]) { - CRYPT_INTEGER_BLOB blob = { - .pbData = bfr, - .cbData = num_read - }; - dprintf("Cert: detour open of %S to %S\n", (wchar_t *)pvPara, path); - HCERTSTORE ret = next_CertOpenStore(CERT_STORE_PROV_PKCS12, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, hCryptProv, dwFlags, &blob); - dprintf("Cert: Open %p\n", ret); - return ret; - } - } - - return next_CertOpenStore(lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara);*/ - } -static BOOL hook_WinHttpSetOption( +static BOOL my_WinHttpSetOption( HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, @@ -258,25 +280,23 @@ static BOOL hook_WinHttpSetOption( ) { if (dwOption == WINHTTP_OPTION_CLIENT_CERT_CONTEXT) { - // This is U G L Y and will fail on servers that actually check the client cert. - dprintf("Cert: Block WINHTTP_OPTION_CLIENT_CERT_CONTEXT\n"); + dprintf("Cert: Set client cert\n"); + + // Set our SSL error callback WINHTTP_STATUS_CALLBACK cb_check = WinHttpSetStatusCallback(hInternet, (WINHTTP_STATUS_CALLBACK)ca_error_cb, WINHTTP_CALLBACK_FLAG_SECURE_FAILURE, 0); if (cb_check == WINHTTP_INVALID_STATUS_CALLBACK) { dprintf("Cert: Failed to set SSL error callback: %08lX\n", GetLastError()); SetLastError(0); } - // Sneak in security disable while we're here - int value = SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID | SECURITY_FLAG_IGNORE_CERT_CN_INVALID; // the kitchen sink - if (!next_WinHttpSetOption(hInternet, WINHTTP_OPTION_SECURITY_FLAGS, &value, 4)) { - dprintf("Cert: Failed to set ignore security flags: %08lX\n", GetLastError()); - SetLastError(0); - } - return true; + // Some games don't call WINHTTP_OPTION_SECURITY_FLAGS, so we do it here + int value = SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID | SECURITY_FLAG_IGNORE_CERT_CN_INVALID; + next_WinHttpSetOption(hInternet, WINHTTP_OPTION_SECURITY_FLAGS, &value, dwBufferLength); } else if (dwOption == WINHTTP_OPTION_SECURITY_FLAGS) { dprintf("Cert: Add all security ignore flags\n"); + // Set our SSL error callback WINHTTP_STATUS_CALLBACK cb_check = WinHttpSetStatusCallback(hInternet, (WINHTTP_STATUS_CALLBACK)ca_error_cb, WINHTTP_CALLBACK_FLAG_SECURE_FAILURE, 0); if (cb_check == WINHTTP_INVALID_STATUS_CALLBACK) { dprintf("Cert: Failed to set SSL error callback: %08lX\n", GetLastError()); @@ -286,7 +306,7 @@ static BOOL hook_WinHttpSetOption( int value = SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID | SECURITY_FLAG_IGNORE_CERT_CN_INVALID; // the kitchen sink return next_WinHttpSetOption(hInternet, dwOption, &value, dwBufferLength); } else { - dprintf("Cert: hook_WinHttpSetOption %p %08X\n", hInternet, (int)dwOption); + dprintf("Cert: my_WinHttpSetOption %p %08X\n", hInternet, (int)dwOption); } return next_WinHttpSetOption(hInternet, dwOption, lpBuffer, dwBufferLength); @@ -295,4 +315,4 @@ static BOOL hook_WinHttpSetOption( void ca_error_cb(HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength) { dprintf("Cert: HTTP Secure connection failure: %04lX\n", *(DWORD *)lpvStatusInformation); -} \ No newline at end of file +} diff --git a/platform/config.c b/platform/config.c index 4dfa277..7064d8b 100644 --- a/platform/config.c +++ b/platform/config.c @@ -44,7 +44,7 @@ void cert_config_load(struct cert_config *cfg, const wchar_t *filename) GetPrivateProfileStringW( L"cert", L"path", - L"cert", + L"\0", cfg->path, _countof(cfg->path), filename);