redhound 0.2.0 → 1.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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -3
  3. data/Dockerfile +1 -1
  4. data/README.md +2 -2
  5. data/Rakefile +12 -1
  6. data/Steepfile +4 -0
  7. data/lib/redhound/analyzer.rb +19 -15
  8. data/lib/redhound/builder/packet_mreq.rb +56 -0
  9. data/lib/redhound/builder/socket.rb +35 -0
  10. data/lib/redhound/builder.rb +4 -0
  11. data/lib/redhound/command.rb +6 -1
  12. data/lib/redhound/l2/ether.rb +68 -0
  13. data/lib/redhound/l2/protocol.rb +33 -0
  14. data/lib/redhound/l2.rb +4 -0
  15. data/lib/redhound/l3/arp.rb +114 -0
  16. data/lib/redhound/l3/base.rb +49 -0
  17. data/lib/redhound/{header → l3}/ipv4.rb +27 -44
  18. data/lib/redhound/l3/ipv6.rb +69 -0
  19. data/lib/redhound/l3/protocol.rb +173 -0
  20. data/lib/redhound/l3/resolver.rb +30 -0
  21. data/lib/redhound/l3.rb +9 -0
  22. data/lib/redhound/l4/base.rb +31 -0
  23. data/lib/redhound/{header → l4}/icmp.rb +20 -26
  24. data/lib/redhound/l4/resolver.rb +28 -0
  25. data/lib/redhound/{header → l4}/udp.rb +19 -19
  26. data/lib/redhound/l4.rb +6 -0
  27. data/lib/redhound/receiver.rb +17 -5
  28. data/lib/redhound/resolver.rb +22 -0
  29. data/lib/redhound/source/socket.rb +18 -0
  30. data/lib/redhound/source.rb +3 -0
  31. data/lib/redhound/version.rb +2 -1
  32. data/lib/redhound/writer.rb +9 -2
  33. data/lib/redhound.rb +6 -3
  34. data/rbs_collection.lock.yaml +20 -0
  35. data/rbs_collection.yaml +17 -0
  36. data/sig/generated/redhound/analyzer.rbs +14 -0
  37. data/sig/generated/redhound/builder/packet_mreq.rbs +39 -0
  38. data/sig/generated/redhound/builder/socket.rbs +24 -0
  39. data/sig/generated/redhound/command.rbs +19 -0
  40. data/sig/generated/redhound/l2/ether.rbs +41 -0
  41. data/sig/generated/redhound/l2/protocol.rbs +15 -0
  42. data/sig/generated/redhound/l3/arp.rbs +57 -0
  43. data/sig/generated/redhound/l3/base.rbs +28 -0
  44. data/sig/generated/redhound/l3/ipv4.rbs +53 -0
  45. data/sig/generated/redhound/l3/ipv6.rbs +38 -0
  46. data/sig/generated/redhound/l3/protocol.rbs +16 -0
  47. data/sig/generated/redhound/l3/resolver.rbs +16 -0
  48. data/sig/generated/redhound/l4/base.rbs +19 -0
  49. data/sig/generated/redhound/l4/icmp.rbs +33 -0
  50. data/sig/generated/redhound/l4/resolver.rbs +16 -0
  51. data/sig/generated/redhound/l4/udp.rbs +36 -0
  52. data/sig/generated/redhound/receiver.rbs +19 -0
  53. data/sig/generated/redhound/resolver.rbs +11 -0
  54. data/sig/generated/redhound/source/socket.rbs +13 -0
  55. data/sig/generated/redhound/version.rbs +5 -0
  56. data/sig/generated/redhound/writer.rbs +25 -0
  57. metadata +48 -11
  58. data/lib/redhound/header/ether.rb +0 -67
  59. data/lib/redhound/header.rb +0 -6
  60. data/lib/redhound/packet_mreq.rb +0 -46
  61. data/lib/redhound/socket_builder.rb +0 -30
  62. data/sig/redhound.rbs +0 -4
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redhound
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yudai Takada
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-01-02 00:00:00.000000000 Z
10
+ date: 2025-01-17 00:00:00.000000000 Z
11
11
  dependencies: []
12
12
  description: Redhound is a pure Ruby packet analyzer that can be used to capture and
