Skip to content

Commit 27157c1

Browse files
committed
🧹
1 parent 9295cbb commit 27157c1

19 files changed

+128
-109
lines changed

‎.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@
66
/pkg/
77
/spec/reports/
88
/tmp/
9+
Gemfile.lock

‎.ruby-version

-1
This file was deleted.

‎Gemfile

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

3-
source "https://rubygems.org"
3+
source 'https://rubygems.org'
44

5-
gem "rake", "~> 13.0"
5+
gem 'rake', '~> 13.0'

‎Gemfile.lock

-14
This file was deleted.

‎Rakefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# frozen_string_literal: true
22

3-
require "bundler/gem_tasks"
3+
require 'bundler/gem_tasks'
44
task default: %i[]

‎exe/redhound

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/usr/bin/env ruby
22
# frozen_string_literal: true
33

4-
$LOAD_PATH << File.join(__dir__, "../lib")
5-
require "redhound"
4+
$LOAD_PATH << File.join(__dir__, '../lib')
5+
require 'redhound'
66

77
Redhound::Command.new.run(ARGV.dup)

‎lib/redhound.rb

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# frozen_string_literal: true
22

3-
require_relative "redhound/analyzer"
4-
require_relative "redhound/command"
5-
require_relative "redhound/header"
6-
require_relative "redhound/packet_mreq"
7-
require_relative "redhound/receiver"
8-
require_relative "redhound/socket_builder"
9-
require_relative "redhound/version"
3+
require_relative 'redhound/analyzer'
4+
require_relative 'redhound/command'
5+
require_relative 'redhound/header'
6+
require_relative 'redhound/packet_mreq'
7+
require_relative 'redhound/receiver'
8+
require_relative 'redhound/socket_builder'
9+
require_relative 'redhound/version'

‎lib/redhound/analyzer.rb

+13-12
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
module Redhound
24
class Analyzer
35
def self.analyze(msg:)
@@ -9,20 +11,19 @@ def initialize(msg:)
911
end
1012

1113
def analyze
12-
puts "Analyzing..."
14+
puts 'Analyzing...'
1315
ether = Header::Ether.generate(bytes: @msg.bytes[0..13])
14-
pp ether
1516
ether.dump
16-
if ether.ipv4?
17-
ip = Header::Ipv4.generate(bytes: @msg.bytes[14..33])
18-
ip.dump
19-
if ip.udp?
20-
udp = Header::Udp.generate(bytes: @msg.bytes[34..41])
21-
udp.dump
22-
elsif ip.icmp?
23-
icmp = Header::Icmp.generate(bytes: @msg.bytes[34..41])
24-
icmp.dump
25-
end
17+
return unless ether.ipv4?
18+
19+
ip = Header::Ipv4.generate(bytes: @msg.bytes[14..33])
20+
ip.dump
21+
if ip.udp?
22+
udp = Header::Udp.generate(bytes: @msg.bytes[34..41])
23+
udp.dump
24+
elsif ip.icmp?
25+
icmp = Header::Icmp.generate(bytes: @msg.bytes[34..41])
26+
icmp.dump
2627
end
2728
end
2829
end

‎lib/redhound/command.rb

+20-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
require "optparse"
2-
require "socket"
1+
# frozen_string_literal: true
2+
3+
require 'optparse'
4+
require 'socket'
35

46
module Redhound
57
class Command
@@ -10,7 +12,7 @@ def initialize
1012
def run(argv)
1113
parse(argv)
1214
if @options[:ifname].nil?
13-
warn "Error: interface is required"
15+
warn 'Error: interface is required'
1416
exit 1
1517
end
1618
Receiver.run(ifname: @options[:ifname])
@@ -30,12 +32,21 @@ def parse(argv)
3032
3133
Usage: redhound [options] ...
3234
BANNER2
33-
o.separator ""
34-
o.separator "Options:"
35-
o.on("-i", "--interface INTERFACE", "name or idx of interface") { |v| @options[:ifname] = v }
36-
o.on("-D", "--list-interfaces", "print list of interfaces and exit") { list_interfaces; exit }
37-
o.on("-h", "--help", "display this help and exit") { puts o; exit }
38-
o.on("-v", "--version", "display version information and exit") { puts "Redhound #{Redhound::VERSION}"; exit }
35+
o.separator ''
36+
o.separator 'Options:'
37+
o.on('-i', '--interface INTERFACE', 'name or idx of interface') { |v| @options[:ifname] = v }
38+
o.on('-D', '--list-interfaces', 'print list of interfaces and exit') do
39+
list_interfaces
40+
exit
41+
end
42+
o.on('-h', '--help', 'display this help and exit') do
43+
puts o
44+
exit
45+
end
46+
o.on('-v', '--version', 'display version information and exit') do
47+
puts "Redhound #{Redhound::VERSION}"
48+
exit
49+
end
3950
o.on_tail
4051
o.parse!(argv)
4152
end

‎lib/redhound/header.rb

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
require_relative "header/ether"
2-
require_relative "header/icmp"
3-
require_relative "header/ipv4"
4-
require_relative "header/udp"
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'

‎lib/redhound/header/ether.rb

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
module Redhound
24
class Header
35
class Ether
@@ -11,6 +13,7 @@ def generate(bytes:)
1113

1214
def initialize(bytes:)
1315
raise ArgumentError, 'bytes must be 14 bytes' unless bytes.size == 14
16+
1417
@bytes = bytes
1518
end
1619

@@ -27,7 +30,7 @@ def ipv4?
2730
end
2831

2932
def dump
30-
puts "ETHERNET HEADER----------------"
33+
puts 'ETHERNET HEADER----------------'
3134
puts self
3235
end
3336

