2014-04-27 3 views
1

일반적으로 DNS 응답을 디코딩하려고합니다. 나는 응답의 'questions'섹션에서 이름을 검색하는 것으로까지 만들었지 만 'answers'섹션에서 IP 주소를 추출 할 수는 없습니다. 나는 InetAddress.getByName()을 잘 알고 있지만 필요한 것은 아니다. 내 기본 문제는 정말 무엇을하고 있었는지에주의를 지불하지 않고 내의 readShort()를 사용하여 그래서 나는 enter image description hereDNS 응답에서 IP 가져 오기

private static void disectQuery(byte[] received) { 

    ByteArrayInputStream bais = new ByteArrayInputStream(received); 
    DataInputStream DataIS = new DataInputStream (bais); 

    DNSResponse Response = new DNSResponse(); 

    try { 
     Response.TID = DataIS.readShort(); 
     Response.Flags = DataIS.readShort(); 
     Response.NumQuestions = DataIS.readShort(); 
     Response.NumAnswers = DataIS.readShort(); 
     Response.NumAuthorities = DataIS.readShort(); 
     Response.NumAdditional = DataIS.readShort(); 

     String rest = null; 
     int questionsLeft = Response.NumQuestions; 
     while(questionsLeft-- > 0) { 
      byte[] buffer = new byte[lastHostQueried.length()+1]; 
      DataIS.readFully (buffer); 
      rest = new String(buffer, "latin1"); 
      int queryType = DataIS.readShort(); 
      int queryClass = DataIS.readShort(); 
     } 
     int answersLeft = Response.NumAnswers; 
     int i=13; 
     while(i-- > 0) { 
      DataIS.readShort(); 
     } 
     while(answersLeft-- > 0) { 
      ???? 
     } 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 

답변

0

좋아요 ... IP 주소의 바이트 세트를 변환하는 방법을 알아낼 필요가있다. readUnsignedByte() 사용하기 저는 wireshark에서보고 있던 것과 동일한 정보를 추출 할 수 있습니다. 그래서 모든 데이터를 문자열로 옮긴 다음 IP 주소를 파싱했습니다.

 //Move remaining response bytes into string 
     String answers = ""; 
     try { 
      while(true) { 
       rest = DataIS.readUnsignedByte() + ""; 
       answers += Integer.parseInt(rest, 10) + " "; 
      } 
     } 
     catch(EOFException ignore) {} 
     String[] answersArray = answers.split(" "); 

     //Initialize IPAddresses array 
     String IPAddresses[] = new String[Response.NumAnswers]; 
     for(int i=0; i<Response.NumAnswers; i++) 
      IPAddresses[i] = ""; 

     int offset = 12; 
     for(int i=0; i<Response.NumAnswers; i++) { 


      int j=0; 
      while(j++<3) 
       IPAddresses[i] += answersArray[offset+j] + "."; 
      IPAddresses[i] += answersArray[offset+j] + ""; 
      offset += 16; 
     } 
+0

사용하신 최종 코드를 제공해 주시겠습니까? – danieln

관련 문제