67 lines
1.9 KiB
Ruby
67 lines
1.9 KiB
Ruby
# -*- coding: binary -*-
|
|
module PacketFu
|
|
|
|
# The Inject class handles injecting arrays of binary data on the wire.
|
|
#
|
|
# To inject single packets, use PacketFu::Packet.to_w() instead.
|
|
class Inject
|
|
attr_accessor :array, :stream, :show_live # Leave these public and open.
|
|
attr_reader :iface, :snaplen, :promisc, :timeout # Cant change after the init.
|
|
|
|
def initialize(args={})
|
|
@array = [] # Where the packet array goes.
|
|
@stream = [] # Where the stream goes.
|
|
@iface = args[:iface] || ENV['IFACE'] || Pcap.lookupdev || "lo"
|
|
@snaplen = args[:snaplen] || 0xffff
|
|
@promisc = args[:promisc] || false # Sensible for some Intel wifi cards
|
|
@timeout = args[:timeout] || 1
|
|
@show_live = nil
|
|
end
|
|
|
|
# Takes an array, and injects them onto an interface. Note that
|
|
# complete packets (Ethernet headers on down) are expected.
|
|
#
|
|
# === Parameters
|
|
#
|
|
# :array || arr
|
|
# An array of binary data (usually packet.to_s style).
|
|
# :int || sleep
|
|
# Number of seconds to sleep between injections (in float format)
|
|
# :show_live || :live
|
|
# If true, puts data about what was injected to stdout.
|
|
#
|
|
# === Example
|
|
#
|
|
# inj = PacketFu::Inject.new
|
|
# inj.array_to_wire(:array => [pkt1, pkt2, pkt3], :sleep => 0.1)
|
|
#
|
|
def array_to_wire(args={})
|
|
pkt_array = args[:array] || args[:arr] || @array
|
|
interval = args[:int] || args[:sleep]
|
|
show_live = args[:show_live] || args[:live] || @show_live
|
|
|
|
@stream = Pcap.open_live(@iface,@snaplen,@promisc,@timeout)
|
|
pkt_count = 0
|
|
pkt_array.each do |pkt|
|
|
@stream.inject(pkt)
|
|
sleep interval if interval
|
|
pkt_count +=1
|
|
puts "Sent Packet \##{pkt_count} (#{pkt.size})" if show_live
|
|
end
|
|
# Return # of packets sent, array size, and array total size
|
|
[pkt_count, pkt_array.size, pkt_array.join.size]
|
|
end
|
|
|
|
# Equivalent to array_to_wire
|
|
def a2w(args={})
|
|
array_to_wire(args)
|
|
end
|
|
|
|
# Equivalent to array_to_wire
|
|
def inject(args={})
|
|
array_to_wire(args)
|
|
end
|
|
|
|
end
|
|
end
|