创建nameserver十六进制标头

时间:2012-11-28 14:02:31

标签: php sockets wireshark nameservers

我必须向名称服务器发出请求。 socketpart工作就像一个魅力,但要创建包我有一些问题。

$domainname = "google.nl";

$hexdomain = ascii2he($domainname);

$package = "\x01\x01\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x0b".$hexodmain."\x00\x00\xff\x00\x01";

这应该是我发送给名称服务器但是包不正确的包。什么是创建$ package的正确方法

1 个答案:

答案 0 :(得分:1)

首先,传递给名称服务器的名称不是以点分隔的,但名称的每个部分都是单独传输的。

其次,您不会将转换为十六进制的数据发送,而是直接发送。十六进制(\x01\x01)只是表示。

所以你会以google.nl的形式对"\x06google\x02nl\x00"进行编码,因为每个名称部分都以其长度开头,最后一个以\x00为后面,意味着空string - 反过来表示名称链的结尾。

因此,为了保持变量,您应该将域名拆分为其组件,并在每个组件前面加上相应的长度字节。

这样的东西
function domain2dns($domain)
{
    $split = explode(".", $domain);
    $target = ""; // cumulate here
    foreach ($split as $part) {
        // For every $part, prepend one byte denoting its length.
        // strlen($part) is its length which is supposed to be put into one character.
        $target .= chr(strlen($part)).$part;
    }
    return $target . "\x00";
}

可能有用

$domainname = "google.nl";

$dnsdomain = domain2dns($domainname);

$package = "\x01\x01\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00" . $dnsdomain . "\x00\xff\x00\x01";