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.
Files changed (306) hide show
  1. data/CHANGELOG +15 -0
  2. data/LICENSE +28 -0
  3. data/README +187 -0
  4. data/Rakefile +110 -0
  5. data/ext/extconf.rb +60 -0
  6. data/ext/libnet.c +705 -0
  7. data/ext/libnet_arp.c +152 -0
  8. data/ext/libnet_ethernet.c +115 -0
  9. data/ext/libnet_ipv4.c +140 -0
  10. data/ext/libnet_ipv6.c +138 -0
  11. data/ext/libnet_udp.c +112 -0
  12. data/ext/libnet_vlan.c +131 -0
  13. data/lib/libnet4r/header.rb +609 -0
  14. data/lib/libnet4r/helpers.rb +19 -0
  15. data/lib/libnet4r/libnet.rb +39 -0
  16. data/libnet/CVS/Entries +24 -0
  17. data/libnet/CVS/Repository +1 -0
  18. data/libnet/CVS/Root +1 -0
  19. data/libnet/Makefile.am +15 -0
  20. data/libnet/Makefile.am.common +10 -0
  21. data/libnet/Makefile.in +443 -0
  22. data/libnet/README +21 -0
  23. data/libnet/VERSION +1 -0
  24. data/libnet/acconfig.h +36 -0
  25. data/libnet/acinclude.m4 +463 -0
  26. data/libnet/aclocal.m4 +1337 -0
  27. data/libnet/autom4te.cache/CVS/Entries +1 -0
  28. data/libnet/autom4te.cache/CVS/Repository +1 -0
  29. data/libnet/autom4te.cache/CVS/Root +1 -0
  30. data/libnet/autom4te.cache/output.0 +6225 -0
  31. data/libnet/autom4te.cache/requests +111 -0
  32. data/libnet/autom4te.cache/traces.0 +272 -0
  33. data/libnet/config.guess +1314 -0
  34. data/libnet/config.sub +1410 -0
  35. data/libnet/configure +6225 -0
  36. data/libnet/configure.in +235 -0
  37. data/libnet/doc/BUGS +19 -0
  38. data/libnet/doc/CHANGELOG +527 -0
  39. data/libnet/doc/CONTRIB +53 -0
  40. data/libnet/doc/COPYING +31 -0
  41. data/libnet/doc/CVS/Entries +12 -0
  42. data/libnet/doc/CVS/Repository +1 -0
  43. data/libnet/doc/CVS/Root +1 -0
  44. data/libnet/doc/DESIGN_NOTES +134 -0
  45. data/libnet/doc/MIGRATION +172 -0
  46. data/libnet/doc/PACKET_BUILDING +161 -0
  47. data/libnet/doc/PORTED +45 -0
  48. data/libnet/doc/RAWSOCKET_NON_SEQUITUR +41 -0
  49. data/libnet/doc/TODO +96 -0
  50. data/libnet/doc/html/acconfig_8h-source.html +49 -0
  51. data/libnet/doc/html/annotated.html +17 -0
  52. data/libnet/doc/html/bpf_8h-source.html +277 -0
  53. data/libnet/doc/html/config_8h-source.html +125 -0
  54. data/libnet/doc/html/doxygen.css +169 -0
  55. data/libnet/doc/html/doxygen.png +0 -0
  56. data/libnet/doc/html/files.html +29 -0
  57. data/libnet/doc/html/functions.html +26 -0
  58. data/libnet/doc/html/functions_vars.html +26 -0
  59. data/libnet/doc/html/getopt_8h-source.html +97 -0
  60. data/libnet/doc/html/globals.html +219 -0
  61. data/libnet/doc/html/globals_defs.html +104 -0
  62. data/libnet/doc/html/globals_func.html +136 -0
  63. data/libnet/doc/html/gnuc_8h-source.html +56 -0
  64. data/libnet/doc/html/graph_legend.dot +22 -0
  65. data/libnet/doc/html/graph_legend.html +75 -0
  66. data/libnet/doc/html/ifaddrlist_8h-source.html +65 -0
  67. data/libnet/doc/html/in__systm_8h-source.html +90 -0
  68. data/libnet/doc/html/index.html +17 -0
  69. data/libnet/doc/html/libnet-asn1_8h-source.html +268 -0
  70. data/libnet/doc/html/libnet-functions_8h-source.html +742 -0
  71. data/libnet/doc/html/libnet-functions_8h.html +8844 -0
  72. data/libnet/doc/html/libnet-headers_8h-source.html +1655 -0
  73. data/libnet/doc/html/libnet-headers_8h.html +3053 -0
  74. data/libnet/doc/html/libnet-macros_8h-source.html +161 -0
  75. data/libnet/doc/html/libnet-macros_8h.html +358 -0
  76. data/libnet/doc/html/libnet-structures_8h-source.html +233 -0
  77. data/libnet/doc/html/libnet-types_8h-source.html +58 -0
  78. data/libnet/doc/html/libnet_8h-source.html +119 -0
  79. data/libnet/doc/html/libnet_8h.html +24 -0
  80. data/libnet/doc/html/structlibnet__802__1q__hdr.html +145 -0
  81. data/libnet/doc/html/structlibnet__802__1x__hdr.html +97 -0
  82. data/libnet/doc/libnet.doxygen.conf +1102 -0
  83. data/libnet/doc/man/CVS/Entries +1 -0
  84. data/libnet/doc/man/CVS/Repository +1 -0
  85. data/libnet/doc/man/CVS/Root +1 -0
  86. data/libnet/doc/man/man3/libnet-functions.h.3 +3136 -0
  87. data/libnet/doc/man/man3/libnet-headers.h.3 +1872 -0
  88. data/libnet/doc/man/man3/libnet-macros.h.3 +172 -0
  89. data/libnet/doc/man/man3/libnet.h.3 +17 -0
  90. data/libnet/doc/man/man3/libnet_802_1q_hdr.3 +53 -0
  91. data/libnet/doc/man/man3/libnet_802_1x_hdr.3 +41 -0
  92. data/libnet/include/CVS/Entries +10 -0
  93. data/libnet/include/CVS/Repository +1 -0
  94. data/libnet/include/CVS/Root +1 -0
  95. data/libnet/include/Makefile.am +7 -0
  96. data/libnet/include/Makefile.in +395 -0
  97. data/libnet/include/bpf.h +264 -0
  98. data/libnet/include/config.h.in +118 -0
  99. data/libnet/include/gnuc.h +43 -0
  100. data/libnet/include/ifaddrlist.h +52 -0
  101. data/libnet/include/libnet/CVS/Entries +9 -0
  102. data/libnet/include/libnet/CVS/Repository +1 -0
  103. data/libnet/include/libnet/CVS/Root +1 -0
  104. data/libnet/include/libnet/Makefile.am +12 -0
  105. data/libnet/include/libnet/Makefile.in +294 -0
  106. data/libnet/include/libnet/libnet-asn1.h +255 -0
  107. data/libnet/include/libnet/libnet-functions.h +2157 -0
  108. data/libnet/include/libnet/libnet-headers.h +1662 -0
  109. data/libnet/include/libnet/libnet-macros.h +186 -0
  110. data/libnet/include/libnet/libnet-structures.h +222 -0
  111. data/libnet/include/libnet/libnet-types.h +45 -0
  112. data/libnet/include/libnet.h.in +132 -0
  113. data/libnet/include/stamp-h.in +1 -0
  114. data/libnet/include/win32/CVS/Entries +5 -0
  115. data/libnet/include/win32/CVS/Repository +1 -0
  116. data/libnet/include/win32/CVS/Root +1 -0
  117. data/libnet/include/win32/config.h +112 -0
  118. data/libnet/include/win32/getopt.h +84 -0
  119. data/libnet/include/win32/in_systm.h +77 -0
  120. data/libnet/include/win32/libnet.h +106 -0
  121. data/libnet/install-sh +250 -0
  122. data/libnet/libnet-config.in +62 -0
  123. data/libnet/libnet.doxygen.conf +1102 -0
  124. data/libnet/man/CVS/Entries +1 -0
  125. data/libnet/man/CVS/Repository +1 -0
  126. data/libnet/man/CVS/Root +1 -0
  127. data/libnet/missing +283 -0
  128. data/libnet/mkinstalldirs +40 -0
  129. data/libnet/sample/CVS/Entries +47 -0
  130. data/libnet/sample/CVS/Repository +1 -0
  131. data/libnet/sample/CVS/Root +1 -0
  132. data/libnet/sample/Makefile.am +63 -0
  133. data/libnet/sample/Makefile.in +729 -0
  134. data/libnet/sample/arp-new.c +144 -0
  135. data/libnet/sample/arp.c +151 -0
  136. data/libnet/sample/bgp4_hdr.c +225 -0
  137. data/libnet/sample/bgp4_notification.c +242 -0
  138. data/libnet/sample/bgp4_open.c +266 -0
  139. data/libnet/sample/bgp4_update.c +337 -0
  140. data/libnet/sample/cdp.c +187 -0
  141. data/libnet/sample/dhcp_discover.c +257 -0
  142. data/libnet/sample/dns.c +260 -0
  143. data/libnet/sample/dot1x.c +113 -0
  144. data/libnet/sample/fddi_tcp1.c +213 -0
  145. data/libnet/sample/fddi_tcp2.c +209 -0
  146. data/libnet/sample/get_addr.c +112 -0
  147. data/libnet/sample/gre.c +410 -0
  148. data/libnet/sample/icmp6_echoreq.c +184 -0
  149. data/libnet/sample/icmp_echo_cq.c +201 -0
  150. data/libnet/sample/icmp_redirect.c +200 -0
  151. data/libnet/sample/icmp_timeexceed.c +190 -0
  152. data/libnet/sample/icmp_timestamp.c +157 -0
  153. data/libnet/sample/icmp_unreach.c +204 -0
  154. data/libnet/sample/ieee.c +177 -0
  155. data/libnet/sample/ip_link.c +201 -0
  156. data/libnet/sample/ip_raw.c +180 -0
  157. data/libnet/sample/isl.c +167 -0
  158. data/libnet/sample/libnet_test.h +60 -0
  159. data/libnet/sample/mpls.c +251 -0
  160. data/libnet/sample/ntp.c +193 -0
  161. data/libnet/sample/ospf_hello.c +179 -0
  162. data/libnet/sample/ospf_lsa.c +190 -0
  163. data/libnet/sample/ping_of_death.c +171 -0
  164. data/libnet/sample/rpc_tcp.c +214 -0
  165. data/libnet/sample/rpc_udp.c +213 -0
  166. data/libnet/sample/sebek.c +299 -0
  167. data/libnet/sample/smurf.c +194 -0
  168. data/libnet/sample/stp.c +227 -0
  169. data/libnet/sample/synflood.c +200 -0
  170. data/libnet/sample/synflood6.c +209 -0
  171. data/libnet/sample/synflood6_frag.c +234 -0
  172. data/libnet/sample/tcp1.c +227 -0
  173. data/libnet/sample/tcp2.c +192 -0
  174. data/libnet/sample/tftp.c +207 -0
  175. data/libnet/sample/tring_tcp1.c +214 -0
  176. data/libnet/sample/tring_tcp2.c +210 -0
  177. data/libnet/sample/udp1.c +223 -0
  178. data/libnet/sample/udp2.c +232 -0
  179. data/libnet/sample/win32/CVS/Entries +9 -0
  180. data/libnet/sample/win32/CVS/Repository +1 -0
  181. data/libnet/sample/win32/CVS/Root +1 -0
  182. data/libnet/sample/win32/arp/CVS/Entries +2 -0
  183. data/libnet/sample/win32/arp/CVS/Repository +1 -0
  184. data/libnet/sample/win32/arp/CVS/Root +1 -0
  185. data/libnet/sample/win32/arp/arp.vcproj +136 -0
  186. data/libnet/sample/win32/cdp/CVS/Entries +2 -0
  187. data/libnet/sample/win32/cdp/CVS/Repository +1 -0
  188. data/libnet/sample/win32/cdp/CVS/Root +1 -0
  189. data/libnet/sample/win32/cdp/cdp.vcproj +136 -0
  190. data/libnet/sample/win32/dhcp_discover/CVS/Entries +2 -0
  191. data/libnet/sample/win32/dhcp_discover/CVS/Repository +1 -0
  192. data/libnet/sample/win32/dhcp_discover/CVS/Root +1 -0
  193. data/libnet/sample/win32/dhcp_discover/dhcp_discover.vcproj +139 -0
  194. data/libnet/sample/win32/dns/CVS/Entries +2 -0
  195. data/libnet/sample/win32/dns/CVS/Repository +1 -0
  196. data/libnet/sample/win32/dns/CVS/Root +1 -0
  197. data/libnet/sample/win32/dns/dns.vcproj +139 -0
  198. data/libnet/sample/win32/get_addr/CVS/Entries +2 -0
  199. data/libnet/sample/win32/get_addr/CVS/Repository +1 -0
  200. data/libnet/sample/win32/get_addr/CVS/Root +1 -0
  201. data/libnet/sample/win32/get_addr/get_addr.vcproj +139 -0
  202. data/libnet/sample/win32/getopt.c +121 -0
  203. data/libnet/sample/win32/icmp_echo_cq/CVS/Entries +2 -0
  204. data/libnet/sample/win32/icmp_echo_cq/CVS/Repository +1 -0
  205. data/libnet/sample/win32/icmp_echo_cq/CVS/Root +1 -0
  206. data/libnet/sample/win32/icmp_echo_cq/icmp_echo_cq.vcproj +139 -0
  207. data/libnet/sample/win32/tcp1/CVS/Entries +2 -0
  208. data/libnet/sample/win32/tcp1/CVS/Repository +1 -0
  209. data/libnet/sample/win32/tcp1/CVS/Root +1 -0
  210. data/libnet/sample/win32/tcp1/tcp1.vcproj +142 -0
  211. data/libnet/sample/win32/udp1/CVS/Entries +3 -0
  212. data/libnet/sample/win32/udp1/CVS/Repository +1 -0
  213. data/libnet/sample/win32/udp1/CVS/Root +1 -0
  214. data/libnet/sample/win32/udp1/dns.vcproj +125 -0
  215. data/libnet/sample/win32/udp1/udp1.vcproj +139 -0
  216. data/libnet/src/CVS/Entries +60 -0
  217. data/libnet/src/CVS/Repository +1 -0
  218. data/libnet/src/CVS/Root +1 -0
  219. data/libnet/src/Makefile.am +71 -0
  220. data/libnet/src/Makefile.in +428 -0
  221. data/libnet/src/libnet_advanced.c +136 -0
  222. data/libnet/src/libnet_asn1.c +436 -0
  223. data/libnet/src/libnet_build_802.1q.c +115 -0
  224. data/libnet/src/libnet_build_802.1x.c +103 -0
  225. data/libnet/src/libnet_build_802.2.c +167 -0
  226. data/libnet/src/libnet_build_802.3.c +101 -0
  227. data/libnet/src/libnet_build_arp.c +169 -0
  228. data/libnet/src/libnet_build_bgp.c +350 -0
  229. data/libnet/src/libnet_build_cdp.c +191 -0
  230. data/libnet/src/libnet_build_data.c +90 -0
  231. data/libnet/src/libnet_build_dhcp.c +156 -0
  232. data/libnet/src/libnet_build_dns.c +129 -0
  233. data/libnet/src/libnet_build_ethernet.c +173 -0
  234. data/libnet/src/libnet_build_fddi.c +191 -0
  235. data/libnet/src/libnet_build_gre.c +427 -0
  236. data/libnet/src/libnet_build_icmp.c +437 -0
  237. data/libnet/src/libnet_build_igmp.c +112 -0
  238. data/libnet/src/libnet_build_ip.c +892 -0
  239. data/libnet/src/libnet_build_ipsec.c +232 -0
  240. data/libnet/src/libnet_build_isl.c +113 -0
  241. data/libnet/src/libnet_build_link.c +90 -0
  242. data/libnet/src/libnet_build_mpls.c +112 -0
  243. data/libnet/src/libnet_build_ntp.c +121 -0
  244. data/libnet/src/libnet_build_ospf.c +699 -0
  245. data/libnet/src/libnet_build_rip.c +108 -0
  246. data/libnet/src/libnet_build_rpc.c +138 -0
  247. data/libnet/src/libnet_build_sebek.c +108 -0
  248. data/libnet/src/libnet_build_snmp.c +52 -0
  249. data/libnet/src/libnet_build_stp.c +222 -0
  250. data/libnet/src/libnet_build_tcp.c +365 -0
  251. data/libnet/src/libnet_build_token_ring.c +193 -0
  252. data/libnet/src/libnet_build_udp.c +111 -0
  253. data/libnet/src/libnet_build_vrrp.c +117 -0
  254. data/libnet/src/libnet_checksum.c +376 -0
  255. data/libnet/src/libnet_cq.c +395 -0
  256. data/libnet/src/libnet_crc.c +113 -0
  257. data/libnet/src/libnet_dll.c +47 -0
  258. data/libnet/src/libnet_error.c +55 -0
  259. data/libnet/src/libnet_if_addr.c +415 -0
  260. data/libnet/src/libnet_init.c +234 -0
  261. data/libnet/src/libnet_internal.c +310 -0
  262. data/libnet/src/libnet_link_bpf.c +348 -0
  263. data/libnet/src/libnet_link_dlpi.c +785 -0
  264. data/libnet/src/libnet_link_linux.c +310 -0
  265. data/libnet/src/libnet_link_nit.c +125 -0
  266. data/libnet/src/libnet_link_none.c +66 -0
  267. data/libnet/src/libnet_link_pf.c +179 -0
  268. data/libnet/src/libnet_link_snit.c +149 -0
  269. data/libnet/src/libnet_link_snoop.c +166 -0
  270. data/libnet/src/libnet_link_win32.c +346 -0
  271. data/libnet/src/libnet_pblock.c +511 -0
  272. data/libnet/src/libnet_port_list.c +295 -0
  273. data/libnet/src/libnet_prand.c +106 -0
  274. data/libnet/src/libnet_raw.c +257 -0
  275. data/libnet/src/libnet_resolve.c +414 -0
  276. data/libnet/src/libnet_version.c +54 -0
  277. data/libnet/src/libnet_write.c +502 -0
  278. data/libnet/version.h.in +6 -0
  279. data/libnet/win32/CVS/Entries +15 -0
  280. data/libnet/win32/CVS/Repository +1 -0
  281. data/libnet/win32/CVS/Root +1 -0
  282. data/libnet/win32/Libnet-1.1.1-2002.sln +77 -0
  283. data/libnet/win32/Libnet-1.1.1-2003.ncb +0 -0
  284. data/libnet/win32/Libnet-1.1.1-2003.sln +84 -0
  285. data/libnet/win32/Libnet-1.1.1-2003.suo +0 -0
  286. data/libnet/win32/Libnet-1.1.1.vcproj +311 -0
  287. data/libnet/win32/Libnet-latest.ncb +0 -0
  288. data/libnet/win32/Libnet-latest.opt +0 -0
  289. data/libnet/win32/Libnet-latest.sln +77 -0
  290. data/libnet/win32/Libnet-latest.suo +0 -0
  291. data/libnet/win32/Libnet-latest.vcproj +311 -0
  292. data/libnet/win32/Libnet.dsp +337 -0
  293. data/libnet/win32/Libnet.dsw +32 -0
  294. data/libnet/win32/README.txt +57 -0
  295. data/libnet/win32/libnet_dll.def +164 -0
  296. data/test/tc_arp.rb +169 -0
  297. data/test/tc_class.rb +219 -0
  298. data/test/tc_ethernet.rb +97 -0
  299. data/test/tc_header.rb +163 -0
  300. data/test/tc_init.rb +25 -0
  301. data/test/tc_ipv4.rb +219 -0
  302. data/test/tc_ipv6.rb +235 -0
  303. data/test/tc_udp.rb +229 -0
  304. data/test/tc_vlan.rb +118 -0
  305. data/test/ts_all.rb +15 -0
  306. 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
+