diff --git a/hooklib/dns.c b/hooklib/dns.c index aac90ce..7dd6d0b 100644 --- a/hooklib/dns.c +++ b/hooklib/dns.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -65,6 +66,12 @@ static int WSAAPI hook_getaddrinfo( const char *pServiceName, const ADDRINFOA *pHints, ADDRINFOA **ppResult); + +static HINTERNET WINAPI hook_WinHttpConnect( + HINTERNET hSession, + const wchar_t *pwszServerName, + INTERNET_PORT nServerPort, + DWORD dwReserved); /* Link pointers */ @@ -95,6 +102,12 @@ static int (WSAAPI *next_getaddrinfo)( const ADDRINFOA *pHints, ADDRINFOA **ppResult); +static HINTERNET (WINAPI *next_WinHttpConnect)( + HINTERNET hSession, + const wchar_t *pwszServerName, + INTERNET_PORT nServerPort, + DWORD dwReserved); + static const struct hook_symbol dns_hook_syms_dnsapi[] = { { .name = "DnsQuery_A", @@ -120,6 +133,14 @@ static const struct hook_symbol dns_hook_syms_ws2[] = { } }; +static const struct hook_symbol dns_hook_syms_winhttp[] = { + { + .name = "WinHttpConnect", + .patch = hook_WinHttpConnect, + .link = (void **) &next_WinHttpConnect, + } +}; + static bool dns_hook_initted; static CRITICAL_SECTION dns_hook_lock; static struct dns_hook_entry *dns_hook_entries; @@ -145,6 +166,12 @@ static void dns_hook_init(void) "ws2_32.dll", dns_hook_syms_ws2, _countof(dns_hook_syms_ws2)); + + hook_table_apply( + NULL, + "winhttp.dll", + dns_hook_syms_winhttp, + _countof(dns_hook_syms_winhttp)); } HRESULT dns_hook_push(const wchar_t *from_src, const wchar_t *to_src) @@ -460,3 +487,38 @@ end: return result; } + +static HINTERNET WINAPI hook_WinHttpConnect( + HINTERNET hSession, + const wchar_t *pwszServerName, + INTERNET_PORT nServerPort, + DWORD dwReserved) +{ + const struct dns_hook_entry *pos; + size_t i; + + if (pwszServerName == NULL) { + return NULL; + } + + EnterCriticalSection(&dns_hook_lock); + + for (i = 0 ; i < dns_hook_nentries ; i++) { + pos = &dns_hook_entries[i]; + + if (_wcsicmp(pwszServerName, pos->from) == 0) { + if(pos->to == NULL) { + LeaveCriticalSection(&dns_hook_lock); + return NULL; + } + + pwszServerName = pos->to; + + break; + } + } + + LeaveCriticalSection(&dns_hook_lock); + + return next_WinHttpConnect(hSession, pwszServerName, nServerPort, dwReserved); +} diff --git a/platform/dns.c b/platform/dns.c index f8c2f60..d6d37a7 100644 --- a/platform/dns.c +++ b/platform/dns.c @@ -82,6 +82,26 @@ HRESULT dns_platform_hook_init(const struct dns_config *cfg) return hr; } + // AimePay + hr = dns_hook_push(L"api-aime.am-all.net", cfg->startup); + + if (FAILED(hr)) { + return hr; + } + + // E-MONEY + hr = dns_hook_push(L"tasms-api-basis.thincacloud.com", cfg->startup); + + if (FAILED(hr)) { + return hr; + } + + hr = dns_hook_push(L"shop.tfps.thincacloud.com", cfg->startup); + + if (FAILED(hr)) { + return hr; + } + // if your ISP resolves bad domains, it will kill the network. These 2 // *cannot* resolve