{*******************************************************} { } { ApiHookNet } { } { Copyright (C) 2023 kku } { } {*******************************************************} unit ApiHookNet; interface uses Winapi.Windows, EM.Dnsapi, System.SysUtils; const DNS_ERROR_RCODE_YXDOMAIN = $232E; type TFun_DnsQuery_A = function(lpstrName: LPSTR; wType: WORD; fOptions: DWORD; aipServers: PDWORD; var ppQueryResultsSet: PDWORD; pReserved:pdword): DWORD; stdcall; TFun_DnsQuery_UTF8 = function(lpstrName: LPSTR; wType: WORD; fOptions: DWORD; aipServers: PDWORD; var ppQueryResultsSet: PDWORD; pReserved:pdword): DWORD; stdcall; TFun_DnsQuery_W = function(lpstrName: LPWSTR; wType: WORD; fOptions: DWORD; aipServers: PDWORD; var ppQueryResultsSet: PDWORD; pReserved:pdword): DWORD; stdcall; TFun_DnsQueryEx = function(pQueryRequest: PDnsQueryRequest; pQueryResults, pCancelHandle: Pointer): DWORD; stdcall; var ozDnsQuery_A: TFun_DnsQuery_A = nil; ozDnsQuery_UTF8: TFun_DnsQuery_UTF8 = nil; ozDnsQuery_W: TFun_DnsQuery_W = nil; ozDnsQueryEx: TFun_DnsQueryEx = nil; implementation function CheckBlockDomain(sDomain: String): Boolean; begin // _AppHook.Log('CheckBlockDomain() ..'); Result := Pos('google', LowerCase(sDomain)) > 0; end; function DnsQuery_AHook(lpstrName: LPSTR; wType: WORD; fOptions: DWORD; aipServers: PDWORD; var ppQueryResultsSet: PDWORD; pReserved:pdword): DWORD; stdcall; begin if CheckBlockDomain(StrPas(lpstrName)) then Result := DNS_ERROR_RCODE_YXDOMAIN else Result := ozDnsQuery_A(lpstrName, wType, fOptions, aipServers, ppQueryResultsSet, pReserved); end; function DnsQuery_UTF8Hook(lpstrName: LPSTR; wType: WORD; fOptions: DWORD; aipServers: PDWORD; var ppQueryResultsSet: PDWORD; pReserved:pdword): DWORD; stdcall; begin if CheckBlockDomain(StrPas(lpstrName)) then Result := DNS_ERROR_RCODE_YXDOMAIN else Result := ozDnsQuery_UTF8(lpstrName, wType, fOptions, aipServers, ppQueryResultsSet, pReserved); end; function DnsQuery_WHook(lpstrName: LPWSTR; wType: WORD; fOptions: DWORD; aipServers: PDWORD; var ppQueryResultsSet: PDWORD; pReserved:pdword): DWORD; stdcall; begin if CheckBlockDomain(StrPas(lpstrName)) then Result := DNS_ERROR_RCODE_YXDOMAIN else Result := ozDnsQuery_W(lpstrName, wType, fOptions, aipServers, ppQueryResultsSet, pReserved); end; function DnsQueryExHook(pQueryRequest: PDnsQueryRequest; pQueryResults, pCancelHandle: Pointer): DWORD; stdcall; begin if CheckBlockDomain(StrPas(pQueryRequest.sQueryName)) then Result := ERROR_INVALID_PARAMETER else Result := ozDnsQueryEx(pQueryRequest, pQueryResults, pCancelHandle); end; end.