12

GetHostByNameホスト/DNSからIPアドレスを取得するために使用しています。Kaspersky Internet Security 2013 も持っていGetHostByNameますが、それが選択されることに気付きました。私のプロセスが でサブキーを作成しようとしているようですhklm\SYSTEM\CONTROLSET001\SERVICES\TCPIP\PARAMETERS。これは実際には、ユーザーが管理者権限を持っていない場合、この機能を使用できないことを意味します。ホスト/DNS を解決する他の方法はありますか?

編集:ここにスクリーンショット:

ここに画像の説明を入力

EDIT2: 実際に 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.

このバージョンは、レジストリに何も書き込まないようです...

4

1 に答える 1

15

gethostbyname()は、DNS 経由でホスト名を照会する正しい方法です (getaddrinfo()特に IPv6 をサポートする必要がある場合は、より良い選択です)。多くのアプリケーションがgethostbyname()(および/またはgetaddrinfo()) を使用しているため、Kaspersky がブロックする可能性はほとんどありません。

gethostbyname()なぜレジストリキーを作成していると思いますか? 実際に作成されているのは何ですか?何も作成していないはずです。これは、何らかの外部コードが にフックされていることを示唆している可能性がありますgethostbyname()

于 2013-03-06T19:01:51.527 に答える