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

时间:2011-11-29 23:35:28

标签: dns winsock winsock-lsp

我写了自己的LSP,工作正常。但是,我无法捕获dns查询。例如,没有像WSPGetHostByName或WSPGetAddrInfo这样的函数。

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

由于

2 个答案:

答案 0 :(得分:4)

我们开发了一个可以“拦截”DNS查询的LSP。唯一的方法是通过挂钩所有DNS功能,请记住,您需要解决一些挑战:

  1. 您需要使用一个支持32位和64位代码的良好挂钩库。
  2. 图书馆许可证必须适合您的应用程序,有一些免费的图书馆,但只能在免费项目中自由使用。
  3. 挂钩函数时,需要确保不要修改非基于IP的某些值,并将查询推迟到实际函数。
  4. 由于查询是从MS DNS客户端发出的,因此拦截UDP将无法正常工作,因此除非你编写一个低级驱动程序,如:TDI,NDIS或WFP,否则你必须挂钩这些函数(或写一个NSP)。 NSLookup适合您,因为它自己创建DNS查询。

答案 1 :(得分:0)

我的解决方案如下:

  1. 使用众所周知的网络浏览器:firefox.exe

  2. 将其复制为新名称:icefoxy.exe

  3. 修改EXE,以便加载自定义DLL。

  4. 几个月前我已经完成了这项工作,但由于Firefox不断获得更新,这意味着:

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

    OR:每次firefox.exe更改时都更新修改。

    可以使用Delphi轻松编写DLL。

    Firefox修改需要汇编语言,除非你知道如何下载所有必要的文件来自己编译firefox,有权访问C / C ++编译器(可能是mingw-gcc),并准备好相互之间有2个C ++的独家标准,如果您的g ++(gcc套件的一部分)与您的Firefox源代码不兼容,那么您的尝试将失败。

    我自己不是C ++专家,因此我使用机器语言(至少对我而言)更简单,这样我就不需要成为C / C ++专家来完成工作。

    一些相对点:

    1. 必须挂钩哪些功能才能拦截所有Firefox对dns服务器的访问权限?

    2. 我注意到,如果你将Delphi DLL加载到Icefoxy.exe(Firefox.exe的重命名副本)中 然后缺少德尔福表格的颜色,例如。如果你设置(在对象ispector或代码中):

    3. Label1.Color:= clLime;

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

      我很乐意发布我的代码(对Firefox和Delphi DLL源代码进行汇编语言修改),但我如何/在哪里发布它以便公开查看?

      我使用Delphi 7制作DLL。

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

      在我这样做的时候,这只是一个小实验,以确定我是否可以强制Firefox加载我自己的DLL以及它的进程地址空间。

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

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