PERFORCE change 181048 for review
Gabriel Silva
gsilva at FreeBSD.org
Fri Jul 16 12:27:33 UTC 2010
http://p4web.freebsd.org/@@181048?ac=10
Change 181048 by gsilva at gsilva on 2010/07/16 12:27:10
Moved the field generation methods from Fuzzer to Generator class.
Created a Frame class that knows how to generate itself.
Affected files ...
.. //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/fuzzer.py#5 edit
Differences ...
==== //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/fuzzer.py#5 (text+ko) ====
@@ -12,36 +12,18 @@
from pcs.packets import ieee80211
from optparse import OptionParser
-class Fuzzer:
+class Generator:
"""
- The main fuzzer class
+ The Generator class
"""
- def __init__(self, interface, channel, state, type, dump):
- """initialize the fuzzer"""
- self.interface = interface
- self.channel = channel
- self. state = state
- self.type = type
- self.frame_number = 0
- self.dump = dump
-
- self.output = PcapConnector(self.interface, wireless = True)
-
- if self.dump:
- self.dumpfile = self.generate_dump_filename()
- self.output_dump = PcapDumpConnector(self.dumpfile)
-
- def generate_dump_filename(self):
- """generate a dump filename based on current time"""
- filename = strftime("%Y-%m-%d_%H-%M-%S") + ".dump"
- return filename
-
- def generate_int(self, bits):
+ @staticmethod
+ def generate_int(bits):
"""generate an integer with given size"""
return random.getrandbits(bits)
- def generate_string(self, size, restrict_chars = None):
+ @staticmethod
+ def generate_string(size, restrict_chars = None):
"""generate a string with given size and alphabet"""
if restrict_chars:
string = "".join(random.sample(restrict_chars, size))
@@ -50,40 +32,87 @@
return string
- def generate_addr(self):
+ @staticmethod
+ def generate_addr():
"""generate a valid 802.11 address"""
- addr = self.generate_string(2, string.hexdigits[:16])
+ addr = Generator.generate_string(2, string.hexdigits[:16])
for i in range(0,5):
addr += ":"
- addr += self.generate_string(2, string.hexdigits[:16])
+ addr += Generator.generate_string(2, string.hexdigits[:16])
return ieee80211.ieee80211_atob(addr)
- def generate_frame(self):
- """generate a frame to inject"""
- radio = radiotap.radiotap()
- radio.version = 0;
- radio.pad = 0;
- radio.length = 0;
+
+class Frame:
+ """
+ The Frame class
+ """
+
+ def __init__(self, state, mode):
+ """initialize the Frame"""
+ self.radio = radiotap.radiotap()
+ self.frame = ieee80211.frame()
+ self.chain = None
+
+ self.generate(state, mode)
+
+ def __getattr__(self, name):
+ if name == 'frame':
+ return self._chain
+
+ def generate(self, state, mode):
+ """generate a frame of given state using one of the generation modes"""
+ self.radio.version = 0;
+ self.radio.pad = 0;
+ self.radio.length = 0;
+
+ self.frame = ieee80211.frame()
+ self.frame.fc0 = Generator.generate_int(8);
+ self.frame.fc1 = Generator.generate_int(8);
+ self.frame.dur = Generator.generate_int(16);
+ self.frame.addr1 = Generator.generate_addr();
+ self.frame.addr2 = Generator.generate_addr();
+ self.frame.addr3 = Generator.generate_addr();
+ self.frame.seq = Generator.generate_int(16);
+
+ self.chain = Chain([self.radio, self.frame])
+
+
+class Fuzzer:
+ """
+ The main fuzzer class
+ """
+
+ def __init__(self, interface, channel, state, mode, dump):
+ """initialize the fuzzer"""
+ self.interface = interface
+ self.channel = channel
+ self.state = state
+ self.mode = mode
+ self.frame_number = 0
+ self.dump = dump
+
+ self.output = PcapConnector(self.interface, wireless = True)
- frame = ieee80211.frame()
- frame.fc0 = self.generate_int(8);
- frame.fc1 = self.generate_int(8);
- frame.dur = self.generate_int(16);
- frame.addr1 = self.generate_addr();
- frame.addr2 = self.generate_addr();
- frame.addr3 = self.generate_addr();
- frame.seq = self.generate_int(16);
+ if self.dump:
+ self.dumpfile = self.create_dump_filename()
+ self.output_dump = PcapDumpConnector(self.dumpfile)
- chain = Chain([radio, frame])
+ def create_dump_filename(self):
+ """create a dump filename based on current time"""
+ filename = strftime("%Y-%m-%d_%H-%M-%S") + ".dump"
+ return filename
- return chain
+ def generate_frame(self):
+ """generate a frame to inject"""
+ frame = Frame(self.state, self.mode)
+ return frame.frame
def send_frame(self, frame):
"""send a generated frame, dumping if requested"""
if self.dump:
- self.output_dump.write(frame.__repr__())
+ self.output_dump.write(frame)
out = self.output.write(frame.bytes, len(frame.bytes))
self.frame_number += 1
@@ -111,9 +140,9 @@
dest="state", default=1,
help="Which state to fuzz: 1, 2 or 3. [default %default]")
- parser.add_option("-t", "--type",
- dest="type", default="random",
- help="Which fuzzer type: random, corner-cases. [default %default]")
+ parser.add_option("-m", "--mode",
+ dest="mode", default="random",
+ help="Which fuzzer mode: random, corner-cases. [default %default]")
parser.add_option("-d", "--dump",
dest="dump", default=False, action="store_true",
@@ -124,7 +153,7 @@
if len(args) != 1:
parser.error("Must provide at least the interface to inject the frames.")
- fuzzer = Fuzzer(args[0], options.channel, options.state, options.type, options.dump)
+ fuzzer = Fuzzer(args[0], options.channel, options.state, options.mode, options.dump)
fuzzer.start()
if __name__ == "__main__":
More information about the p4-projects
mailing list