libnet4r 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +15 -0
- data/LICENSE +28 -0
- data/README +187 -0
- data/Rakefile +110 -0
- data/ext/extconf.rb +60 -0
- data/ext/libnet.c +705 -0
- data/ext/libnet_arp.c +152 -0
- data/ext/libnet_ethernet.c +115 -0
- data/ext/libnet_ipv4.c +140 -0
- data/ext/libnet_ipv6.c +138 -0
- data/ext/libnet_udp.c +112 -0
- data/ext/libnet_vlan.c +131 -0
- data/lib/libnet4r/header.rb +609 -0
- data/lib/libnet4r/helpers.rb +19 -0
- data/lib/libnet4r/libnet.rb +39 -0
- data/libnet/CVS/Entries +24 -0
- data/libnet/CVS/Repository +1 -0
- data/libnet/CVS/Root +1 -0
- data/libnet/Makefile.am +15 -0
- data/libnet/Makefile.am.common +10 -0
- data/libnet/Makefile.in +443 -0
- data/libnet/README +21 -0
- data/libnet/VERSION +1 -0
- data/libnet/acconfig.h +36 -0
- data/libnet/acinclude.m4 +463 -0
- data/libnet/aclocal.m4 +1337 -0
- data/libnet/autom4te.cache/CVS/Entries +1 -0
- data/libnet/autom4te.cache/CVS/Repository +1 -0
- data/libnet/autom4te.cache/CVS/Root +1 -0
- data/libnet/autom4te.cache/output.0 +6225 -0
- data/libnet/autom4te.cache/requests +111 -0
- data/libnet/autom4te.cache/traces.0 +272 -0
- data/libnet/config.guess +1314 -0
- data/libnet/config.sub +1410 -0
- data/libnet/configure +6225 -0
- data/libnet/configure.in +235 -0
- data/libnet/doc/BUGS +19 -0
- data/libnet/doc/CHANGELOG +527 -0
- data/libnet/doc/CONTRIB +53 -0
- data/libnet/doc/COPYING +31 -0
- data/libnet/doc/CVS/Entries +12 -0
- data/libnet/doc/CVS/Repository +1 -0
- data/libnet/doc/CVS/Root +1 -0
- data/libnet/doc/DESIGN_NOTES +134 -0
- data/libnet/doc/MIGRATION +172 -0
- data/libnet/doc/PACKET_BUILDING +161 -0
- data/libnet/doc/PORTED +45 -0
- data/libnet/doc/RAWSOCKET_NON_SEQUITUR +41 -0
- data/libnet/doc/TODO +96 -0
- data/libnet/doc/html/acconfig_8h-source.html +49 -0
- data/libnet/doc/html/annotated.html +17 -0
- data/libnet/doc/html/bpf_8h-source.html +277 -0
- data/libnet/doc/html/config_8h-source.html +125 -0
- data/libnet/doc/html/doxygen.css +169 -0
- data/libnet/doc/html/doxygen.png +0 -0
- data/libnet/doc/html/files.html +29 -0
- data/libnet/doc/html/functions.html +26 -0
- data/libnet/doc/html/functions_vars.html +26 -0
- data/libnet/doc/html/getopt_8h-source.html +97 -0
- data/libnet/doc/html/globals.html +219 -0
- data/libnet/doc/html/globals_defs.html +104 -0
- data/libnet/doc/html/globals_func.html +136 -0
- data/libnet/doc/html/gnuc_8h-source.html +56 -0
- data/libnet/doc/html/graph_legend.dot +22 -0
- data/libnet/doc/html/graph_legend.html +75 -0
- data/libnet/doc/html/ifaddrlist_8h-source.html +65 -0
- data/libnet/doc/html/in__systm_8h-source.html +90 -0
- data/libnet/doc/html/index.html +17 -0
- data/libnet/doc/html/libnet-asn1_8h-source.html +268 -0
- data/libnet/doc/html/libnet-functions_8h-source.html +742 -0
- data/libnet/doc/html/libnet-functions_8h.html +8844 -0
- data/libnet/doc/html/libnet-headers_8h-source.html +1655 -0
- data/libnet/doc/html/libnet-headers_8h.html +3053 -0
- data/libnet/doc/html/libnet-macros_8h-source.html +161 -0
- data/libnet/doc/html/libnet-macros_8h.html +358 -0
- data/libnet/doc/html/libnet-structures_8h-source.html +233 -0
- data/libnet/doc/html/libnet-types_8h-source.html +58 -0
- data/libnet/doc/html/libnet_8h-source.html +119 -0
- data/libnet/doc/html/libnet_8h.html +24 -0
- data/libnet/doc/html/structlibnet__802__1q__hdr.html +145 -0
- data/libnet/doc/html/structlibnet__802__1x__hdr.html +97 -0
- data/libnet/doc/libnet.doxygen.conf +1102 -0
- data/libnet/doc/man/CVS/Entries +1 -0
- data/libnet/doc/man/CVS/Repository +1 -0
- data/libnet/doc/man/CVS/Root +1 -0
- data/libnet/doc/man/man3/libnet-functions.h.3 +3136 -0
- data/libnet/doc/man/man3/libnet-headers.h.3 +1872 -0
- data/libnet/doc/man/man3/libnet-macros.h.3 +172 -0
- data/libnet/doc/man/man3/libnet.h.3 +17 -0
- data/libnet/doc/man/man3/libnet_802_1q_hdr.3 +53 -0
- data/libnet/doc/man/man3/libnet_802_1x_hdr.3 +41 -0
- data/libnet/include/CVS/Entries +10 -0
- data/libnet/include/CVS/Repository +1 -0
- data/libnet/include/CVS/Root +1 -0
- data/libnet/include/Makefile.am +7 -0
- data/libnet/include/Makefile.in +395 -0
- data/libnet/include/bpf.h +264 -0
- data/libnet/include/config.h.in +118 -0
- data/libnet/include/gnuc.h +43 -0
- data/libnet/include/ifaddrlist.h +52 -0
- data/libnet/include/libnet/CVS/Entries +9 -0
- data/libnet/include/libnet/CVS/Repository +1 -0
- data/libnet/include/libnet/CVS/Root +1 -0
- data/libnet/include/libnet/Makefile.am +12 -0
- data/libnet/include/libnet/Makefile.in +294 -0
- data/libnet/include/libnet/libnet-asn1.h +255 -0
- data/libnet/include/libnet/libnet-functions.h +2157 -0
- data/libnet/include/libnet/libnet-headers.h +1662 -0
- data/libnet/include/libnet/libnet-macros.h +186 -0
- data/libnet/include/libnet/libnet-structures.h +222 -0
- data/libnet/include/libnet/libnet-types.h +45 -0
- data/libnet/include/libnet.h.in +132 -0
- data/libnet/include/stamp-h.in +1 -0
- data/libnet/include/win32/CVS/Entries +5 -0
- data/libnet/include/win32/CVS/Repository +1 -0
- data/libnet/include/win32/CVS/Root +1 -0
- data/libnet/include/win32/config.h +112 -0
- data/libnet/include/win32/getopt.h +84 -0
- data/libnet/include/win32/in_systm.h +77 -0
- data/libnet/include/win32/libnet.h +106 -0
- data/libnet/install-sh +250 -0
- data/libnet/libnet-config.in +62 -0
- data/libnet/libnet.doxygen.conf +1102 -0
- data/libnet/man/CVS/Entries +1 -0
- data/libnet/man/CVS/Repository +1 -0
- data/libnet/man/CVS/Root +1 -0
- data/libnet/missing +283 -0
- data/libnet/mkinstalldirs +40 -0
- data/libnet/sample/CVS/Entries +47 -0
- data/libnet/sample/CVS/Repository +1 -0
- data/libnet/sample/CVS/Root +1 -0
- data/libnet/sample/Makefile.am +63 -0
- data/libnet/sample/Makefile.in +729 -0
- data/libnet/sample/arp-new.c +144 -0
- data/libnet/sample/arp.c +151 -0
- data/libnet/sample/bgp4_hdr.c +225 -0
- data/libnet/sample/bgp4_notification.c +242 -0
- data/libnet/sample/bgp4_open.c +266 -0
- data/libnet/sample/bgp4_update.c +337 -0
- data/libnet/sample/cdp.c +187 -0
- data/libnet/sample/dhcp_discover.c +257 -0
- data/libnet/sample/dns.c +260 -0
- data/libnet/sample/dot1x.c +113 -0
- data/libnet/sample/fddi_tcp1.c +213 -0
- data/libnet/sample/fddi_tcp2.c +209 -0
- data/libnet/sample/get_addr.c +112 -0
- data/libnet/sample/gre.c +410 -0
- data/libnet/sample/icmp6_echoreq.c +184 -0
- data/libnet/sample/icmp_echo_cq.c +201 -0
- data/libnet/sample/icmp_redirect.c +200 -0
- data/libnet/sample/icmp_timeexceed.c +190 -0
- data/libnet/sample/icmp_timestamp.c +157 -0
- data/libnet/sample/icmp_unreach.c +204 -0
- data/libnet/sample/ieee.c +177 -0
- data/libnet/sample/ip_link.c +201 -0
- data/libnet/sample/ip_raw.c +180 -0
- data/libnet/sample/isl.c +167 -0
- data/libnet/sample/libnet_test.h +60 -0
- data/libnet/sample/mpls.c +251 -0
- data/libnet/sample/ntp.c +193 -0
- data/libnet/sample/ospf_hello.c +179 -0
- data/libnet/sample/ospf_lsa.c +190 -0
- data/libnet/sample/ping_of_death.c +171 -0
- data/libnet/sample/rpc_tcp.c +214 -0
- data/libnet/sample/rpc_udp.c +213 -0
- data/libnet/sample/sebek.c +299 -0
- data/libnet/sample/smurf.c +194 -0
- data/libnet/sample/stp.c +227 -0
- data/libnet/sample/synflood.c +200 -0
- data/libnet/sample/synflood6.c +209 -0
- data/libnet/sample/synflood6_frag.c +234 -0
- data/libnet/sample/tcp1.c +227 -0
- data/libnet/sample/tcp2.c +192 -0
- data/libnet/sample/tftp.c +207 -0
- data/libnet/sample/tring_tcp1.c +214 -0
- data/libnet/sample/tring_tcp2.c +210 -0
- data/libnet/sample/udp1.c +223 -0
- data/libnet/sample/udp2.c +232 -0
- data/libnet/sample/win32/CVS/Entries +9 -0
- data/libnet/sample/win32/CVS/Repository +1 -0
- data/libnet/sample/win32/CVS/Root +1 -0
- data/libnet/sample/win32/arp/CVS/Entries +2 -0
- data/libnet/sample/win32/arp/CVS/Repository +1 -0
- data/libnet/sample/win32/arp/CVS/Root +1 -0
- data/libnet/sample/win32/arp/arp.vcproj +136 -0
- data/libnet/sample/win32/cdp/CVS/Entries +2 -0
- data/libnet/sample/win32/cdp/CVS/Repository +1 -0
- data/libnet/sample/win32/cdp/CVS/Root +1 -0
- data/libnet/sample/win32/cdp/cdp.vcproj +136 -0
- data/libnet/sample/win32/dhcp_discover/CVS/Entries +2 -0
- data/libnet/sample/win32/dhcp_discover/CVS/Repository +1 -0
- data/libnet/sample/win32/dhcp_discover/CVS/Root +1 -0
- data/libnet/sample/win32/dhcp_discover/dhcp_discover.vcproj +139 -0
- data/libnet/sample/win32/dns/CVS/Entries +2 -0
- data/libnet/sample/win32/dns/CVS/Repository +1 -0
- data/libnet/sample/win32/dns/CVS/Root +1 -0
- data/libnet/sample/win32/dns/dns.vcproj +139 -0
- data/libnet/sample/win32/get_addr/CVS/Entries +2 -0
- data/libnet/sample/win32/get_addr/CVS/Repository +1 -0
- data/libnet/sample/win32/get_addr/CVS/Root +1 -0
- data/libnet/sample/win32/get_addr/get_addr.vcproj +139 -0
- data/libnet/sample/win32/getopt.c +121 -0
- data/libnet/sample/win32/icmp_echo_cq/CVS/Entries +2 -0
- data/libnet/sample/win32/icmp_echo_cq/CVS/Repository +1 -0
- data/libnet/sample/win32/icmp_echo_cq/CVS/Root +1 -0
- data/libnet/sample/win32/icmp_echo_cq/icmp_echo_cq.vcproj +139 -0
- data/libnet/sample/win32/tcp1/CVS/Entries +2 -0
- data/libnet/sample/win32/tcp1/CVS/Repository +1 -0
- data/libnet/sample/win32/tcp1/CVS/Root +1 -0
- data/libnet/sample/win32/tcp1/tcp1.vcproj +142 -0
- data/libnet/sample/win32/udp1/CVS/Entries +3 -0
- data/libnet/sample/win32/udp1/CVS/Repository +1 -0
- data/libnet/sample/win32/udp1/CVS/Root +1 -0
- data/libnet/sample/win32/udp1/dns.vcproj +125 -0
- data/libnet/sample/win32/udp1/udp1.vcproj +139 -0
- data/libnet/src/CVS/Entries +60 -0
- data/libnet/src/CVS/Repository +1 -0
- data/libnet/src/CVS/Root +1 -0
- data/libnet/src/Makefile.am +71 -0
- data/libnet/src/Makefile.in +428 -0
- data/libnet/src/libnet_advanced.c +136 -0
- data/libnet/src/libnet_asn1.c +436 -0
- data/libnet/src/libnet_build_802.1q.c +115 -0
- data/libnet/src/libnet_build_802.1x.c +103 -0
- data/libnet/src/libnet_build_802.2.c +167 -0
- data/libnet/src/libnet_build_802.3.c +101 -0
- data/libnet/src/libnet_build_arp.c +169 -0
- data/libnet/src/libnet_build_bgp.c +350 -0
- data/libnet/src/libnet_build_cdp.c +191 -0
- data/libnet/src/libnet_build_data.c +90 -0
- data/libnet/src/libnet_build_dhcp.c +156 -0
- data/libnet/src/libnet_build_dns.c +129 -0
- data/libnet/src/libnet_build_ethernet.c +173 -0
- data/libnet/src/libnet_build_fddi.c +191 -0
- data/libnet/src/libnet_build_gre.c +427 -0
- data/libnet/src/libnet_build_icmp.c +437 -0
- data/libnet/src/libnet_build_igmp.c +112 -0
- data/libnet/src/libnet_build_ip.c +892 -0
- data/libnet/src/libnet_build_ipsec.c +232 -0
- data/libnet/src/libnet_build_isl.c +113 -0
- data/libnet/src/libnet_build_link.c +90 -0
- data/libnet/src/libnet_build_mpls.c +112 -0
- data/libnet/src/libnet_build_ntp.c +121 -0
- data/libnet/src/libnet_build_ospf.c +699 -0
- data/libnet/src/libnet_build_rip.c +108 -0
- data/libnet/src/libnet_build_rpc.c +138 -0
- data/libnet/src/libnet_build_sebek.c +108 -0
- data/libnet/src/libnet_build_snmp.c +52 -0
- data/libnet/src/libnet_build_stp.c +222 -0
- data/libnet/src/libnet_build_tcp.c +365 -0
- data/libnet/src/libnet_build_token_ring.c +193 -0
- data/libnet/src/libnet_build_udp.c +111 -0
- data/libnet/src/libnet_build_vrrp.c +117 -0
- data/libnet/src/libnet_checksum.c +376 -0
- data/libnet/src/libnet_cq.c +395 -0
- data/libnet/src/libnet_crc.c +113 -0
- data/libnet/src/libnet_dll.c +47 -0
- data/libnet/src/libnet_error.c +55 -0
- data/libnet/src/libnet_if_addr.c +415 -0
- data/libnet/src/libnet_init.c +234 -0
- data/libnet/src/libnet_internal.c +310 -0
- data/libnet/src/libnet_link_bpf.c +348 -0
- data/libnet/src/libnet_link_dlpi.c +785 -0
- data/libnet/src/libnet_link_linux.c +310 -0
- data/libnet/src/libnet_link_nit.c +125 -0
- data/libnet/src/libnet_link_none.c +66 -0
- data/libnet/src/libnet_link_pf.c +179 -0
- data/libnet/src/libnet_link_snit.c +149 -0
- data/libnet/src/libnet_link_snoop.c +166 -0
- data/libnet/src/libnet_link_win32.c +346 -0
- data/libnet/src/libnet_pblock.c +511 -0
- data/libnet/src/libnet_port_list.c +295 -0
- data/libnet/src/libnet_prand.c +106 -0
- data/libnet/src/libnet_raw.c +257 -0
- data/libnet/src/libnet_resolve.c +414 -0
- data/libnet/src/libnet_version.c +54 -0
- data/libnet/src/libnet_write.c +502 -0
- data/libnet/version.h.in +6 -0
- data/libnet/win32/CVS/Entries +15 -0
- data/libnet/win32/CVS/Repository +1 -0
- data/libnet/win32/CVS/Root +1 -0
- data/libnet/win32/Libnet-1.1.1-2002.sln +77 -0
- data/libnet/win32/Libnet-1.1.1-2003.ncb +0 -0
- data/libnet/win32/Libnet-1.1.1-2003.sln +84 -0
- data/libnet/win32/Libnet-1.1.1-2003.suo +0 -0
- data/libnet/win32/Libnet-1.1.1.vcproj +311 -0
- data/libnet/win32/Libnet-latest.ncb +0 -0
- data/libnet/win32/Libnet-latest.opt +0 -0
- data/libnet/win32/Libnet-latest.sln +77 -0
- data/libnet/win32/Libnet-latest.suo +0 -0
- data/libnet/win32/Libnet-latest.vcproj +311 -0
- data/libnet/win32/Libnet.dsp +337 -0
- data/libnet/win32/Libnet.dsw +32 -0
- data/libnet/win32/README.txt +57 -0
- data/libnet/win32/libnet_dll.def +164 -0
- data/test/tc_arp.rb +169 -0
- data/test/tc_class.rb +219 -0
- data/test/tc_ethernet.rb +97 -0
- data/test/tc_header.rb +163 -0
- data/test/tc_init.rb +25 -0
- data/test/tc_ipv4.rb +219 -0
- data/test/tc_ipv6.rb +235 -0
- data/test/tc_udp.rb +229 -0
- data/test/tc_vlan.rb +118 -0
- data/test/ts_all.rb +15 -0
- metadata +401 -0
data/CHANGELOG
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
= Libnet Changelog
|
2
|
+
|
3
|
+
== Version 0.1
|
4
|
+
|
5
|
+
=== November 18, 2007
|
6
|
+
|
7
|
+
* Initial release.
|
8
|
+
|
9
|
+
= Changes made to libnet-1.1.2.1
|
10
|
+
|
11
|
+
* Fixed bug that incorrectly packed the traffic class and flow label fields of
|
12
|
+
the IPv6 header.
|
13
|
+
* Fixed IPv6 checksum bug.
|
14
|
+
* Removed check for root user from <tt>libnet_init()</tt>. This check is now only done
|
15
|
+
in the <tt>libnet_write*</tt> functions.
|
data/LICENSE
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
Libnet source code.
|
2
|
+
Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
|
3
|
+
All rights reserved.
|
4
|
+
|
5
|
+
Libnet4r Ruby extension code.
|
6
|
+
Copyright (c) 2007 Corey Burrows <corey.burrows@gmail.com>
|
7
|
+
All rights reserved.
|
8
|
+
|
9
|
+
Redistribution and use in source and binary forms, with or without
|
10
|
+
modification, are permitted provided that the following conditions
|
11
|
+
are met:
|
12
|
+
1. Redistributions of source code must retain the above copyright
|
13
|
+
notice, this list of conditions and the following disclaimer.
|
14
|
+
2. Redistributions in binary form must reproduce the above copyright
|
15
|
+
notice, this list of conditions and the following disclaimer in the
|
16
|
+
documentation and/or other materials provided with the distribution.
|
17
|
+
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
19
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
21
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
22
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
24
|
+
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
25
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
26
|
+
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
27
|
+
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
28
|
+
SUCH DAMAGE.
|
data/README
ADDED
@@ -0,0 +1,187 @@
|
|
1
|
+
= Libnet4r
|
2
|
+
|
3
|
+
Libnet4r is a Ruby extension that provides bindings to the excellent
|
4
|
+
Libnet[http://www.packetfactory.net/libnet] packet
|
5
|
+
construction and injection library. It is however more than just a straight
|
6
|
+
port of the Libnet API to Ruby methods. In addition to the packet builder and
|
7
|
+
injection functions that Libnet provides, you also get object classes for each
|
8
|
+
header type that contain decode methods for decoding packed byte strings. Also,
|
9
|
+
the header builder methods have been written in a much more Ruby like manner
|
10
|
+
using objects and blocks as apposed to the long parameter lists that the Libnet
|
11
|
+
C functions use.
|
12
|
+
|
13
|
+
= Installing Libnet4r
|
14
|
+
|
15
|
+
Get Libnet4r from RubyForge.
|
16
|
+
|
17
|
+
$ gem install libnet4r
|
18
|
+
|
19
|
+
= Example
|
20
|
+
|
21
|
+
require 'libnet4r'
|
22
|
+
|
23
|
+
# create a new Libnet object for injecting at the link layer using device en0
|
24
|
+
l = Libnet.new(:link, 'en0')
|
25
|
+
|
26
|
+
# create a random 200 byte string to use as our UDP datagram payload
|
27
|
+
srand Time.now.to_i
|
28
|
+
bytes = Array.new(200) { |i| rand(255) }
|
29
|
+
payload = bytes.pack("C*")
|
30
|
+
|
31
|
+
# build the UDP header
|
32
|
+
udp = l.build_udp do |udp|
|
33
|
+
udp.src_port = 0xdead
|
34
|
+
udp.dst_port = 0xbeef
|
35
|
+
udp.length = Libnet::HL_UDP + payload.length
|
36
|
+
udp.checksum = 0 # set to 0 to instruct Libnet to calculate this for us
|
37
|
+
udp.payload = payload
|
38
|
+
end
|
39
|
+
|
40
|
+
# build the IPv4 header
|
41
|
+
ip = l.build_ipv4 do |ip|
|
42
|
+
ip.tos = 0
|
43
|
+
ip.length = Libnet::HL_IPV4 + Libnet::HL_UDP + payload.length
|
44
|
+
ip.id = 0x4321
|
45
|
+
ip.frag_off = 0
|
46
|
+
ip.ttl = 72
|
47
|
+
ip.protocol = Libnet::IPPROTO_UDP
|
48
|
+
ip.checksum = 0 # set to 0 to instruct Libnet to calculate this for us
|
49
|
+
ip.src_ip = "192.168.1.101" # IP addresses can be assigned as a dotted-decimal
|
50
|
+
ip.dst_ip = 0xc0a80103 # string or a network byte ordered integer
|
51
|
+
end
|
52
|
+
|
53
|
+
# finally, build the ethernet header
|
54
|
+
src_mac = [0x11, 0x22, 0x33, 0x44, 0x55, 0x66].pack("C*")
|
55
|
+
eth = l.build_ethernet do |eth|
|
56
|
+
eth.dst = "aa:bb:cc:dd:ee:ff" # MAC addresses can be assigned as a colon-
|
57
|
+
eth.src = src_mac # separated hex string or a byte string
|
58
|
+
eth.type = 0x0800
|
59
|
+
end
|
60
|
+
|
61
|
+
# display a hex dump of the resulting packet
|
62
|
+
packet = l.pack
|
63
|
+
puts "packet (#{packet.length} bytes):\n#{Libnet.hexdump(packet)}"
|
64
|
+
|
65
|
+
# write the packet to the wire
|
66
|
+
n = l.write
|
67
|
+
puts "wrote #{n} bytes"
|
68
|
+
|
69
|
+
# decode the packet back into header objects
|
70
|
+
eth = Libnet::Ethernet.decode(packet)
|
71
|
+
ip = Libnet::IPv4.decode(packet[Libnet::HL_ETH .. -1])
|
72
|
+
udp = Libnet::UDP.decode(packet[Libnet::HL_ETH + Libnet::HL_IPV4 .. -1])
|
73
|
+
|
74
|
+
puts "eth.dst: #{Libnet.hexdump(eth.dst)}"
|
75
|
+
puts "eth.src: #{Libnet.hexdump(eth.src)}"
|
76
|
+
puts "eth.type: 0x%04x" % [ eth.type ]
|
77
|
+
puts "ip.version: #{ip.version}"
|
78
|
+
puts "ip.ihl: #{ip.ihl}"
|
79
|
+
puts "ip.tos: #{ip.tos}"
|
80
|
+
puts "ip.length: #{ip.length}"
|
81
|
+
puts "ip.id: 0x%04x" % [ ip.id ]
|
82
|
+
puts "ip.frag_off: #{ip.frag_off}"
|
83
|
+
puts "ip.ttl: #{ip.ttl}"
|
84
|
+
puts "ip.protocol: #{ip.protocol}"
|
85
|
+
puts "ip.checksum: 0x%04x" % [ ip.checksum ]
|
86
|
+
puts "ip.src_ip: #{Libnet.ipv4_ntoa(ip.src_ip)}"
|
87
|
+
puts "ip.dst_ip: #{Libnet.ipv4_ntoa(ip.dst_ip)}"
|
88
|
+
puts "udp.src_port: 0x%04x" % [ udp.src_port ]
|
89
|
+
puts "udp.dst_port: 0x%04x" % [ udp.dst_port ]
|
90
|
+
puts "udp.checksum: 0x%04x" % [ udp.checksum ]
|
91
|
+
puts "udp.payload:\n#{Libnet.hexdump(udp.payload)}"
|
92
|
+
|
93
|
+
The above script results in the following output:
|
94
|
+
|
95
|
+
packet (242 bytes):
|
96
|
+
0x00000000: aabbccdd eeff1122 33445566 08004500
|
97
|
+
0x00000010: 00e44321 00004811 ab2fc0a8 0165c0a8
|
98
|
+
0x00000020: 0103dead beef00d0 c2ad57a2 7e436761
|
99
|
+
0x00000030: a7f58e9b 277d4218 9f5e918e dd8f2379
|
100
|
+
0x00000040: 18047ac6 245b2e25 19e89c01 69900551
|
101
|
+
0x00000050: c195a6e1 fd2eb200 0c9baed0 c50e220e
|
102
|
+
0x00000060: 9fe7c7c8 6d59cd01 3bdfef59 2d0b4768
|
103
|
+
0x00000070: 776b33a8 452adb2c 4fae4584 fcc9892f
|
104
|
+
0x00000080: 7fa57498 a6ab1f00 66590c6e 5145e37f
|
105
|
+
0x00000090: 330875dc 38b48709 a92ab231 212f411d
|
106
|
+
0x000000a0: 23cb0ed2 3fc18dee dc0fa417 a897557b
|
107
|
+
0x000000b0: 7ad9fad2 2e334bec 6d62bc06 2d1dfa1c
|
108
|
+
0x000000c0: 896c6182 d91570c5 11b69dc0 9472c32c
|
109
|
+
0x000000d0: 3ab32aa7 3f5e9771 3db6db39 1a5c34d5
|
110
|
+
0x000000e0: dfa308be 5716b343 3bfd0428 e4da4aac
|
111
|
+
0x000000f0: 9504
|
112
|
+
wrote 242 bytes
|
113
|
+
eth.dst: 0x00000000: aabbccdd eeff
|
114
|
+
eth.src: 0x00000000: 11223344 5566
|
115
|
+
eth.type: 0x0800
|
116
|
+
ip.version: 4
|
117
|
+
ip.ihl: 5
|
118
|
+
ip.tos: 0
|
119
|
+
ip.length: 228
|
120
|
+
ip.id: 0x4321
|
121
|
+
ip.frag_off: 0
|
122
|
+
ip.ttl: 72
|
123
|
+
ip.protocol: 17
|
124
|
+
ip.checksum: 0x002f
|
125
|
+
ip.src_ip: 192.168.1.101
|
126
|
+
ip.dst_ip: 192.168.1.3
|
127
|
+
udp.src_port: 0xdead
|
128
|
+
udp.dst_port: 0xbeef
|
129
|
+
udp.checksum: 0xc2ad
|
130
|
+
udp.payload:
|
131
|
+
0x00000000: 57a27e43 6761a7f5 8e9b277d 42189f5e
|
132
|
+
0x00000010: 918edd8f 23791804 7ac6245b 2e2519e8
|
133
|
+
0x00000020: 9c016990 0551c195 a6e1fd2e b2000c9b
|
134
|
+
0x00000030: aed0c50e 220e9fe7 c7c86d59 cd013bdf
|
135
|
+
0x00000040: ef592d0b 4768776b 33a8452a db2c4fae
|
136
|
+
0x00000050: 4584fcc9 892f7fa5 7498a6ab 1f006659
|
137
|
+
0x00000060: 0c6e5145 e37f3308 75dc38b4 8709a92a
|
138
|
+
0x00000070: b231212f 411d23cb 0ed23fc1 8deedc0f
|
139
|
+
0x00000080: a417a897 557b7ad9 fad22e33 4bec6d62
|
140
|
+
0x00000090: bc062d1d fa1c896c 6182d915 70c511b6
|
141
|
+
0x000000a0: 9dc09472 c32c3ab3 2aa73f5e 97713db6
|
142
|
+
0x000000b0: db391a5c 34d5dfa3 08be5716 b3433bfd
|
143
|
+
0x000000c0: 0428e4da 4aac9504
|
144
|
+
|
145
|
+
= Supported Header Types
|
146
|
+
|
147
|
+
The Libnet C library provides builder functions for many different protocol
|
148
|
+
headers. Libnet4r is still very much a work in progress and only supports
|
149
|
+
a subset of the header types that Libnet does. Patches for additional header
|
150
|
+
types are welcome!
|
151
|
+
|
152
|
+
Here is the list of currently supported header types:
|
153
|
+
|
154
|
+
* Ethernet
|
155
|
+
* VLAN (802.1q)
|
156
|
+
* ARP
|
157
|
+
* IPv4
|
158
|
+
* IPv6
|
159
|
+
* UDP
|
160
|
+
|
161
|
+
= Notes
|
162
|
+
|
163
|
+
The Libnet C source code comes packaged with this library and is built along
|
164
|
+
with the extension so it is not necessary for you to already have Libnet
|
165
|
+
installed on your system. If you do have Libnet already installed, it will
|
166
|
+
*not* be used, the Libnet that comes with this package will still be used as
|
167
|
+
it contains several patches that the extension depends on.
|
168
|
+
|
169
|
+
The following changes have been made to the Libnet 1.1.2.1 source code in this
|
170
|
+
package:
|
171
|
+
|
172
|
+
* Fixed bug that incorrectly packed the traffic class and flow label fields of
|
173
|
+
the IPv6 header.
|
174
|
+
* Fixed checksum bug when IPv6 header is present.
|
175
|
+
* Removed check for root user from +libnet_init()+. This check is now only done
|
176
|
+
in the +libnet_write*+ functions. This allows all of the header builder
|
177
|
+
functions to be used by a normal user. Its only necesssary to be the root
|
178
|
+
user if you wish to actually inject the packets that you construct.
|
179
|
+
|
180
|
+
= Project Page
|
181
|
+
|
182
|
+
http://rubyforge.org/projects/libnet4r
|
183
|
+
|
184
|
+
= Author
|
185
|
+
|
186
|
+
Corey Burrows (mailto:corey.burrows@gmail.com)
|
187
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
Gem::manage_gems
|
4
|
+
require 'rake/gempackagetask'
|
5
|
+
require 'rake/clean'
|
6
|
+
require 'rake/rdoctask'
|
7
|
+
|
8
|
+
NAME = 'libnet4r'
|
9
|
+
VERS = '0.1'
|
10
|
+
GEM_NAME = "#{NAME}-#{VERS}.gem"
|
11
|
+
|
12
|
+
RDOC_MAIN = "README"
|
13
|
+
|
14
|
+
libnet_files = Dir.glob("libnet/**/*") - Dir.glob("libnet/**/*.o") - ["libnet/src/libnet.a"]
|
15
|
+
|
16
|
+
spec = Gem::Specification.new do |s|
|
17
|
+
s.name = NAME
|
18
|
+
s.version = VERS
|
19
|
+
s.author = "Corey Burrows"
|
20
|
+
s.email = "corey.burrows@gmail.com"
|
21
|
+
s.platform = Gem::Platform::RUBY
|
22
|
+
s.summary = "Packet builder and injection library."
|
23
|
+
s.files = %w{README CHANGELOG LICENSE Rakefile} +
|
24
|
+
Dir.glob("ext/**/*.{h,c}") +
|
25
|
+
Dir.glob("lib/**/*.{rb}") +
|
26
|
+
Dir.glob("test/**/*.rb") +
|
27
|
+
Dir.glob("libnet/**/*")
|
28
|
+
s.require_path = "lib"
|
29
|
+
s.extensions = ["ext/extconf.rb"]
|
30
|
+
#s.test_file = "test/test_libnet.rb"
|
31
|
+
s.has_rdoc = true
|
32
|
+
s.extra_rdoc_files = [RDOC_MAIN, "CHANGELOG", "LICENSE"]
|
33
|
+
s.add_dependency('activesupport')
|
34
|
+
end
|
35
|
+
|
36
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
37
|
+
pkg.need_tar = true
|
38
|
+
end
|
39
|
+
|
40
|
+
Rake::RDocTask.new do |rd|
|
41
|
+
rd.main = RDOC_MAIN
|
42
|
+
rd.rdoc_files.include(RDOC_MAIN, "CHANGELOG", "LICENSE", "lib/**/*.rb", "ext/**/*.c")
|
43
|
+
rd.options << "--all"
|
44
|
+
end
|
45
|
+
|
46
|
+
CLEAN.include FileList[ "libnet/**/*.o",
|
47
|
+
"libnet/**/*.a",
|
48
|
+
"lib/**/*.o",
|
49
|
+
"lib/**/*.so",
|
50
|
+
"lib/**/*.bundle",
|
51
|
+
"lib/mkmf.log",
|
52
|
+
"lib/Makefile",
|
53
|
+
"ext/Makefile",
|
54
|
+
"pkg/*.gem",
|
55
|
+
"html/",
|
56
|
+
]
|
57
|
+
|
58
|
+
task :realclean => :clean do
|
59
|
+
if File.exists?('libnet/Makefile')
|
60
|
+
Dir.chdir('libnet')
|
61
|
+
sh('make distclean')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
task :build do
|
66
|
+
Dir.chdir('lib')
|
67
|
+
case RUBY_PLATFORM
|
68
|
+
when /darwin/
|
69
|
+
sh('ARCHFLAGS="-arch ppc" ruby ../ext/extconf.rb')
|
70
|
+
else
|
71
|
+
sh('ruby ../ext/extconf.rb')
|
72
|
+
end
|
73
|
+
|
74
|
+
sh('make')
|
75
|
+
Dir.chdir('..')
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
task :test do
|
80
|
+
puts "********************************"
|
81
|
+
puts "running tests as regular user..."
|
82
|
+
puts "********************************"
|
83
|
+
sh("ruby -rrubygems test/ts_all.rb")
|
84
|
+
puts "********************************"
|
85
|
+
puts "running tests as root user..."
|
86
|
+
puts "********************************"
|
87
|
+
sh("sudo ruby -rrubygems test/ts_all.rb")
|
88
|
+
end
|
89
|
+
|
90
|
+
task :gem do
|
91
|
+
sh %{rake pkg/#{GEM_NAME}}
|
92
|
+
end
|
93
|
+
|
94
|
+
task :install => :gem do
|
95
|
+
case RUBY_PLATFORM
|
96
|
+
when /^sparc/
|
97
|
+
sh %{sudo gem install pkg/#{GEM_NAME} -- --with-libnet-dir=/usr/local}
|
98
|
+
when /darwin/
|
99
|
+
sh %{sudo env ARCHFLAGS="-arch ppc" gem install pkg/#{GEM_NAME} -- --with-libnet-dir=/sw}
|
100
|
+
else
|
101
|
+
sh %{sudo gem install pkg/#{GEM_NAME}}
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
task :uninstall do
|
106
|
+
sh %{sudo gem uninstall #{NAME}}
|
107
|
+
end
|
108
|
+
|
109
|
+
task :default => :build
|
110
|
+
|
data/ext/extconf.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'mkmf'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
BASEDIR = File.dirname(File.expand_path(__FILE__))
|
7
|
+
|
8
|
+
$CFLAGS << ' -W -Wall'
|
9
|
+
|
10
|
+
have_library('socket', 'socket')
|
11
|
+
|
12
|
+
#dir_config('libnet')
|
13
|
+
|
14
|
+
have_header("netinet/in.h")
|
15
|
+
|
16
|
+
ip_protos = %w(
|
17
|
+
IPPROTO_IP
|
18
|
+
IPPROTO_HOPOPTS
|
19
|
+
IPPROTO_IP
|
20
|
+
IPPROTO_HOPOPTS
|
21
|
+
IPPROTO_ICMP
|
22
|
+
IPPROTO_IGMP
|
23
|
+
IPPROTO_GGP
|
24
|
+
IPPROTO_ENCAP
|
25
|
+
IPPROTO_TCP
|
26
|
+
IPPROTO_EGP
|
27
|
+
IPPROTO_PUP
|
28
|
+
IPPROTO_UDP
|
29
|
+
IPPROTO_IDP
|
30
|
+
IPPROTO_IPV6
|
31
|
+
IPPROTO_ROUTING
|
32
|
+
IPPROTO_FRAGMENT
|
33
|
+
IPPROTO_RSVP
|
34
|
+
IPPROTO_ESP
|
35
|
+
IPPROTO_AH
|
36
|
+
IPPROTO_ICMPV6
|
37
|
+
IPPROTO_NONE
|
38
|
+
IPPROTO_DSTOPTS
|
39
|
+
IPPROTO_HELLO
|
40
|
+
IPPROTO_ND
|
41
|
+
IPPROTO_EON
|
42
|
+
IPPROTO_PIM
|
43
|
+
IPPROTO_SCTP
|
44
|
+
IPPROTO_RAW
|
45
|
+
IPPROTO_MAX
|
46
|
+
)
|
47
|
+
|
48
|
+
ip_protos.each do |proto|
|
49
|
+
if have_macro(proto, [ "netinet/in.h" ])
|
50
|
+
$CPPFLAGS += " -DHAVE_#{proto}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# now build libnet
|
55
|
+
system %{ cd ../libnet && sh ./configure && make }
|
56
|
+
|
57
|
+
$INCFLAGS = "-I../libnet/include #{$INCFLAGS}"
|
58
|
+
$LIBS += " ../libnet/src/libnet.a"
|
59
|
+
create_makefile('libnet4r')
|
60
|
+
|