# HG changeset patch # User Tero Marttila # Date 1403647182 -10800 # Node ID 8f3d13f47404cb48f96141e01b492c609a06299c initial import diff -r 000000000000 -r 8f3d13f47404 udpflood.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/udpflood.py Wed Jun 25 00:59:42 2014 +0300 @@ -0,0 +1,74 @@ +import dpkt +import ipaddr +import os +import random +import socket +import struct +import sys +import time + +IP_HDR = struct.Struct('! BBH HH BBH 4s 4s') +UDP_HDR = struct.Struct('! HH HH') + +def udpflood (dst, rate=None): + sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) + + daddr = ipaddr.IPAddress(dst).packed + dport = 1337 + ttl = 64 + + t0 = time.time() + t1 = 0.0 + count = 0 + size = 0 + + while True: + saddr = 'ABC' + os.urandom(1) + sport = random.randint(1, 2**16 - 1) + + # UDP checksum is optional + udp_hdr = UDP_HDR.pack(sport, dport, 8, 0x1337) + + # IP checksum is filled in by kernel raw socket + ip_hdr = IP_HDR.pack( + 0x45, 0x00, IP_HDR.size + UDP_HDR.size + 0, + 0x0000, 0x0000, + ttl, dpkt.ip.IP_PROTO_UDP, 0, + saddr, + daddr, + ) + + pkt = ip_hdr + udp_hdr + '' + sock.sendto(pkt, (dst, 0)) + + # stats + count += 1 + size += len(pkt) + t = time.time() - t0 + + if rate and count % 1000: + over = count - t * rate + + if over > 0: + #sys.stdout.write('.') + time.sleep(over / rate) + + if t - t1 > 1.0: + sys.stdout.write('%8.2fs: %8d @ %8.2f/s = %8.2fM @ %5d/pkt\n' % (t, count, count / t, size / 1e6, size / count)) + t1 = t + + return 0 + +def main (argv): + prog = argv.pop(0) + dst = argv.pop(0) + + if argv: + rate = int(argv.pop(0)) + else : + rate = None + + return udpflood(dst, rate) + +if __name__ == '__main__': + sys.exit(main(sys.argv))