我编写了自己的 LSP,它运行良好。但是,我无法捕获 dns 查询。例如,没有像 WSPGetHostByName 或 WSPGetAddrInfo 这样的函数。
我的 lsp 也支持 UDP 协议,但它不工作。如果我从控制台 (cmd.exe) 运行 nslookup,它似乎可以工作,但我无法捕获 gethostbyname。有谁知道这是怎么做到的吗?我不认为编写 NSP(名称服务提供商)是一种解决方案。但我可能错了。
谢谢
我编写了自己的 LSP,它运行良好。但是,我无法捕获 dns 查询。例如,没有像 WSPGetHostByName 或 WSPGetAddrInfo 这样的函数。
我的 lsp 也支持 UDP 协议,但它不工作。如果我从控制台 (cmd.exe) 运行 nslookup,它似乎可以工作,但我无法捕获 gethostbyname。有谁知道这是怎么做到的吗?我不认为编写 NSP(名称服务提供商)是一种解决方案。但我可能错了。
谢谢
我们开发了一个可以“拦截”DNS 查询的 LSP。唯一的方法是连接所有 DNS 功能,请记住,您需要解决一些挑战:
由于查询是从 MS DNS 客户端发出的,因此拦截 UDP 将不起作用,因此除非您编写低级驱动程序,例如:TDI、NDIS 或 WFP,否则您必须挂钩函数(或编写 NSP)。NSLookup 适合您,因为它自己创建 DNS 查询。
我的解决方案如下:
以众所周知的网络浏览器为例:firefox.exe
将其复制为一个新名称:icefoxy.exe
修改 EXE,使其加载自定义 DLL。
几个月前我已经这样做了,但由于 Firefox 不断更新,这意味着:
要么:保留一个版本,不要更新(风险自负,可能会导致安全问题,因为这意味着漏洞不会被修复)
或者:每次 firefox.exe 更改时更新您的修改。
DLL 可以很容易地使用 Delphi 编写。
Firefox 修改需要汇编语言,除非您知道如何下载所有必要的文件来自己编译 Firefox,可以访问 C/C++ 编译器(可能是 mingw-gcc),并准备好有 2 个相互排斥的标准C++,并且如果您的 g++(gcc 套件的一部分)与您的 Firefox 源不兼容,那么您的尝试将失败。
我自己不是 C++ 专家,所以我选择了(至少对我来说)更简单的方法,使用机器语言,这样我就不需要成为 C/C++ 专家来完成工作。
一些相对的点:
必须挂钩哪些功能才能拦截 Firefox 对 dns 服务器的所有访问?
我注意到,如果您将 Delphi DLL 加载到 Icefoxy.exe(Firefox.exe 的重命名副本)中,则 Delphi 表单的颜色会丢失,例如。如果您设置(在对象 isspector 或代码中):
Label1.Color := clLime;
你仍然会看到一个没有石灰背景颜色的标签。我不知道确切的原因,但似乎 Delphi VCL 依赖于在 EXE 中使用,并且当您在 DLL 而不是 EXE 中使用 Delphi VCL 组件时,某些东西(例如颜色)无法按预期工作.
我很乐意发布我的代码(对 Firefox 和 Delphi DLL 源代码的汇编语言修改),但是我如何/在哪里可以发布它以便公开查看?
我使用 Delphi 7 来制作 DLL。
如果您使用 Delphi 2009 或更高版本,则需要特别注意在 Delphi 代码和任何非 Delphi 代码之间传递的任何字符串数据都具有正确的编码,因为在 Delphi 2009 和所有较新版本中,字符串类型是 unicodestring 的别名,在旧的 Delphi 版本中,String 类型是 AnsiString 的别名。
在我这样做的时候,这只是一个小实验,以确定我是否可以强制 Firefox 加载我自己的 DLL,因为它是进程地址空间。
另一个有趣的想法是从 Delphi DLL 访问 Firefox 的 DOM(文档对象模型),这将为使用 TWebBrowser(基于 Microsoft 的 Internet Explorer 的 ActiveX 版本)提供一个可行的替代方案。
I know there have been components like TWebBrowser based on Firefox, but their problem is that nobody cared to update them for a very long time, so they are compatible only with some very outdated version of Firefox.