sub sendRaw($$$) {
    use constant IPPROTO_RAW => 255;
    my ($destination, $dport, $packet) = @_;
    eval {
        socket(SOCKET, PF_INET, SOCK_RAW, IPPROTO_RAW);
        my $paddr = sockaddr_in($dport, inet_aton($destination));
        send(SOCKET, $packet, 0, $paddr);
    };
    if ($@) {
        print "Error occured: $@";
    }
}

sub assembleRawUdp($$$$$) {
    my ($destination, $dport, $source, $sport, $data) = @_;

############# # IP HEADER # ############# my $packet = undef; $packet .= pack(‘C’, 0x45); # Version + IHL $packet .= pack(‘H2’, ‘00’); # Type of Service $packet .= pack(’n’, 28 + length($data)); # Total length $packet .= pack(’n’, 0); # Identification (not very good one) $packet .= pack(‘H4’, ‘4000’); # Flags + fragment offset $packet .= pack(‘C’, 0x40); # TTL $packet .= pack(‘C’, 0x11); # Protocol (udp) $packet .= pack(’n’, 0); # Header checksum $packet .= inet_aton($source); # Source Ip $packet .= inet_aton($destination); # Destination Ip

    ##############
    # UDP HEADER #
    ##############
    $packet .= pack('n', $sport); # Source port
    $packet .= pack('n', $dport); # Destination port
    $packet .= pack('n', 8 + length($data)); # Length
    $packet .= pack('H4', '0000'); # Checksum

    ################
    # Data payload #
    ################
    $packet .= $data;

    return $packet;
}

1