@@ -40,25 +43,25 @@ def to_s
4043
end
4144

4245
def dhost
43-
@dhost.map { |b| b.to_s(16).rjust(2, "0") }.join(":")
46+
@dhost.map { |b| b.to_s(16).rjust(2, '0') }.join(':')
4447
end
4548

4649
def shost
47-
@shost.map { |b| b.to_s(16).rjust(2, "0") }.join(":")
50+
@shost.map { |b| b.to_s(16).rjust(2, '0') }.join(':')
4851
end
4952

5053
def type
5154
if ipv4?
52-
"IPv4"
55+
'IPv4'
5356
else
54-
"Unknown"
57+
'Unknown'
5558
end
5659
end
5760

5861
private
5962

6063
def hex_type
61-
@hex_type ||= @type.map { |b| b.to_s(16).rjust(2, "0") }.join.to_i(16)
64+
@hex_type ||= @type.map { |b| b.to_s(16).rjust(2, '0') }.join.to_i(16)
6265
end
6366
end
6467
end

‎lib/redhound/header/icmp.rb

+12-9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
module Redhound
24
class Header
35
class Icmp
@@ -9,6 +11,7 @@ def generate(bytes:)
911

1012
def initialize(bytes:)
1113
raise ArgumentError, 'bytes must be bigger than 8 bytes' unless bytes.size >= 8
14+
1215
@bytes = bytes
1316
end
1417

@@ -17,23 +20,23 @@ def generate
1720
@code = @bytes[1]
1821
@check = @bytes[2..3]
1922
# refs: https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml#icmp-parameters-types
20-
if @type == 0 || @type == 8
23+
if @type.zero? || @type == 8
2124
@id = @bytes[4..5]
2225
@seq = @bytes[6..7]
23-
@data = @bytes[8..-1]
26+
@data = @bytes[8..]
2427
else
25-
@data = @bytes[4..-1]
28+
@data = @bytes[4..]
2629
end
2730
self
2831
end
2932

3033
def dump
31-
puts "ICMP HEADER----------------"
34+
puts 'ICMP HEADER----------------'
3235
puts self
3336
end
3437

3538
def to_s
36-
if @type == 0 || @type == 8
39+
if @type.zero? || @type == 8
3740
<<~ICMP
3841
Type: #{@type}
3942
Code: #{@code}
@@ -55,19 +58,19 @@ def to_s
5558
private
5659

5760
def check
58-
@check.map { |b| b.to_s(16).rjust(2, "0") }.join
61+
@check.map { |b| b.to_s(16).rjust(2, '0') }.join
5962
end
6063

6164
def id
62-
@id.map { |b| b.to_s(16).rjust(2, "0") }.join.to_i(16)
65+
@id.map { |b| b.to_s(16).rjust(2, '0') }.join.to_i(16)
6366
end
6467

6568
def seq
66-
@seq.map { |b| b.to_s(16).rjust(2, "0") }.join.to_i(16)
69+
@seq.map { |b| b.to_s(16).rjust(2, '0') }.join.to_i(16)
6770
end
6871

6972
def data
70-
@data.map { |b| b.chr }.join
73+
@data.map(&:chr).join
7174
end
7275
end
7376
end

‎lib/redhound/header/ipv4.rb

+13-10
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# frozen_string_literal: true
2+
13
module Redhound
24
class Header
35
class Ipv4
@@ -13,6 +15,7 @@ def generate(bytes:)
1315

1416
def initialize(bytes:)
1517
raise ArgumentError, 'bytes must be 20 bytes' unless bytes.size == 20
18+
1619
@bytes = bytes
1720
end
1821

@@ -40,7 +43,7 @@ def udp?
4043
end
4144

4245
def dump
43-
puts "IPv4 HEADER----------------"
46+
puts 'IPv4 HEADER----------------'
4447
puts self
4548
end
4649

@@ -71,38 +74,38 @@ def ihl
7174
end
7275

7376
def tot_len
74-
@tot_len.map { |b| b.to_s(16).rjust(2, "0") }.join.to_i(16)
77+
@tot_len.map { |b| b.to_s(16).rjust(2, '0') }.join.to_i(16)
7578
end
7679

7780
def id
78-
@id.map { |b| b.to_s(16).rjust(2, "0") }.join.to_i(16)
81+
@id.map { |b| b.to_s(16).rjust(2, '0') }.join.to_i(16)
7982
end
8083

8184
def frag_off
82-
@frag_off.map { |b| b.to_s(16).rjust(2, "0") }.join.to_i(16) & 0x1FFF
85+
@frag_off.map { |b| b.to_s(16).rjust(2, '0') }.join.to_i(16) & 0x1FFF
8386
end
8487

8588
def protocol
8689
case @protocol
8790
when ICMP
88-
"ICMP"
91+
'ICMP'
8992
when UDP
90-
"UDP"
93+
'UDP'
9194
else
92-
"Unknown"
95+
'Unknown'
9396
end
9497
end
9598

9699
def check
97-
@check.map { |b| b.to_s(16).rjust(2, "0") }.join.to_i(16)
100+
@check.map { |b| b.to_s(16).rjust(2, '0') }.join.to_i(16)
98101
end
99102

100103
def saddr
101-
@saddr.map { |b| b.to_s(16).rjust(2, "0") }.join(".")
104+
@saddr.map { |b| b.to_s(16).rjust(2, '0') }.join('.')
102105
end
103106

104107
def daddr
105-
@daddr.map { |b| b.to_s(16).rjust(2, "0") }.join(".")
108+
@daddr.map { |b| b.to_s(16).rjust(2, '0') }.join('.')
106109
end
107110
end
108111
end

0 commit comments

Comments
 (0)