【发布时间】:2020-02-21 13:14:59
【问题描述】:
我正在研究如何在 Windows 中拦截 DNS 查询, 以一种不需要将 DLL 注入每个进程的方式,并且理想情况下能够根据发出查询的进程做出决策,因此简单的 DNS 代理服务器是不够的。
从表面上看,DNS 查询所采用的路径如下所示, 一些应用程序从 ws2_32.dll(或 dnsapi.dll 中的 DnsQuery)调用 gethostbyname
[dll 做了什么]
最终调用了 dnsrslvr.dll 中的某些内容,该内容在 svshost 进程中作为名为“Dnscache”的服务运行,该服务根据 TaskExplorer 在端口 53 上从 DNS 服务器发送和重新发送 UDP 数据包
所以我想做的是在“Dnscache”服务之前拦截一些 dns 查询,或者用自己的服务替换该服务。
所以我的问题是:这里的一位聪明人是否知道公共 DNS 查询 API 和 Dnscache 服务之间发生了什么,以及两者之间的最佳连接位置?
【问题讨论】:
-
没有什么可以阻止应用程序进行自己的 DNS 查询,而无需让系统 API 代表应用程序执行实际查询。
-
查询可以在进程中完成,无需在 svshost 进程中远程调用名为“Dnscache”的服务
-
确保您可以实现自己的 dns 客户端并使其访问硬编码的 dns 服务器,但大多数应用程序使用操作系统工具来完成这些任务。这就是我关心的程序。
-
即使在操作系统设施的情况下 - 所有都可以在单个进程中,无需服务调用
-
所以你的意思是我应该使用本地 dns 代理服务器,仅此而已?
标签: windows winapi networking dns kernel