Ping包的DNS查询代码For Delphi
抓包抓的是Ping包的查询不是Nslookup所以内容有点少
Type PDNS_HDR = ^DNS_HDR; DNS_HDR = Record id :Word; //ID编号有本地指定 服务器 返回时也带有此ID tag :Word; numq :Word; numa :Word; numa1 :Word; numa2 :Word; End; PDNS_QER = ^DNS_QER; DNS_QER = Record utype :Word; classes :Word; End; TIPAddr = Array [0..3] Of Byte; Const BUF_SIZE = 1024; SRV_PORT = 53; Function QueryDNS(szHost:PAnsiChar; Server:PAnsiChar):TIPAddr; Label OnExit; Var dnshdr :PDNS_HDR; dnsqer :PDNS_QER; Buffer :Array [0..BUF_SIZE-1] Of Byte; nSocket:TSocket; SerAddr:TSockAddrIn; I :Integer; nRet :Integer; dwLen :Integer; begin ZeroMemory(@Result, SizeOf(TIPAddr)); nSocket := socket(AF_INET, SOCK_DGRAM, 0); If nSocket = INVALID_SOCKET then Exit; SetSocketIoOutTime(nSocket, 8000); SerAddr.sin_family := AF_INET; SerAddr.sin_port := Htons(SRV_PORT); SerAddr.sin_addr.s_addr := Inet_Addr(Server); if SerAddr.sin_addr.s_addr = SOCKET_ERROR then Goto OnExit; ZeroMemory(@Buffer, BUF_SIZE); Randomize; dnshdr := @Buffer; dnshdr^.id := Random(65534); //随机个ID dnshdr^.tag := htons($0100); dnshdr^.numq := htons(1); dnshdr^.numa := 0; lstrcpyA(@Buffer[SizeOf(DNS_HDR) + 1], szHost); I := SizeOf(DNS_HDR) + 1; dwLen := 0; While dwLen < lstrlenA(szHost)-2 Do begin if Buffer[I + dwLen] = 0 then Break; If AnsiChar(Buffer[I + dwLen]) = '.' Then begin Buffer[I - 1] := dwLen; Inc(I, dwLen + 1); dwLen := 0; end Else begin Inc(dwLen); end; end; Buffer[I - 1] := dwLen; dnsqer := PDNS_QER(@Buffer[SizeOf(DNS_HDR) + 3 + lstrlenA(szHost) - 1]); dnsqer^.utype := htons(1); dnsqer^.classes := htons(1); sendto(nSocket, Buffer, SizeOf(DNS_HDR) + SizeOf(DNS_QER) + lstrlenA(szHost) + 2, 0, SerAddr, SizeOf(TSockAddrIn)); I := SizeOf(TSockAddrIn); ZeroMemory(@Buffer, BUF_SIZE); nRet := recvfrom(nSocket, Buffer, BUF_SIZE, 0, SerAddr, I); if dnshdr.numa = 0 then //这里=0是不存在的域名 begin Result[0] := 0; Result[1] := 0; Result[2] := 0; Result[3] := 0; Goto OnExit; End Else begin dwLen := nRet - 4; Result[0] := Buffer[dwLen]; Result[1] := Buffer[dwLen+1]; Result[2] := Buffer[dwLen+2]; Result[3] := Buffer[dwLen+3]; end; OnExit : closesocket(nSocket); end;