private static void VerifyAnswer(DnsPacket dnsPacket, string StrAddressExpected, int ttl) { Assert.IsTrue(dnsPacket.TransactionId == 0x000a); //Assert.IsTrue(0x8180 == dnsPacket.Flags.Flag); Assert.IsTrue(dnsPacket.Flags.IsOpcodeValid); Assert.IsTrue(dnsPacket.Flags.Rd); Assert.IsTrue(dnsPacket.Flags.Qr); Assert.IsTrue(dnsPacket.Flags.Ra); Assert.IsTrue(1 == dnsPacket.Body.Qdcount); Assert.IsTrue(1 == dnsPacket.Body.Ancount); Assert.IsTrue(0 == dnsPacket.Body.Arcount); Assert.IsTrue(0 == dnsPacket.Body.Nscount); Assert.IsTrue(1 == dnsPacket.Body.Queries.Count); Assert.IsTrue(1 == dnsPacket.Body.Answers.Count); DnsPacket.Query q = dnsPacket.Body.Queries[0]; Assert.IsTrue(DnsPacket.TypeType.Mx == q.Type); Assert.IsTrue(DnsPacket.ClassType.InClass == q.QueryClass); Assert.AreEqual(q.Name.GetFullName(), StrQueryDomainName); DnsPacket.Answer a = dnsPacket.Body.Answers[0]; Assert.IsTrue(DnsPacket.ClassType.InClass == a.AnswerClass); Assert.IsTrue(ttl == a.Ttl); Assert.IsTrue(DnsPacket.TypeType.Mx == a.Type); Assert.AreEqual(a.Name.GetFullName(), StrQueryDomainName); Assert.IsTrue(a.Payload is MxInfo); MxInfo mi = (MxInfo)a.Payload; Assert.AreEqual(mi.Mx.GetFullName(), "smtpin.vvv.facebook.com"); Assert.AreEqual(mi.Preference, 10); }
private static void VerifyAnswer(DnsPacket dnsPacket, string StrAddressExpected, int ttl) { Assert.AreEqual(dnsPacket.TransactionId, (ushort)0x1622); //Assert.AreEqual((ushort)0x8180, dnsPacket.Flags.Flag); Assert.IsTrue(dnsPacket.Flags.IsOpcodeValid); Assert.IsTrue(dnsPacket.Flags.Rd); Assert.IsTrue(dnsPacket.Flags.Qr); Assert.IsTrue(dnsPacket.Flags.Ra); Assert.IsTrue(1 == dnsPacket.Body.Qdcount); Assert.IsTrue(0 == dnsPacket.Body.Ancount); Assert.IsTrue(0 == dnsPacket.Body.Arcount); Assert.IsTrue(0 == dnsPacket.Body.Nscount); Assert.IsTrue(1 == dnsPacket.Body.Queries.Count); Assert.IsTrue(null == dnsPacket.Body.Answers); DnsPacket.Query q = dnsPacket.Body.Queries[0]; Assert.AreEqual(DnsPacket.TypeType.Aaaa, q.Type); Assert.AreEqual(DnsPacket.ClassType.InClass, q.QueryClass); Assert.AreEqual(q.Name.GetFullName(), StrQueryDomainName); //DnsPacket.Answer a = dnsPacket.Body.Answers[0]; //Assert.IsTrue(DnsPacket.ClassType.InClass == a.AnswerClass); //Assert.IsTrue(ttl == a.Ttl); //Assert.IsTrue(DnsPacket.TypeType.Aaaa == a.Type); //Assert.AreEqual(a.Name.GetFullName(), StrQueryDomainName); //VerifyPayloadAddressV6(a, StrAddressExpected); }
private static void VerifyAnswer(DnsPacket dnsPacket, string StrAddressExpected, int ttl) { Assert.IsTrue(dnsPacket.TransactionId == 0xf478); //Assert.IsTrue(0x8180 == dnsPacket.Flags.Flag); Assert.IsTrue(dnsPacket.Flags.IsOpcodeValid); Assert.IsTrue(dnsPacket.Flags.Rd); Assert.IsTrue(dnsPacket.Flags.Qr); Assert.IsTrue(dnsPacket.Flags.Ra); Assert.IsTrue(1 == dnsPacket.Body.Qdcount); Assert.IsTrue(0 == dnsPacket.Body.Arcount); Assert.IsTrue(1 == dnsPacket.Body.Ancount); Assert.IsTrue(0 == dnsPacket.Body.Nscount); Assert.IsTrue(1 == dnsPacket.Body.Queries.Count); Assert.IsTrue(1 == dnsPacket.Body.Answers.Count); DnsPacket.Query q = dnsPacket.Body.Queries[0]; Assert.IsTrue(DnsPacket.TypeType.A == q.Type); Assert.IsTrue(DnsPacket.ClassType.InClass == q.QueryClass); VerifyName(q.Name.Name, StrQueryDomainName); DnsPacket.Answer a = dnsPacket.Body.Answers[0]; Assert.IsTrue(DnsPacket.ClassType.InClass == a.AnswerClass); Assert.IsTrue(ttl == a.Ttl); Assert.IsTrue(DnsPacket.TypeType.A == a.Type); VerifyRefName(a.Name.Name); VerifyPayloadAddress(a, StrAddressExpected); }
public void ParseInvalidRefNameLength() { // Modify name segment length to exceed packet data end // offset 36, 0xC0, -> pointer, offset 0 << 8 + data[37] // offset 37, 0x0C, -> begining of name in header, 'china' // modify offset as 24, so that offset + length >= data size, i.e. 36 byte[] byteData = udpPackets[2].PayloadData; Assert.IsTrue(0xC0 == byteData[36]); Assert.IsTrue(0x0C == byteData[37]); byteData[36] = 0xC1; byteData[37] = (byte)byteData.Length; //try { DnsPacket dnsPacket = new DnsPacket(new KaitaiStream(byteData)); DnsPacket.Query q = dnsPacket.Body.Queries[0]; VerifyName(q.Name.Name, StrQueryDomainName); DnsPacket.Answer a = dnsPacket.Body.Answers[0]; Assert.IsTrue(DnsPacket.ClassType.InClass == a.AnswerClass); Assert.IsTrue(600 == a.Ttl); Assert.IsTrue(DnsPacket.TypeType.A == a.Type); //VerifyRefName(a.Name.Name); { Assert.AreEqual((int)1, a.Name.Name.Count); Label l = a.Name.Name[0]; Assert.IsTrue(l.IsPointer); Assert.IsTrue(0xC1 == l.Length); Assert.IsTrue(byteData.Length == l.Pointer.Value); PointerStruct ps = l.Pointer; try { VerifyName(ps.Contents.Name, StrQueryDomainName); } catch (System.IO.EndOfStreamException) { Assert.IsTrue(true); } } } //catch (System.IO.EndOfStreamException) { Assert.IsTrue(true); } return; }
private static void VerifyAnswer(DnsPacket dnsPacket, string StrAddressExpected, int ttl) { Assert.AreEqual(dnsPacket.TransactionId, (ushort)0x0006); //Assert.AreEqual((ushort)0x8180, dnsPacket.Flags.Flag); Assert.IsTrue(dnsPacket.Flags.IsOpcodeValid); Assert.IsTrue(dnsPacket.Flags.Rd); Assert.IsTrue(dnsPacket.Flags.Qr); Assert.IsTrue(dnsPacket.Flags.Ra); Assert.AreEqual((ushort)1, dnsPacket.Body.Qdcount); Assert.AreEqual((ushort)1, dnsPacket.Body.Ancount); Assert.AreEqual(1, dnsPacket.Body.Nscount); Assert.AreEqual(0, dnsPacket.Body.Arcount); Assert.IsTrue(1 == dnsPacket.Body.Queries.Count); Assert.IsTrue(1 == dnsPacket.Body.Answers.Count); Assert.IsTrue(1 == dnsPacket.Body.Authorities.Count); DnsPacket.Query q = dnsPacket.Body.Queries[0]; Assert.IsTrue(DnsPacket.TypeType.Aaaa == q.Type); Assert.IsTrue(DnsPacket.ClassType.InClass == q.QueryClass); VerifyName(q.Name.Name, StrQueryDomainName); DnsPacket.Answer a = dnsPacket.Body.Answers[0]; Assert.AreEqual(DnsPacket.ClassType.InClass, a.AnswerClass); Assert.AreEqual(ttl, a.Ttl); Assert.AreEqual(DnsPacket.TypeType.Cname, a.Type); VerifyRefName(a.Name.Name); DnsPacket.Answer ns = dnsPacket.Body.Authorities[0]; Assert.AreEqual(DnsPacket.ClassType.InClass, ns.AnswerClass); Assert.AreEqual(37, ns.Ttl); Assert.AreEqual(DnsPacket.TypeType.Soa, ns.Type); Assert.AreEqual(53, ns.Rdlength); Assert.AreEqual(ns.Payload.GetType(), typeof(DnsPacket.AuthorityInfo)); Assert.AreEqual(ns.Name.GetFullName(), "github.com"); DnsPacket.AuthorityInfo nsInfo = (DnsPacket.AuthorityInfo)ns.Payload; Assert.AreEqual(nsInfo.ExpireLimit, (uint)604800); Assert.AreEqual(nsInfo.MinTtl, (uint)60); Assert.AreEqual(nsInfo.Serial, (uint)1592319081); Assert.AreEqual(nsInfo.RetryInterval, (uint)600); Assert.AreEqual(nsInfo.RefreshInterval, (uint)3600); VerifyName(nsInfo.PrimaryNs.Name, "ns1.p16.dynect.net"); Assert.AreEqual(nsInfo.ResoponsibleMailbox.GetFullName(), "hostmaster.github.com"); }
public void ParseRequest() { DnsPacket dnsPacket = new DnsPacket(new KaitaiStream(udpPackets[1].PayloadData)); Assert.AreEqual(dnsPacket.TransactionId, (ushort)0x1622); //Assert.AreEqual((ushort)0x0100, dnsPacket.Flags.Flag); Assert.IsTrue(dnsPacket.Flags.IsOpcodeValid); Assert.IsTrue(dnsPacket.Flags.Rd); Assert.AreEqual((ushort)1, dnsPacket.Body.Qdcount); Assert.IsTrue(0 == dnsPacket.Body.Arcount); Assert.IsTrue(0 == dnsPacket.Body.Ancount); Assert.IsTrue(0 == dnsPacket.Body.Nscount); Assert.AreEqual((ushort)1, dnsPacket.Body.Queries.Count); DnsPacket.Query q = dnsPacket.Body.Queries[0]; Assert.AreEqual(DnsPacket.TypeType.Aaaa, q.Type); Assert.AreEqual(DnsPacket.ClassType.InClass, q.QueryClass); Assert.AreEqual(q.Name.GetFullName(), StrQueryDomainName); return; }
public void ParseRequest() { DnsPacket dnsPacket = new DnsPacket(new KaitaiStream(udpPackets[8].PayloadData)); Assert.IsTrue(dnsPacket.TransactionId == 0x000a); //Assert.IsTrue(0x0100 == dnsPacket.Flags.Flag); Assert.IsTrue(dnsPacket.Flags.IsOpcodeValid); Assert.IsTrue(dnsPacket.Flags.Rd); Assert.IsTrue(1 == dnsPacket.Body.Qdcount); Assert.IsTrue(0 == dnsPacket.Body.Arcount); Assert.IsTrue(0 == dnsPacket.Body.Ancount); Assert.IsTrue(0 == dnsPacket.Body.Nscount); Assert.IsTrue(1 == dnsPacket.Body.Queries.Count); DnsPacket.Query q = dnsPacket.Body.Queries[0]; Assert.IsTrue(DnsPacket.TypeType.Mx == q.Type); Assert.IsTrue(DnsPacket.ClassType.InClass == q.QueryClass); VerifyName(q.Name.Name, StrQueryDomainName); return; }
public DnsQuery(DnsPacket.Query dnsQuery) { this.Type = dnsQuery.Type; this.Name = dnsQuery.Name.ToJoinedString(); }
public void ParseLoopRefNameOffset() { // Modify name segment length to exceed packet data end // offset 36, 0xC0, -> pointer, offset 0 << 8 + data[37] // offset 37, 0x0C, -> begining of name in header, 'china' // modify offset as 24, so that offset + length >= data size, i.e. 36 byte[] byteData = udpPackets[2].PayloadData; Assert.IsTrue(0xC0 == byteData[36]); Assert.IsTrue(0x0C == byteData[37]); byteData[36] = 0xC0; byteData[37] = 36; //try { DnsPacket dnsPacket = new DnsPacket(new KaitaiStream(byteData)); DnsPacket.Query q = dnsPacket.Body.Queries[0]; VerifyName(q.Name.Name, StrQueryDomainName); DnsPacket.Answer a = dnsPacket.Body.Answers[0]; Assert.IsTrue(DnsPacket.ClassType.InClass == a.AnswerClass); Assert.IsTrue(600 == a.Ttl); Assert.IsTrue(DnsPacket.TypeType.A == a.Type); //VerifyRefName(a.Name.Name); { Assert.AreEqual((int)1, a.Name.Name.Count); Label l = a.Name.Name[0]; Assert.IsTrue(l.IsPointer); Assert.IsTrue(0xC0 == l.Length); Assert.IsTrue(36 == l.Pointer.Value); PointerStruct ps = l.Pointer; try { //VerifyName(ps.Contents.Name, StrQueryDomainName); Assert.AreEqual(1, ps.Contents.Name.Count); Label l2 = ps.Contents.Name[0]; Assert.AreEqual(true, l2.IsPointer); Assert.AreEqual(0xC0, l2.Length); Assert.AreEqual((byte)36, l2.Pointer.Value); } catch (Exception) { Assert.Fail(); } // Try to get full name will cause exception try { Assert.AreEqual(a.Name.GetFullName(), ""); Assert.Fail("Exception expected"); } catch (ArgumentOutOfRangeException e) { Console.WriteLine("Exception expected in detecting ref loop: {0}", e.Message); } } } //catch (System.IO.EndOfStreamException) { Assert.IsTrue(true); } return; }