是否可以使用LSP/SPI截获dns查询?

是否可以使用LSP/SPI截获dns查询?,dns,winsock,winsock-lsp,Dns,Winsock,Winsock Lsp,我写了自己的LSP,效果很好。但是,我无法捕获dns查询。例如,没有像WSPGetHostByName或WSPGetAddrInfo这样的函数 我的lsp也支持UDP协议,但它不工作。如果我从控制台(cmd.exe)运行nslookup,它似乎可以工作,但我无法捕获gethostbyname。有人知道怎么做吗?我不认为编写NSP(名称服务提供商)是一个解决方案。但我可能错了 谢谢我们开发了一种可以“拦截”DNS查询的LSP。要做到这一点,唯一的方法是连接到所有DNS功能,请记住,您需要解决一些挑

我写了自己的LSP,效果很好。但是,我无法捕获dns查询。例如,没有像WSPGetHostByName或WSPGetAddrInfo这样的函数

我的lsp也支持UDP协议,但它不工作。如果我从控制台(cmd.exe)运行nslookup,它似乎可以工作,但我无法捕获gethostbyname。有人知道怎么做吗?我不认为编写NSP(名称服务提供商)是一个解决方案。但我可能错了


谢谢

我们开发了一种可以“拦截”DNS查询的LSP。要做到这一点,唯一的方法是连接到所有DNS功能,请记住,您需要解决一些挑战:

  • 您需要使用一个好的挂钩库,它将同时支持32位和64位代码
  • 库许可证必须适合您的应用程序,有一些免费库,但只能与免费项目一起免费使用
  • 挂接函数时,需要确保不修改某些非基于IP的值,并将查询推迟到实际函数

  • 拦截UDP将不起作用,因为查询是从MS DNS客户端发出的,因此除非您编写低级别驱动程序,如:TDI、NDIS或WFP,否则您必须挂接函数(或编写NSP)。NSLookup对您有效,因为它本身创建DNS查询。

    我的解决方案如下:

  • 以著名的web浏览器firefox.exe为例

  • 将其复制到一个新名称:icefoxy.exe

  • 修改EXE,使其加载自定义DLL

  • 几个月前我就已经这样做了,但由于Firefox不断更新,这意味着:

    或者:保留一个版本,不更新(风险自负,可能导致安全问题,因为这意味着漏洞将无法修复)

    或者:每次firefox.exe更改时更新您的修改

    使用Delphi可以很容易地编写DLL

    Firefox修改需要汇编语言,除非你知道如何下载所有必要的文件来编译Firefox自己,否则你就可以访问C/C++编译器(可能是明文GCC),并且准备好C++有2个互斥标准,如果你的G++(GCC套件的一部分)与你的Firefox源不兼容,那么你的尝试就会失败

    <>我不是C++专家,所以我用机器语言(至少我)更容易的路线,这样我就不需要成为C/C++专家来完成任务。 一些相关点:

  • 为了拦截所有Firefox对dns服务器的访问,必须连接哪些功能

  • 我注意到,如果将Delphi DLL加载到Icefoxy.exe(Firefox.exe的重命名副本)中 然后,Delphi表单的颜色将丢失,例如,如果您设置(在object ispector或代码中):

  • 标签1.颜色:=clLime

    您仍然可以看到没有石灰背景色的标签。我不知道确切的原因,但似乎Delphi VCL依赖于在EXE中使用,当您在DLL中使用Delphi VCL组件而不是EXE时,某些东西(如颜色)无法按预期工作

    我很乐意发布我的代码(包括对Firefox的汇编语言修改和Delphi DLL源代码),但是我如何/在哪里发布代码以使其公开可见

    我使用Delphi7来制作DLL

    如果使用Delphi 2009或更高版本,则需要特别注意Delphi代码和任何非Delphi代码之间传递的任何字符串数据是否具有正确的编码,因为在Delphi 2009和所有较新版本中,类型字符串是unicodestring的别名,而在较旧的Delphi版本中,类型字符串是AnsiString的别名

    在我这么做的时候,这只是一个小实验,看看我是否可以强迫Firefox在它的进程地址空间中加载我自己的DLL

    另一个有趣的想法是从Delphi DLL访问Firefox的DOM(文档对象模型),这将为使用TWebBrowser(基于Microsoft Internet Explorer的ActiveX版本)提供一个可行的替代方案


    我知道有一些组件像基于Firefox的TWebBrowser,但他们的问题是很长一段时间没有人愿意更新它们,所以它们只与一些非常过时的Firefox版本兼容。

    Barak感谢您的快速响应。当你说“钩子”时,你是指dll注入还是LSP?我的LSP同时支持x86和x64。没问题。当我说hook时,我指的是类似Microsoft迂回库的东西,请记住,除非你购买了10万美元的许可证,否则你不能商业化使用它。在Komodia,我们编写了我们自己的库,这样我们就可以在没有任何许可证限制的情况下转售。Barak,使用你自己的库需要支付多少费用?你也有预编译的dll与不同的编程语言一起使用吗?顺便问一下,有人知道下面的链接吗?通知@PeterNote在Windows 8中不支持LSP,如TDI。如果我没记错的话,gethostbyname会触发DnsCache(DNS客户端)服务来进行DNS查询。尝试重新启动DnsCache服务,看看是否可以获得流量。嗨,Peter。您确定不支持LSP吗?我知道TDI将不被支持,但我不确定LSP。是的,正如参加一些MS会议的人所说。抱歉,无法找到任何链接来证明这一点。实际上,我们并不确定LSP,但我们测试了TDI过滤器,发现它仍然可以在当前的Win8测试版上安装和运行。但是据说如果软件使用TDI,那么它就不能获得某些Win8证书。我没有使用TDI,所以我相信我在这里是安全的:)问题是我在Delphi XE2中编码。我可以读C把它翻译回Delphi,但是说C可能需要很长时间。所以我不能用C写。我知道用Delphi写驱动程序几乎是不可能的。