2012-11-28 2 views
0

네임 서버에 요청해야합니다. socketpart는 매력처럼 작동하지만 패키지를 만들려면 몇 가지 문제가 있습니다.네임 서버 16 진수 헤더를 생성하십시오.

$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

먼저 네임 서버에 전달한 이름은 점으로 구분되지 않지만 이름의 모든 부분은 별도로 전송됩니다.

둘째, 16 진수로 변환 된 데이터를 보내지 않고 직접 보냅니다. 16 진수 (\x01\x01)는 단지 표현입니다.

그래서 이름 부분의 각각의 길이가 선행되는대로, 형태 "\x06google\x02nl\x00"google.nl을 인코딩 할 것이며, 마지막 하나는 빈 문자열 의미 \x00에 의해 계승 - 차례로 이름의 끝을 의미 체인.

변수를 유지하려면 도메인 이름을 해당 구성 요소로 분할하고 각 구성 요소 앞에 해당 길이 바이트를 두어야합니다. 그런 "\ x06google \ x02nl \ 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"; 
+0

을 할

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"; } 

같은 뭔가가 나의 패키지가 유용 할 수 있습니다? –

+0

@GertKommer 아니요, 저는 그 부분의 "이름 부분"만을 언급했습니다. 그 주변의 패킷은 적절히 구축되어야합니다. 나는 당신의''\ x01 \ x01 ... ''이 조심스럽게 선택되어 맞다고 생각합니다. – glglgl

+0

@GertKommer http://www.firewall.cx/networking-topics/protocols/domain-name-system-dns/160-protocols-dns-query.html에 따르면 더 자세한 정보를 얻으려면 ID가' 0x0101', 표준 질의와 하나의 질문. 따라서 패킷은 "\ x01 \ x01 \ x01 \ x00 \ x00 \ x01 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00"이어야합니다. "\ x06google \ x02nl \ x00". "\ x00 \ xff \ x00 \ x01 "'두 번째 부분은 적절한 형식의 호스트 이름이고 세 번째 부분은 유형 및 클래스입니다. – glglgl