pcapr-local 0.1.10

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 (203) hide show
  1. data/.document +5 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +64 -0
  4. data/Rakefile +57 -0
  5. data/VERSION +1 -0
  6. data/bin/pcap2par +49 -0
  7. data/bin/startpcapr +40 -0
  8. data/bin/stoppcapr +33 -0
  9. data/bin/xtractr +5 -0
  10. data/lib/environment.rb +106 -0
  11. data/lib/exe/xtractr +0 -0
  12. data/lib/mu/pcap.rb +110 -0
  13. data/lib/mu/pcap/ethernet.rb +148 -0
  14. data/lib/mu/pcap/header.rb +75 -0
  15. data/lib/mu/pcap/io_pair.rb +67 -0
  16. data/lib/mu/pcap/io_wrapper.rb +76 -0
  17. data/lib/mu/pcap/ip.rb +61 -0
  18. data/lib/mu/pcap/ipv4.rb +257 -0
  19. data/lib/mu/pcap/ipv6.rb +148 -0
  20. data/lib/mu/pcap/packet.rb +104 -0
  21. data/lib/mu/pcap/pkthdr.rb +155 -0
  22. data/lib/mu/pcap/reader.rb +61 -0
  23. data/lib/mu/pcap/reader/http_family.rb +170 -0
  24. data/lib/mu/pcap/sctp.rb +367 -0
  25. data/lib/mu/pcap/sctp/chunk.rb +123 -0
  26. data/lib/mu/pcap/sctp/chunk/data.rb +134 -0
  27. data/lib/mu/pcap/sctp/chunk/init.rb +100 -0
  28. data/lib/mu/pcap/sctp/chunk/init_ack.rb +68 -0
  29. data/lib/mu/pcap/sctp/parameter.rb +110 -0
  30. data/lib/mu/pcap/sctp/parameter/ip_address.rb +48 -0
  31. data/lib/mu/pcap/stream_packetizer.rb +72 -0
  32. data/lib/mu/pcap/tcp.rb +505 -0
  33. data/lib/mu/pcap/udp.rb +69 -0
  34. data/lib/mu/scenario/pcap.rb +164 -0
  35. data/lib/mu/scenario/pcap/fields.rb +50 -0
  36. data/lib/mu/scenario/pcap/rtp.rb +71 -0
  37. data/lib/pcapr_local.rb +159 -0
  38. data/lib/pcapr_local/config.rb +336 -0
  39. data/lib/pcapr_local/db.rb +197 -0
  40. data/lib/pcapr_local/scanner.rb +250 -0
  41. data/lib/pcapr_local/server.rb +178 -0
  42. data/lib/pcapr_local/www/favicon.ico +0 -0
  43. data/lib/pcapr_local/www/favicon.png +0 -0
  44. data/lib/pcapr_local/www/home/index.html +138 -0
  45. data/lib/pcapr_local/www/static/image/16x16/Cancel.png +0 -0
  46. data/lib/pcapr_local/www/static/image/16x16/Cancel.png.1 +0 -0
  47. data/lib/pcapr_local/www/static/image/16x16/Download.png +0 -0
  48. data/lib/pcapr_local/www/static/image/16x16/Folder3.png +0 -0
  49. data/lib/pcapr_local/www/static/image/16x16/Full Size.png +0 -0
  50. data/lib/pcapr_local/www/static/image/16x16/Minus.png +0 -0
  51. data/lib/pcapr_local/www/static/image/16x16/Plus.png +0 -0
  52. data/lib/pcapr_local/www/static/image/16x16/Search.png +0 -0
  53. data/lib/pcapr_local/www/static/image/16x16/User.png +0 -0
  54. data/lib/pcapr_local/www/static/image/48x48/Phone.png +0 -0
  55. data/lib/pcapr_local/www/static/image/48x48/Video.png +0 -0
  56. data/lib/pcapr_local/www/static/image/bar-orange.gif +0 -0
  57. data/lib/pcapr_local/www/static/image/beta.png +0 -0
  58. data/lib/pcapr_local/www/static/image/bg.png +0 -0
  59. data/lib/pcapr_local/www/static/image/blockquote.png +0 -0
  60. data/lib/pcapr_local/www/static/image/body-bg.png +0 -0
  61. data/lib/pcapr_local/www/static/image/body-h3.png +0 -0
  62. data/lib/pcapr_local/www/static/image/body-hl1-bg.png +0 -0
  63. data/lib/pcapr_local/www/static/image/body-hl1-h3.png +0 -0
  64. data/lib/pcapr_local/www/static/image/body-hl1-readmore.png +0 -0
  65. data/lib/pcapr_local/www/static/image/body-hl2-bg.png +0 -0
  66. data/lib/pcapr_local/www/static/image/body-hl2-h3.png +0 -0
  67. data/lib/pcapr_local/www/static/image/body-hl2-readmore.png +0 -0
  68. data/lib/pcapr_local/www/static/image/body-hl3-bg.png +0 -0
  69. data/lib/pcapr_local/www/static/image/body-hl3-h3.png +0 -0
  70. data/lib/pcapr_local/www/static/image/body-hl3-readmore.png +0 -0
  71. data/lib/pcapr_local/www/static/image/body-hl4-bg.png +0 -0
  72. data/lib/pcapr_local/www/static/image/body-hl4-h3.png +0 -0
  73. data/lib/pcapr_local/www/static/image/body-hl4-readmore.png +0 -0
  74. data/lib/pcapr_local/www/static/image/body-hl5-h3.png +0 -0
  75. data/lib/pcapr_local/www/static/image/body-hl6-h3.png +0 -0
  76. data/lib/pcapr_local/www/static/image/body-hl7-h3.png +0 -0
  77. data/lib/pcapr_local/www/static/image/body-hl8-h3.png +0 -0
  78. data/lib/pcapr_local/www/static/image/body-readmore.png +0 -0
  79. data/lib/pcapr_local/www/static/image/bottom-bg.png +0 -0
  80. data/lib/pcapr_local/www/static/image/bottom-l.png +0 -0
  81. data/lib/pcapr_local/www/static/image/bottom-r.png +0 -0
  82. data/lib/pcapr_local/www/static/image/btn-search.png +0 -0
  83. data/lib/pcapr_local/www/static/image/bullet-1.png +0 -0
  84. data/lib/pcapr_local/www/static/image/bullet-2.png +0 -0
  85. data/lib/pcapr_local/www/static/image/bullet-3.png +0 -0
  86. data/lib/pcapr_local/www/static/image/bullet-4.png +0 -0
  87. data/lib/pcapr_local/www/static/image/bullet-5.png +0 -0
  88. data/lib/pcapr_local/www/static/image/bullet-6.png +0 -0
  89. data/lib/pcapr_local/www/static/image/bullet-7.png +0 -0
  90. data/lib/pcapr_local/www/static/image/bullet-hl1.png +0 -0
  91. data/lib/pcapr_local/www/static/image/bullet-hl2.png +0 -0
  92. data/lib/pcapr_local/www/static/image/bullet-hl3.png +0 -0
  93. data/lib/pcapr_local/www/static/image/bullet-hl4.png +0 -0
  94. data/lib/pcapr_local/www/static/image/bullet-pathway.png +0 -0
  95. data/lib/pcapr_local/www/static/image/bullet-section1.png +0 -0
  96. data/lib/pcapr_local/www/static/image/bullet-section2.png +0 -0
  97. data/lib/pcapr_local/www/static/image/collapsed.gif +0 -0
  98. data/lib/pcapr_local/www/static/image/crosslink.png +0 -0
  99. data/lib/pcapr_local/www/static/image/expanded.gif +0 -0
  100. data/lib/pcapr_local/www/static/image/favicon.ico +0 -0
  101. data/lib/pcapr_local/www/static/image/favicon.png +0 -0
  102. data/lib/pcapr_local/www/static/image/icon-author.png +0 -0
  103. data/lib/pcapr_local/www/static/image/icon-created.png +0 -0
  104. data/lib/pcapr_local/www/static/image/p-expand.gif +0 -0
  105. data/lib/pcapr_local/www/static/image/pcapr-logo.png +0 -0
  106. data/lib/pcapr_local/www/static/image/powered-by.png +0 -0
  107. data/lib/pcapr_local/www/static/image/section1-bg.png +0 -0
  108. data/lib/pcapr_local/www/static/image/section1-h3.png +0 -0
  109. data/lib/pcapr_local/www/static/image/section1-readmore.png +0 -0
  110. data/lib/pcapr_local/www/static/image/section2-bg.png +0 -0
  111. data/lib/pcapr_local/www/static/image/section2-h3.png +0 -0
  112. data/lib/pcapr_local/www/static/image/section2-readmore.png +0 -0
  113. data/lib/pcapr_local/www/static/image/status-alert.png +0 -0
  114. data/lib/pcapr_local/www/static/image/status-download.png +0 -0
  115. data/lib/pcapr_local/www/static/image/status-info.png +0 -0
  116. data/lib/pcapr_local/www/static/image/status-note.png +0 -0
  117. data/lib/pcapr_local/www/static/image/tab-round.png +0 -0
  118. data/lib/pcapr_local/www/static/image/throbber.gif +0 -0
  119. data/lib/pcapr_local/www/static/image/user.jpg +0 -0
  120. data/lib/pcapr_local/www/static/script/closet/async.js +421 -0
  121. data/lib/pcapr_local/www/static/script/closet/closet.api.js +241 -0
  122. data/lib/pcapr_local/www/static/script/closet/closet.folders.js +94 -0
  123. data/lib/pcapr_local/www/static/script/closet/closet.js +187 -0
  124. data/lib/pcapr_local/www/static/script/closet/closet.mr.js +219 -0
  125. data/lib/pcapr_local/www/static/script/closet/closet.options.js +359 -0
  126. data/lib/pcapr_local/www/static/script/closet/closet.quantity.js +73 -0
  127. data/lib/pcapr_local/www/static/script/closet/closet.render.js +205 -0
  128. data/lib/pcapr_local/www/static/script/closet/closet.report.js +86 -0
  129. data/lib/pcapr_local/www/static/script/closet/closet.reports.http.js +135 -0
  130. data/lib/pcapr_local/www/static/script/closet/closet.reports.overview.js +163 -0
  131. data/lib/pcapr_local/www/static/script/closet/closet.reports.sip.js +159 -0
  132. data/lib/pcapr_local/www/static/script/closet/closet.reports.tcp.js +72 -0
  133. data/lib/pcapr_local/www/static/script/closet/closet.reports.visualize.js +263 -0
  134. data/lib/pcapr_local/www/static/script/closet/closet.util.js +40 -0
  135. data/lib/pcapr_local/www/static/script/jquery/jquery-1.4.2.min.js +154 -0
  136. data/lib/pcapr_local/www/static/script/jquery/jquery-ui.js +10921 -0
  137. data/lib/pcapr_local/www/static/script/jquery/jquery.flot.js +2123 -0
  138. data/lib/pcapr_local/www/static/script/jquery/jquery.flot.selection.js +184 -0
  139. data/lib/pcapr_local/www/static/script/jquery/jquery.flot.stack.js +184 -0
  140. data/lib/pcapr_local/www/static/script/jquery/jquery.form.js +643 -0
  141. data/lib/pcapr_local/www/static/script/jquery/jquery.jsonp.min.js +3 -0
  142. data/lib/pcapr_local/www/static/script/jquery/jquery.menu.js +142 -0
  143. data/lib/pcapr_local/www/static/script/jquery/jquery.suggest.js +308 -0
  144. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.core.js +203 -0
  145. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.slider.js +629 -0
  146. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.sortable.js +1055 -0
  147. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.widget.js +236 -0
  148. data/lib/pcapr_local/www/static/script/json2.js +481 -0
  149. data/lib/pcapr_local/www/static/script/sammy/plugins/sammy.cache.js +115 -0
  150. data/lib/pcapr_local/www/static/script/sammy/plugins/sammy.template.js +117 -0
  151. data/lib/pcapr_local/www/static/script/sammy/sammy.js +1696 -0
  152. data/lib/pcapr_local/www/static/script/tipsy/jquery.tipsy.js +104 -0
  153. data/lib/pcapr_local/www/static/style/c3p0.css +116 -0
  154. data/lib/pcapr_local/www/static/style/jquery.suggest.css +27 -0
  155. data/lib/pcapr_local/www/static/style/page.css +1113 -0
  156. data/lib/pcapr_local/www/static/style/tipsy.css +7 -0
  157. data/lib/pcapr_local/www/templates/browse.services.template +10 -0
  158. data/lib/pcapr_local/www/templates/browse.template +77 -0
  159. data/lib/pcapr_local/www/templates/flows.template +38 -0
  160. data/lib/pcapr_local/www/templates/pcap.template +63 -0
  161. data/lib/pcapr_local/www/templates/sip.calls.template +35 -0
  162. data/lib/pcapr_local/www/templates/statistics.template +6 -0
  163. data/lib/pcapr_local/xtractr.rb +179 -0
  164. data/lib/pcapr_local/xtractr/instance.rb +172 -0
  165. data/pcapr-local.gemspec +297 -0
  166. data/test/mu/pcap/reader/tc_http_family.rb +251 -0
  167. data/test/mu/pcap/tc_ethernet.rb +71 -0
  168. data/test/mu/pcap/tc_header.rb +56 -0
  169. data/test/mu/pcap/tc_ipv4.rb +103 -0
  170. data/test/mu/pcap/tc_ipv6.rb +83 -0
  171. data/test/mu/pcap/tc_packet.rb +44 -0
  172. data/test/mu/pcap/tc_pair.rb +58 -0
  173. data/test/mu/pcap/tc_pkthdr.rb +33 -0
  174. data/test/mu/pcap/tc_reader.rb +76 -0
  175. data/test/mu/pcap/tc_tcp.rb +426 -0
  176. data/test/mu/pcap/tc_udp.rb +33 -0
  177. data/test/mu/pcap/tc_wrapper.rb +80 -0
  178. data/test/mu/scenario/pcap/tc_fields.rb +67 -0
  179. data/test/mu/scenario/pcap/tc_rtp.rb +135 -0
  180. data/test/mu/scenario/sip_signalled_call_1.pcap +0 -0
  181. data/test/mu/scenario/tc_pcap.rb +190 -0
  182. data/test/mu/scenario/test_data/arp.pcap +0 -0
  183. data/test/mu/scenario/test_data/dns.pcap +0 -0
  184. data/test/mu/scenario/test_data/http-v6.pcap +0 -0
  185. data/test/mu/scenario/test_data/http.pcap +0 -0
  186. data/test/mu/scenario/test_data/http_chunked.pcap +0 -0
  187. data/test/mu/scenario/test_data/http_deflate.pcap +0 -0
  188. data/test/mu/scenario/test_data/httpauth3.pcap +0 -0
  189. data/test/mu/scenario/test_data/icmp.pcap +0 -0
  190. data/test/mu/scenario/test_data/sip_signalled_call_1.pcap +0 -0
  191. data/test/mu/tc_pcap.rb +39 -0
  192. data/test/mu/testcase.rb +86 -0
  193. data/test/pcapr_local/arp.pcap +0 -0
  194. data/test/pcapr_local/data.js +3 -0
  195. data/test/pcapr_local/http_chunked.pcap +0 -0
  196. data/test/pcapr_local/tc_api.rb +181 -0
  197. data/test/pcapr_local/test.tgz +0 -0
  198. data/test/pcapr_local/test_scanner.rb +241 -0
  199. data/test/pcapr_local/test_xtractr.rb +219 -0
  200. data/test/pcapr_local/testcase.rb +107 -0
  201. data/test/test_export_to_scenario.sh +25 -0
  202. data/test/test_pcapr_local.rb +29 -0
  203. metadata +450 -0
