Skip to content

Instantly share code, notes, and snippets.

@yarshure
Created December 24, 2015 09:51
Show Gist options
  • Select an option

  • Save yarshure/0d96bf9990a9ee5bbb3a to your computer and use it in GitHub Desktop.

Select an option

Save yarshure/0d96bf9990a9ee5bbb3a to your computer and use it in GitHub Desktop.
Swift DNSPacket parser
import Foundation
import Darwin
class DNSPacket: NSObject {
var identifier:UInt16 = 0
var queryDomains:[String] = []
var rawData:NSData
// override init() {
//
// }
init(data:NSData) {
if data.length < 12 {
NSLog("data error")
}
let bytes:UnsafePointer<UInt16> = UnsafePointer<UInt16>.init(data.bytes)
var p:UnsafePointer<UInt16> = bytes
identifier = bytes.memory
p = bytes + 2
let count:UInt16 = p.memory.bigEndian
p = p + 4
var ptr:UnsafePointer<UInt8> = UnsafePointer<UInt8>.init(p)
let endptr:UnsafePointer<UInt8> = ptr.advancedBy(data.length-6*2)
for _ in 0..<count {
var domainString:String = ""
var domainLength = 0
while (ptr.memory != 0x0) {
let len = Int(ptr.memory)
ptr++
if ptr.distanceTo(endptr) < len {
NSLog("error return ")
}
let s = NSString.init(bytes: ptr, length: len, encoding: NSUTF8StringEncoding) as! String
domainString = domainString + s + "."
ptr = ptr + Int(len)
domainLength += len
domainLength++
}
ptr += 3
if (ptr.distanceTo(endptr) <= 0 ) { NSLog("data error") }
queryDomains.append(domainString)
}
rawData = data
super.init()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment