【问题标题】:Get IP-Address from DNS without GetHostByName不使用 GetHostByName 从 DNS 获取 IP 地址
【发布时间】:2013-03-06 18:56:57
【问题描述】:

我正在使用GetHostByName 从主机/DNS 获取 IP 地址。我也有 Kaspersky Internet Security 2013 并注意到 GetHostByName 被它选中。看来我的进程试图在hklm\SYSTEM\CONTROLSET001\SERVICES\TCPIP\PARAMETERS 中创建一个子键。这实际上意味着,如果用户没有任何管理员权限,我将无法使用此功能。有没有其他方法可以解析主机/dns?

编辑:这里是截图:

编辑2: 我实际上使用了 getaddrinfo 并且 KIS 没有“检测到任何东西”。我想使用它,但我仍然希望支持 Win2K。

EDIT3:添加了调试屏幕截图

EDIT4:这是我的“测试”代码:

program Project2;

{$APPTYPE CONSOLE}

uses
  Winsock;

var
    DummyWSA : WSADATA;

begin
  if WSAStartup($0202, DummyWSA) = 0 then begin
    GetHostByName ('localhost');
  end;
  readln;
end.

EDIT5:GetAddrInfo 版本...

program Project2;

{$APPTYPE CONSOLE}

uses
  Winsock;

type
  PAddrInfo = ^TAddrInfo;
  TAddrInfo = packed record
    ai_flags: Integer;
    ai_family: Integer;
    ai_socktype: Integer;
    ai_protocol: Integer;
    ai_addrlen: LongWord;
    ai_canonname: Array of Char;
    ai_addr: PSOCKADDR;
    ai_next: PAddrInfo;
  end;

function getaddrinfo(const nodename: PChar; const servname : PChar; const hints: PAddrInfo; var res: PAddrInfo): Integer; stdcall; external 'ws2_32.dll' name 'getaddrinfo';
procedure freeaddrinfo(ai: PAddrInfo); stdcall; external 'ws2_32.dll' name 'freeaddrinfo';

var
  DummyWSA      : WSADATA;
  SocketHint    : PAddrInfo;
  SocketResult  : PAddrInfo;

begin
  if WSAStartup($0202, DummyWSA) = 0 then begin
    //GetHostByName ('localhost');
    getaddrinfo ('localhost', '80', SocketHint, SocketResult);
    // getaddrinfo ('localhost', NIL, SocketHint, SocketResult); // Not sure if I can NIL the port...
  end;
  readln;
end.

这个版本似乎根本没有向注册表写入任何东西...

【问题讨论】:

  • 如果有,那可能和卡巴斯基有同样的冲突。您应该能够以非管理员身份调用 GetHostByName。调用堆栈是什么样的?
  • 你有没有尝试过使用这个函数并看到它实际上失败你只是假设它会失败你在这个调用堆栈中读到了什么?因为我可以告诉你,GetHostByName 不仅限于管理员帐户。
  • 哇,我永远不会安装卡巴斯基。
  • 这是我讨厌卡巴斯基的原因之一。我们的软件完全从客户的硬盘驱动器中完全删除(未隔离),因为它不喜欢连接到 FTP 站点。
  • 只是一个建议 - 如果您有一个可以添加到应用程序的数字签名,请尝试一下,也许卡巴斯基会尊重您的应用程序的调用。

标签: delphi sockets winapi winsock


【解决方案1】:

gethostbyname() 是通过 DNS 查询主机名的正确方法(getaddrinfo() 是更好的选择,尤其是在您需要支持 IPv6 的情况下),而且绝对不仅限于管理员。许多应用程序使用gethostbyname()(和/或getaddrinfo()),因此卡巴斯基不太可能阻止它。

您为什么认为gethostbyname() 正在创建注册表项?实际创建的是什么?它不应该创造任何东西。这可能表明某些外部代码已挂接到 gethostbyname()

【讨论】:

  • +1 表示“这可能表明某些外部代码已挂接到 gethostbyname()”
  • 我可以确认,将 RegMonitor 与简单的 gethostbyname 项目一起使用确实会在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters (WinXP/D5) 上触发 CreateKey 请求
  • 1) 我使用您的代码 (gethostbyname) 创建了一个示例 Delphi 项目。 2) 运行RegMon 3) 运行示例项目。 RegMon 告诉我该过程确实触发了 CreateKey 请求。
  • @kobik:我在 MSDN 上发现 one article 建议 gethostbyname() 访问 Tcpip\Parameters 以确定返回 IP 的顺序。在“正常”条件下,gethostbyname() 如果无法访问注册表项,它将继续前进。 KIS 与注册表挂钩,并且正在阻碍。所以这确实是一个 KIS 问题,而不是 WinSock 问题。
  • @kobik:我会向 KIS 提交错误报告。 gethostbyname() 在创建该注册表项时请求对其进行只读访问。我看不出 KIS 应该将其标记为可疑的原因。另一方面,这可能也是一个 Microsoft 错误,因为 gethostbyname()(或它调用的任何较低级别)使用 RegCreateKeyEx() 而不是 RegOpenKeyEx()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 2013-08-17
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多