@@ -0,0 +1,71 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class Ethernet
11
+
12
+ class Test < Mu::TestCase
13
+ def test_basics
14
+ ethernet = Ethernet.new
15
+ ethernet.dst = '00:01:01:00:00:02'
16
+ ethernet.src = '00:01:01:00:00:01'
17
+ ethernet.type = 0x1234
18
+ ethernet.payload = ''
19
+
20
+ bytes = "\0\1\1\0\0\2" + "\0\1\1\0\0\1" + "\x12\x34"
21
+ ethernet_in = Ethernet.from_bytes bytes
22
+ assert_equal ethernet, ethernet_in
23
+ end
24
+
25
+ def test_vlan
26
+ ethernet = Ethernet.new
27
+ ethernet.dst = '00:01:01:00:00:02'
28
+ ethernet.src = '00:01:01:00:00:01'
29
+ ethernet.type = 0x1234
30
+ ethernet.payload = 'hi'
31
+ ethernet.payload_raw = 'hi'
32
+
33
+ # Strip out VLAN tag
34
+ vlan = "\x81\00" + "\x00\x01"
35
+ bytes = "\0\1\1\0\0\2" + "\0\1\1\0\0\1" + vlan + "\x12\x34hi"
36
+ ethernet_in = Ethernet.from_bytes bytes
37
+ assert_equal ethernet, ethernet_in
38
+
39
+ # Strip out multiple VLAN tags
40
+ bytes = "\0\1\1\0\0\2" + "\0\1\1\0\0\1" + vlan*10 + "\x12\x34hi"
41
+ ethernet_in = Ethernet.from_bytes bytes
42
+ assert_equal ethernet, ethernet_in
43
+ end
44
+
45
+ def test_pppoe
46
+ ethernet = Ethernet.new
47
+ ethernet.dst = '00:01:01:00:00:02'
48
+ ethernet.src = '00:01:01:00:00:01'
49
+ ethernet.type = ETHERTYPE_IP
50
+ ethernet.payload = IPv4.new '127.0.0.1', '127.0.0.2'
51
+ ethernet.payload_raw = ethernet.payload.to_bytes
52
+
53
+ ipv4 = IPv4.new '127.0.0.1', '127.0.0.2'
54
+ bytes = "\0\1\1\0\0\2" + "\0\1\1\0\0\1" + "\x88\x64" +
55
+ # PPPoE
56
+ "\x11" + # version 1, type 1
57
+ "\x00" + # code
58
+ "\x00\x01" + # session ID
59
+ "\x00\x14" + # length
60
+ # PPP
61
+ "\x00\x21" + # IP
62
+ # IPv4
63
+ ipv4.to_bytes
64
+ ethernet_in = Ethernet.from_bytes bytes
65
+ assert_equal ethernet, ethernet_in
66
+ end
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,56 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class Header
11
+
12
+ class Test < Mu::TestCase
13
+ def test_basics
14
+ header = Header.new
15
+ header.magic = BIG_ENDIAN
16
+ header.version_major = 2
17
+ header.version_minor = 4
18
+ header.thiszone = 0
19
+ header.sigfigs = 0
20
+ header.snaplen = 1500
21
+ header.linktype = 1
22
+
23
+ # Big endian
24
+ bytes = "\xa1\xb2\xc3\xd4" + "\x00\x02" + "\x00\x04" +
25
+ "\x00\x00\x00\x00" + "\x00\x00\x00\x00" +
26
+ "\x00\x00\x05\xdc" + "\x00\x00\x00\x01"
27
+ header_in = Header.read StringIO.new(bytes)
28
+ assert_equal header, header_in
29
+
30
+ # Little endian
31
+ header.magic = LITTLE_ENDIAN
32
+ bytes = "\xd4\xc3\xb2\xa1" + "\x02\x00" + "\x04\x00" +
33
+ "\x00\x00\x00\x00" + "\x00\x00\x00\x00" +
34
+ "\xdc\x05\x00\x00" + "\x01\x00\x00\x00"
35
+ header_in = Header.read StringIO.new(bytes)
36
+ assert_equal header, header_in
37
+ end
38
+
39
+
40
+ def test_decode_null
41
+ ethernet = Ethernet.new
42
+ ethernet.src = '00:01:01:00:00:01'
43
+ ethernet.dst = '00:01:01:00:00:02'
44
+ ethernet.type = Ethernet::ETHERTYPE_IP
45
+ ethernet.payload = ethernet.payload_raw = 'hello'
46
+ bytes = nil
47
+ with_no_stderr do # supress warning about malformed IPv4
48
+ bytes = Pkthdr.decode_null BIG_ENDIAN, "\0\0\0\2hello"
49
+ end
50
+ assert_equal ethernet, bytes
51
+ end
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,103 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class IPv4
11
+
12
+ class Test < Mu::TestCase
13
+ def test_basics
14
+ bytes =
15
+ "\x47"+ # version, header length
16
+ "\x00" + # TOS
17
+ "\x00\x1c" + # length
18
+ "\x4c\xb7" + # ID
19
+ "\x00\x00" + # offset
20
+ "\x40" + # TTL
21
+ "\x01" + # protocol
22
+ "\x99\x2a" + # checksum
23
+ "\x0a\x01\x02\x03" + # src-ip
24
+ "\x0a\x02\x03\x04" + # dst-ip
25
+ "\x94\x04\x00\x00\x00\x00" + "\x00\x00" # options
26
+
27
+ ipv4 = IPv4.new
28
+ ipv4.ip_id = 19639
29
+ ipv4.ttl = 64
30
+ ipv4.proto = 1
31
+ ipv4.src = '10.1.2.3'
32
+ ipv4.dst = '10.2.3.4'
33
+ ipv4.payload = ''
34
+
35
+ ipv4_in = nil
36
+ with_no_stderr do # supress warning about options
37
+ ipv4_in = IPv4.from_bytes bytes
38
+ end
39
+ assert_equal ipv4, ipv4_in
40
+ end
41
+
42
+ def test_reassemble
43
+ # empty stream
44
+ assert_equal [], IPv4.reassemble([])
45
+
46
+ # one packet
47
+ ip = ip 0, "A" * 10
48
+ assert_equal [ip], IPv4.reassemble([ip])
49
+
50
+ # three packets
51
+ ip1 = ip IP_MF | 0, "A" * 16
52
+ ip2 = ip IP_MF | 2, "B" * 16
53
+ ip3 = ip 4, "C" * 16
54
+ ipo = ip IP_MF | 3, "B" * 8 + "C" * 8 # overlap
55
+ ipe = ip IP_MF | 1, "" # empty
56
+ ip = ip 0, "A" * 16 + "B" * 16 + "C" * 16
57
+ [[ip1, ip2, ip3],
58
+ [ip1, ip3, ip2],
59
+ [ip2, ip1, ip3],
60
+ [ip2, ip3, ip1],
61
+ [ip3, ip1, ip2],
62
+ [ip3, ip2, ip1]].each do |ips|
63
+ with_no_stderr do
64
+ assert_equal [ip], IPv4.reassemble(ips)
65
+ end
66
+ # test with overlapping fragment
67
+ 0.upto(ips.length-1) do |i|
68
+ ips.insert i, ipo
69
+ with_no_stderr do
70
+ assert_equal [ip], IPv4.reassemble(ips)
71
+ end
72
+ ips.delete_at i
73
+ end
74
+ # test with empty fragment
75
+ 0.upto(ips.length-1) do |i|
76
+ ips.insert i, ipe
77
+ with_no_stderr do
78
+ assert_equal [ip], IPv4.reassemble(ips)
79
+ end
80
+ ips.delete_at i
81
+ end
82
+ end
83
+ end
84
+
85
+ def ip offset, payload
86
+ ipv4 = IPv4.new
87
+ ethernet = Ethernet.new
88
+ ethernet.src = '00:01:00:00:00:01'
89
+ ethernet.dst = '00:01:00:00:00:02'
90
+ ipv4.src = '10.0.0.1'
91
+ ipv4.dst = '10.0.0.2'
92
+ ipv4.proto = IPv4::IPPROTO_TCP
93
+ ipv4.offset = offset
94
+ ipv4.payload = payload
95
+ ethernet.type = Ethernet::ETHERTYPE_IP
96
+ ethernet.payload = ipv4
97
+ return ethernet
98
+ end
99
+ end
100
+
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,83 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class IPv6
11
+
12
+ class Test < Mu::TestCase
13
+ def test_basics
14
+ bytes =
15
+ "60000000" + # version, class, label
16
+ "0005" + # length
17
+ "59" + # next header
18
+ "40" + # hop limit
19
+ "00000000000000000000000000000001" + # source
20
+ "ff020000000000000000000000000005" # destination
21
+ bytes = bytes.from_hex + 'hello'
22
+
23
+ ipv6 = IPv6.new
24
+ ipv6.next_header = 0x59
25
+ ipv6.hop_limit = 64
26
+ ipv6.src = '::1'
27
+ ipv6.dst = 'ff02::5'
28
+ ipv6.payload = 'hello'
29
+ ipv6.payload_raw = 'hello'
30
+
31
+ ipv6_in = nil
32
+ with_no_stderr do # supress warning about options
33
+ ipv6_in = IPv6.from_bytes bytes
34
+ end
35
+ assert_equal ipv6, ipv6_in
36
+ end
37
+
38
+ def test_headers
39
+ packet =
40
+ "60000000" + # version, class, label
41
+ "%04x" + # length
42
+ "%02x" + # next header
43
+ "40" + # hop limit
44
+ "00000000000000000000000000000001" + # source
45
+ "ff020000000000000000000000000005" # destination
46
+
47
+ # No next header
48
+ bytes = (packet % [0, IP::IPPROTO_NONE]).from_hex
49
+ ipv6 = IPv6.from_bytes bytes
50
+ assert_equal IP::IPPROTO_NONE, ipv6.next_header
51
+ assert_equal '', ipv6.payload
52
+
53
+ # Hop-by-hop options
54
+ bytes = (packet % [8, IP::IPPROTO_HOPOPTS]).from_hex +
55
+ [IP::IPPROTO_NONE, 0, "\0\0\0\0\0\0"].pack('CCa6')
56
+ ipv6 = IPv6.from_bytes bytes
57
+ assert_equal IP::IPPROTO_NONE, ipv6.next_header
58
+
59
+ # Routing header options
60
+ bytes = (packet % [8, IP::IPPROTO_ROUTING]).from_hex +
61
+ [IP::IPPROTO_NONE, 0, "\0\0\0\0\0\0"].pack('CCa6')
62
+ ipv6 = IPv6.from_bytes bytes
63
+ assert_equal IP::IPPROTO_NONE, ipv6.next_header
64
+
65
+ # Destination options
66
+ bytes = (packet % [8, IP::IPPROTO_DSTOPTS]).from_hex +
67
+ [IP::IPPROTO_NONE, 0, "\0\0\0\0\0\0"].pack('CCa6')
68
+ ipv6 = IPv6.from_bytes bytes
69
+ assert_equal IP::IPPROTO_NONE, ipv6.next_header
70
+
71
+ # Fragment (not supported)
72
+ bytes = (packet % [8, IP::IPPROTO_FRAGMENT]).from_hex +
73
+ [IP::IPPROTO_NONE, 0, 0, 0].pack('CCnN')
74
+ with_no_stderr do
75
+ ipv6 = IPv6.from_bytes bytes
76
+ end
77
+ assert_equal IP::IPPROTO_FRAGMENT, ipv6.next_header
78
+ end
79
+ end
80
+
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,44 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class Packet
11
+
12
+ class Test < Mu::TestCase
13
+ def test_isolate_l7
14
+ # Empty
15
+ assert_equal [], Packet.isolate_l7([])
16
+
17
+ # Ethernet
18
+ ethernet = Ethernet.new
19
+ assert_equal [ethernet], Packet.isolate_l7([ethernet])
20
+
21
+ # UDP packet
22
+ udp = Ethernet.new
23
+ udp.payload = IPv4.new
24
+ udp.payload.payload = UDP.new
25
+ udp.payload.payload.src_port = 1000
26
+ assert_equal [udp], Packet.isolate_l7([udp])
27
+
28
+ # UDP packet and Ethernet
29
+ assert_equal [udp], Packet.isolate_l7([udp, ethernet])
30
+ assert_equal [udp], Packet.isolate_l7([ethernet, udp])
31
+
32
+ # UDP packet and DNS
33
+ dns = Ethernet.new
34
+ dns.payload = IPv4.new
35
+ dns.payload.payload = UDP.new
36
+ dns.payload.payload.src_port = 53
37
+ assert_equal [udp], Packet.isolate_l7([udp, dns])
38
+ assert_equal [udp], Packet.isolate_l7([dns, udp])
39
+ end
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,58 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap/io_pair'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class IOPair
11
+ class Test < Mu::TestCase
12
+
13
+ def test_stream
14
+ io1, io2 = IOPair.stream_pair
15
+
16
+ # send
17
+ assert_equal 3, io1.write("foo")
18
+ assert_equal "foo", io2.read(3)
19
+
20
+ # another
21
+ assert_equal 3, io1.write("bar")
22
+ assert_equal "bar", io2.read(0xffff)
23
+
24
+ # reverse
25
+ assert_equal 3, io2.write("baz")
26
+ assert_equal "baz", io1.read(0xffff)
27
+
28
+ # 2 sends, 1 receive
29
+ assert_equal 3, io1.write("one")
30
+ assert_equal 3, io1.write("two")
31
+ assert_equal "onetwo", io2.read(6)
32
+ end
33
+
34
+ def test_packet
35
+ io1, io2 = IOPair.packet_pair
36
+
37
+ # send
38
+ assert_equal 3, io1.write("foo")
39
+ assert_equal "foo", io2.read
40
+
41
+ # another
42
+ assert_equal 3, io1.write("bar")
43
+ assert_equal "bar", io2.read
44
+
45
+ # reverse
46
+ assert_equal 3, io2.write("baz")
47
+ assert_equal "baz", io1.read
48
+
49
+ # 2 sends, 2 receives
50
+ assert_equal 3, io1.write("one")
51
+ assert_equal 3, io1.write("two")
52
+ assert_equal "one", io2.read
53
+ assert_equal "two", io2.read
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,33 @@
1
+ # http://www.mudynamics.com
2
+ # http://labs.mudynamics.com
3
+ # http://www.pcapr.net
4
+
5
+ require 'mu/testcase'
6
+ require 'mu/pcap'
7
+
8
+ module Mu
9
+ class Pcap
10
+ class Pkthdr
11
+
12
+ class Test < Mu::TestCase
13
+ def test_basics
14
+ pkthdr = Pkthdr.new
15
+ pkthdr.endian = LITTLE_ENDIAN
16
+ pkthdr.ts_sec = 1191265036
17
+ pkthdr.ts_usec = 73432
18
+ pkthdr.caplen = 73
19
+ pkthdr.len = 73
20
+ pkthdr.pkt = 'X' * 73
21
+
22
+ bytes = "\x0c\x43\x01\x47" + "\xd8\x1e\x01\x00" +
23
+ "\x49\x00\x00\x00" + "\x49\x00\x00\x00" + ("X" * 73)
24
+ pkthdr_in = Pkthdr.read StringIO.new(bytes), LITTLE_ENDIAN
25
+ assert_equal pkthdr, pkthdr_in
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+
33
+