Skip to content

Instantly share code, notes, and snippets.

@shutingrz
Last active August 29, 2015 14:26
Show Gist options
  • Save shutingrz/9f7cff79cb7f6db4f31d to your computer and use it in GitHub Desktop.
Save shutingrz/9f7cff79cb7f6db4f31d to your computer and use it in GitHub Desktop.
#!/usr/local/bin/ruby
require "socket"
class Qflag
def initialize()
@qr = 0
@opcode = 0
@aa = 0
@tc = 0
@rd = 0
@ra = 0
@reserve = 0
@rcode = 0
end
attr_accessor :qr, :opcode, :aa, :tc, :rd, :ra, :reserve, :rcode
end
class Type
def initialize()
@A = "0001"
@TKEY = "00F9"
end
attr_accessor :A, :TKEY
end
class Controller
def initialize()
@query = ""
@qflags = Qflag.new
@txid = "0001"
@flag = "0000"
@querylen = "0001"
@anslen = "0000"
@authlen = "0000"
@addlen = "0000"
@qname = ""
@srvIP = ""
@type = "0001"
@class = "0001"
end
def setQR(flag)
@qflags.qr = flag
end
def showQflag()
puts "QR\t:#{@qflags.qr}"
puts "OPCODE\t:#{@qflags.opcode}"
puts "AA\t:#{@qflags.aa}"
puts "TC\t:#{@qflags.tc}"
puts "RD\t:#{@qflags.rd}"
puts "RA\t:#{@qflags.ra}"
puts "RCODE\t:#{@qflags.rcode}"
end
def asmFlag()
flags = @qflags
@flag = "0000" #flag todo
end
def setQname(name)
asmQname(name)
end
def asmQname(name)
#ホスト名をDNSの問い合わせ用の文字列に変換
#"aaa.link" => "03616161046c696e6b"
names = Array.new
parts = name.split(".")
parts.each do |part|
len = part.length
len = len.to_s(16).to_s #数値を16進数に直してからStringに
@qname = @qname + [len.to_s].pack("h*").unpack("H*")[0]
@qname = @qname + part.unpack("H*")[0]
end
@qname = @qname + "00" #終端
end
def asmQnameAny(bin)
@qname = bin
end
def setSrvIP(str)
@srvIP = str
end
def createQuery()
@query = @txid + @flag + @querylen + @anslen + @authlen + @addlen +@qname + @type + @class
puts @query
end
def sendQuery()
createQuery()
udp = UDPSocket.open()
sockaddr = Socket.pack_sockaddr_in(53, @srvIP)
querybin = [@query].pack("H*")
udp.send(querybin, 0, sockaddr)
udp.close
end
def setType(type)
@type = type
end
attr_accessor :qflag
end
$Type = Type.new
ctl = Controller.new
srvIPAddr = ARGV[0]
qnamedata = ARGV[1]
#ctl.setQname("aaa.shutest2015.link")
ctl.asmQnameAny(qnamedata)
ctl.setSrvIP(srvIPAddr)
ctl.setType($Type.TKEY)
ctl.sendQuery()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment