2013-03-06 8 views
12

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

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

enter image description here

EDIT2: 私は実際にはgetaddrinfoを使用し、KISは "何を検出" しませんでした。私はそれを使用したいと思いますが、私はまだWin2Kをサポートしたいと思います。

EDIT3:追加のデバッグスクリーンショット

enter image description here

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. 

このバージョンレジストリに何も書いていないようです...

+1

もしあれば、それはおそらくKasperskyと同じ競合を持つでしょう。 GetHostByNameを非管理者として呼び出せなければなりません。コールスタックはどのように見えますか? –

+1

*関数を使って試してみましたが実際には*失敗しています*あなたはこの呼び出しスタックで読んだ内容に基づいて失敗すると仮定していますか?私はあなたに言うことができるので、 'GetHostByName'は管理者専用のアカウントに限られていません。 –

+0

「検出」のスクリーンショットを追加しました。これは、管理者権限を持っている場合にのみHKLMに書き込むことができるからです。 –

答えて

15

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

なぜgethostbyname()がレジストリキーを作成していると思いますか?実際に何が作成されていますか?何も作成してはいけません。これは、いくつかの外部コードがgethostbyname()にフックされていることを示唆するかもしれません。

+0

getaddrinfoも使用しましたが、Win2Kのサポートが必要です。 –

+1

+1 "これは、いくつかの外部コードがgethostbyname()に繋がっていることを示唆しているかもしれません" – kobik

+0

OllyDebugの画面を追加しました。 –