13
13
  analyze network packets.
@@ -24,22 +24,59 @@ files:
24
24
  - LICENSE.txt
25
25
  - README.md
26
26
  - Rakefile
27
+ - Steepfile
27
28
  - docker-compose.yml
28
29
  - exe/redhound
29
30
  - lib/redhound.rb
30
31
  - lib/redhound/analyzer.rb
32
+ - lib/redhound/builder.rb
33
+ - lib/redhound/builder/packet_mreq.rb
34
+ - lib/redhound/builder/socket.rb
31
35
  - lib/redhound/command.rb
32
- - lib/redhound/header.rb
33
- - lib/redhound/header/ether.rb
34
- - lib/redhound/header/icmp.rb
35
- - lib/redhound/header/ipv4.rb
36
- - lib/redhound/header/udp.rb
37
- - lib/redhound/packet_mreq.rb
36
+ - lib/redhound/l2.rb
37
+ - lib/redhound/l2/ether.rb
38
+ - lib/redhound/l2/protocol.rb
39
+ - lib/redhound/l3.rb
40
+ - lib/redhound/l3/arp.rb
41
+ - lib/redhound/l3/base.rb
42
+ - lib/redhound/l3/ipv4.rb
43
+ - lib/redhound/l3/ipv6.rb
44
+ - lib/redhound/l3/protocol.rb
45
+ - lib/redhound/l3/resolver.rb
46
+ - lib/redhound/l4.rb
47
+ - lib/redhound/l4/base.rb
48
+ - lib/redhound/l4/icmp.rb
49
+ - lib/redhound/l4/resolver.rb
50
+ - lib/redhound/l4/udp.rb
38
51
  - lib/redhound/receiver.rb
39
- - lib/redhound/socket_builder.rb
52
+ - lib/redhound/resolver.rb
53
+ - lib/redhound/source.rb
54
+ - lib/redhound/source/socket.rb
40
55
  - lib/redhound/version.rb
41
56
  - lib/redhound/writer.rb
42
- - sig/redhound.rbs
57
+ - rbs_collection.lock.yaml
58
+ - rbs_collection.yaml
59
+ - sig/generated/redhound/analyzer.rbs
60
+ - sig/generated/redhound/builder/packet_mreq.rbs
61
+ - sig/generated/redhound/builder/socket.rbs
62
+ - sig/generated/redhound/command.rbs
63
+ - sig/generated/redhound/l2/ether.rbs
64
+ - sig/generated/redhound/l2/protocol.rbs
65
+ - sig/generated/redhound/l3/arp.rbs
66
+ - sig/generated/redhound/l3/base.rbs
67
+ - sig/generated/redhound/l3/ipv4.rbs
68
+ - sig/generated/redhound/l3/ipv6.rbs
69
+ - sig/generated/redhound/l3/protocol.rbs
70
+ - sig/generated/redhound/l3/resolver.rbs
71
+ - sig/generated/redhound/l4/base.rbs
72
+ - sig/generated/redhound/l4/icmp.rbs
73
+ - sig/generated/redhound/l4/resolver.rbs
74
+ - sig/generated/redhound/l4/udp.rbs
75
+ - sig/generated/redhound/receiver.rbs
76
+ - sig/generated/redhound/resolver.rbs
77
+ - sig/generated/redhound/source/socket.rbs
78
+ - sig/generated/redhound/version.rbs
79
+ - sig/generated/redhound/writer.rbs
43
80
  homepage: https://github.com/ydah/redhound
44
81
  licenses:
45
82
  - MIT
@@ -64,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
64
101
  - !ruby/object:Gem::Version
65
102
  version: '0'
66
103
  requirements: []
67
- rubygems_version: 3.6.2
104
+ rubygems_version: 3.7.0.dev
68
105
  specification_version: 4
69
106
  summary: Pure Ruby packet analyzer
70
107
  test_files: []
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Redhound
4
- class Header
5
- class Ether
6
- ETH_P_IP = 0x0800
7
-
8
- class << self
9
- def generate(bytes:)
10
- new(bytes:).generate
11
- end
12
- end
13
-
14
- def initialize(bytes:)
15
- raise ArgumentError, 'bytes must be 14 bytes' unless bytes.size == 14
16
-
17
- @bytes = bytes
18
- end
19
-
20
- def generate
21
- @dhost = @bytes[0..5]
22
- @shost = @bytes[6..11]
23
- @type = @bytes[12..13]
24
- self
25
- end
26
-
27
- def ipv4?
28
- hex_type == ETH_P_IP
29
- end
30
-
31
- def dump
32
- puts 'ETHERNET HEADER----------------'
33
- puts self
34
- end
35
-
36
- def to_s
37
- <<~ETHER
38
- Destination MAC: #{dhost}
39
- Source MAC: #{shost}
40
- Type: #{type}
41
- ETHER
42
- end
43
-
44
- def dhost
45
- @dhost.map { |b| b.to_s(16).rjust(2, '0') }.join(':')
46
- end
47
-
48
- def shost
49
- @shost.map { |b| b.to_s(16).rjust(2, '0') }.join(':')
50
- end
51
-
52
- def type
53
- if ipv4?
54
- 'IPv4'
55
- else
56
- 'Unknown'
57
- end
58
- end
59
-
60
- private
61
-
62
- def hex_type
63
- @hex_type ||= @type.map { |b| b.to_s(16).rjust(2, '0') }.join.to_i(16)
64
- end
65
- end
66
- end
67
- end
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'header/ether'
4
- require_relative 'header/icmp'
5
- require_relative 'header/ipv4'
6
- require_relative 'header/udp'
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'socket'
4
-
5
- module Redhound
6
- class PacketMreq
7
- PACKET_MR_PROMISC = 0x0001 # NOTE: netpacket/packet.h
8
-
9
- def initialize(ifname:)
10
- @ifname = ifname
11
- end
12
-
13
- # see: https://man7.org/linux/man-pages/man7/packet.7.html
14
- # struct packet_mreq {
15
- # int mr_ifindex; /* interface index */
16
- # unsigned short mr_type; /* action */
17
- # unsigned short mr_alen; /* address length */
18
- # unsigned char mr_address[8]; /* physical-layer address */
19
- # };
20
- def generate
21
- mr_ifindex + mr_type + mr_alen + mr_address
22
- end
23
-
24
- def mr_ifindex
25
- @mr_ifindex ||= [[index].pack('c')].pack('a4')
26
- end
27
-
28
- private
29
-
30
- def index
31
- ::Socket.getifaddrs.find { |ifaddr| ifaddr.name == @ifname }&.ifindex
32
- end
33
-
34
- def mr_type
35
- @mr_type ||= [PACKET_MR_PROMISC].pack('S')
36
- end
37
-
38
- def mr_alen
39
- @mr_alen ||= [0].pack('S')
40
- end
41
-
42
- def mr_address
43
- @mr_address ||= [0].pack('C') * 8
44
- end
45
- end
46
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'socket'
4
-
5
- module Redhound
6
- class SocketBuilder
7
- class << self
8
- def build(ifname:)
9
- new(ifname:).build
10
- end
11
- end
12
-
13
- SOL_PACKET = 0x0107 # bits/socket.h
14
- PACKET_ADD_MEMBERSHIP = 0x0001 # NOTE: netpacket/packet.h
15
- ETH_P_ALL = 768 # NOTE: htons(ETH_P_ALL) => linux/if_ether.h
16
- PACKED_ETH_P_ALL = [ETH_P_ALL].pack('S').unpack1('S>')
17
-
18
- def initialize(ifname:)
19
- @ifname = ifname
20
- @mq_req = PacketMreq.new(ifname: @ifname)
21
- end
22
-
23
- def build
24
- socket = Socket.new(Socket::AF_PACKET, Socket::SOCK_RAW, ETH_P_ALL)
25
- socket.bind([Socket::AF_PACKET, PACKED_ETH_P_ALL, @mq_req.mr_ifindex].pack('SS>a16'))
26
- socket.setsockopt(SOL_PACKET, PACKET_ADD_MEMBERSHIP, @mq_req.generate)
27
- socket
28
- end
29
- end
30
- end
data/sig/redhound.rbs DELETED
@@ -1,4 +0,0 @@
1
- module Redhound
2
- VERSION: String
3
- # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
- end