⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packet.lua

📁 Overview是Linux,FreeBSD,UNIX,Windows下的网络扫描和嗅探工 具包,其基本功能有三个,一是探测一组主机是否在线 其次是扫描 主机端口,嗅探所提供的网络服务 还可以推断主机
💻 LUA
📖 第 1 页 / 共 2 页
字号:
		else			l = self:u8(offset + opt_ptr + 1)			if l > 2 then			d = self:raw(offset + opt_ptr + 2, l-2)			end		end		options[op].len  = l		options[op].data = d		opt_ptr = opt_ptr + l		op = op + 1	end	return optionsend-- print short information about current packetfunction Packet:tostring()	if self.tcp then		return self:tcp_tostring()	elseif self.icmp then		return self:icmp_tostring()	elseif self.ip then		return self:ip_tostring()	end	return "<no tostring!>"end------------------------------------------------------------------------------------------------------------------ PARSE ICMP PACKET HEADERfunction Packet:icmp_parse(force_continue)	self.icmp_offset	= self.ip_data_offset	if string.len(self.buf) < self.icmp_offset + 8 then -- let's say 8 bytes minimum		return false	end	self.icmp = true	self.icmp_type		= self:u8(self.icmp_offset + 0)	self.icmp_code		= self:u8(self.icmp_offset + 1)	self.icmp_sum		= self:u16(self.icmp_offset + 2)	if self.icmp_type == 3 or self.icmp_type == 4 or self.icmp_type == 11 or self.icmp_type == 12 then		self.icmp_payload = true		self.icmp_r0	  = self:u32(self.icmp_offset + 4)		self.icmp_payload_offset = self.icmp_offset + 8		if string.len(self.buf) < self.icmp_payload_offset + 24 then			return false		end		self.icmp_payload = Packet:new(self.buf:sub(self.icmp_payload_offset+1), self.packet_len - self.icmp_payload_offset, true)	end	return trueend-- return short information about icmp headerfunction Packet:icmp_tostring()	return self:ip_tostring() .. " ICMP(" .. self.icmp_payload:tostring() .. ")"end------------------------------------------------------------------------------------------------------------------ PARSE TCP HEADER FROM PACKETfunction Packet:tcp_parse(force_continue)	self.tcp = true	self.tcp_offset		= self.ip_data_offset	if string.len(self.buf) < self.tcp_offset + 4 then		return false	end	self.tcp_sport		= self:u16(self.tcp_offset + 0)	self.tcp_dport		= self:u16(self.tcp_offset + 2)	if string.len(self.buf) < self.tcp_offset + 20 then		if force_continue then			return true		else			return false		end	end	self.tcp_seq		= self:u32(self.tcp_offset + 4)	self.tcp_ack		= self:u32(self.tcp_offset + 8)	self.tcp_hl		= bit.rshift(bit.band(self:u8(self.tcp_offset+12), 0xF0), 4)	-- header_length or data_offset	self.tcp_x2		=            bit.band(self:u8(self.tcp_offset+12), 0x0F)	self.tcp_flags		= self:u8(self.tcp_offset + 13)	self.tcp_th_fin		= bit.band(self.tcp_flags, 0x01)~=0		-- true/false	self.tcp_th_syn		= bit.band(self.tcp_flags, 0x02)~=0	self.tcp_th_rst		= bit.band(self.tcp_flags, 0x04)~=0	self.tcp_th_push	= bit.band(self.tcp_flags, 0x08)~=0	self.tcp_th_ack		= bit.band(self.tcp_flags, 0x10)~=0	self.tcp_th_urg		= bit.band(self.tcp_flags, 0x20)~=0	self.tcp_th_ece		= bit.band(self.tcp_flags, 0x40)~=0	self.tcp_th_cwr		= bit.band(self.tcp_flags, 0x80)~=0	self.tcp_win		= self:u16(self.tcp_offset + 14)	self.tcp_sum		= self:u16(self.tcp_offset + 16)	self.tcp_urp		= self:u16(self.tcp_offset + 18)	self.tcp_opt_offset	= self.tcp_offset + 20	self.tcp_options	= self:parse_options(self.tcp_opt_offset, ((self.tcp_hl*4)-20))	self.tcp_data_offset	= self.tcp_offset + self.tcp_hl*4	self.tcp_data_length	= self.ip_len - self.tcp_offset - self.tcp_hl*4        self:tcp_parse_options()	return trueend-- return short information about tcp packetfunction Packet:tcp_tostring()	return string.format(		"TCP %s:%i -> %s:%i",		self.ip_src, self.tcp_sport,		self.ip_dst, self.tcp_dport		)end-- parse options for tcp headerfunction Packet:tcp_parse_options()        local eoo = false	for _,opt in ipairs(self.tcp_options) do                if eoo then                        self.tcp_opt_after_eol = true                end		if      opt.type == 0 then    -- end of options                        eoo = true                elseif 	opt.type == 2 then    -- MSS                        self.tcp_opt_mss = u16(opt.data, 0)                        self.tcp_opt_mtu = self.tcp_opt_mss + 40		elseif	opt.type == 3 then     -- widow scaling                        self.tcp_opt_ws  = u8(opt.data, 0)		elseif	opt.type == 8 then     -- timestamp                        self.tcp_opt_t1 = u32(opt.data, 0)                        self.tcp_opt_t2 = u32(opt.data, 4)		end	endendfunction Packet:tcp_set_sport(port)	self:set_u16(self.tcp_offset + 0, port)endfunction Packet:tcp_set_dport(port)	self:set_u16(self.tcp_offset + 2, port)end-- set tcp sequence fieldfunction Packet:tcp_set_seq(new_seq)	self:set_u32(self.tcp_offset + 4, new_seq)end-- set tcp flags field (like syn, ack, rst)function Packet:tcp_set_flags(new_flags)	self:set_u8(self.tcp_offset + 13, new_flags)end-- set urgent pointer fieldfunction Packet:tcp_set_urp(urg_ptr)	self:set_u16(self.tcp_offset + 18, urg_ptr)end-- set tcp checksum fieldfunction Packet:tcp_set_checksum(checksum)	self:set_u16(self.tcp_offset + 16, checksum)end-- count and save tcp checksum fieldfunction Packet:tcp_count_checksum()	self:tcp_set_checksum(0)	local proto	= self.ip_p	local length	= self.buf:len() - self.tcp_offset	local b = self.ip_bin_src ..		self.ip_bin_dst ..		string.char(0) ..		string.char(proto) ..		set_u16("..", 0, length) ..		self.buf:sub(self.tcp_offset+1)	self:tcp_set_checksum(in_cksum(b))end-- small database, mtu to link type string. Stolen from p0f.function Packet:tcp_lookup_link()        local mtu_def = {            {["mtu"]=256,   ["txt"]= "radio modem"},            {["mtu"]=386,   ["txt"]= "ethernut"},            {["mtu"]=552,   ["txt"]= "SLIP line / encap ppp"},            {["mtu"]=576,   ["txt"]= "sometimes modem"},            {["mtu"]=1280,  ["txt"]= "gif tunnel"},            {["mtu"]=1300,  ["txt"]= "PIX, SMC, sometimes wireless"},            {["mtu"]=1362,  ["txt"]= "sometimes DSL (1)"},            {["mtu"]=1372,  ["txt"]= "cable modem"},            {["mtu"]=1400,  ["txt"]= "(Google/AOL)"},            {["mtu"]=1415,  ["txt"]= "sometimes wireless"},            {["mtu"]=1420,  ["txt"]= "GPRS, T1, FreeS/WAN"},            {["mtu"]=1423,  ["txt"]= "sometimes cable"},            {["mtu"]=1440,  ["txt"]= "sometimes DSL (2)"},            {["mtu"]=1442,  ["txt"]= "IPIP tunnel"},            {["mtu"]=1450,  ["txt"]= "vtun"},            {["mtu"]=1452,  ["txt"]= "sometimes DSL (3)"},            {["mtu"]=1454,  ["txt"]= "sometimes DSL (4)"},            {["mtu"]=1456,  ["txt"]= "ISDN ppp"},            {["mtu"]=1458,  ["txt"]= "BT DSL (?)"},            {["mtu"]=1462,  ["txt"]= "sometimes DSL (5)"},            {["mtu"]=1470,  ["txt"]= "(Google 2)"},            {["mtu"]=1476,  ["txt"]= "IPSec/GRE"},            {["mtu"]=1480,  ["txt"]= "IPv6/IPIP"},            {["mtu"]=1492,  ["txt"]= "pppoe (DSL)"},            {["mtu"]=1496,  ["txt"]= "vLAN"},            {["mtu"]=1500,  ["txt"]= "ethernet/modem"},            {["mtu"]=1656,  ["txt"]= "Ericsson HIS"},            {["mtu"]=2024,  ["txt"]= "wireless/IrDA"},            {["mtu"]=2048,  ["txt"]= "Cyclom X.25 WAN"},            {["mtu"]=2250,  ["txt"]= "AiroNet wireless"},            {["mtu"]=3924,  ["txt"]= "loopback"},            {["mtu"]=4056,  ["txt"]= "token ring (1)"},            {["mtu"]=4096,  ["txt"]= "Sangoma X.25 WAN"},            {["mtu"]=4352,  ["txt"]= "FDDI"},            {["mtu"]=4500,  ["txt"]= "token ring (2)"},            {["mtu"]=9180,  ["txt"]= "FORE ATM"},            {["mtu"]=16384, ["txt"]= "sometimes loopback (1)"},            {["mtu"]=16436, ["txt"]= "sometimes loopback (2)"},            {["mtu"]=18000, ["txt"]= "token ring x4"},            }        if not self.tcp_opt_mss or self.tcp_opt_mss==0 then                return "unspecified"        end        for _,x in ipairs(mtu_def) do                local mtu = x["mtu"]                local txt = x["txt"]                if self.tcp_opt_mtu == mtu then                        return txt                end                if self.tcp_opt_mtu < mtu then                        return string.format("unknown-%i", self.tcp_opt_mtu)                end        end        return string.format("unknown-%i", self.tcp_opt_mtu)end------------------------------------------------------------------------------------------------------------------ UTILS-- get binary string  as hex stringfunction bintohex(str)        local b = ""        if not str then -- nil        	return ""        end        for c in string.gmatch(str, ".") do                b = string.format('%s%02x',b, string.byte(c))        end        return bend-- Parse specifically printed hex string as binary-- Only bytes [a-f0-9A-F] from input are interpreted. The rest is ignored.-- Number of interpreted bytes _must_ be even. *The input is interpreted in pairs*.-- hextobin("20 20 20")		-> "   "-- hextobin("414243")		-> "ABC"-- hextobin("\\41\\42\\43")	-> "ABC"-- hextobin("   41   42    43  ")-> "ABC"function hextobin(str)        local ret = ""        local a,b        if not str then -- nil        	return ""        end        for c in string.gmatch(str, "[0-9a-fA-F][0-9a-fA-F]") do        	a = string.byte(c:sub(1,1))        	b = string.byte(c:sub(2,2))        	if     a >= string.byte('a') then -- 97>a-f        		a = a - string.byte('a') + 10        	elseif a >= string.byte('A') then -- 65>A-F        		a = a - string.byte('A') + 10        	else -- 48> 0-9        		a = a - string.byte('0')        	end        	if     b >= string.byte('a') then -- 97>a-f        		b = b - string.byte('a') + 10        	elseif b >= string.byte('A') then -- 65>A-F        		b = b - string.byte('A') + 10        	else -- 48> 0-9        		b = b - string.byte('0')        	end        	--io.write(string.format(">%s %i %i\n",c, a, b))                ret = ret .. string.char(a*16 + b)        end        --io.write(string.format(">%s|%s<\n",bintohex(ret), str))        return retend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -