File tree 5 files changed +69
-4
lines changed
5 files changed +69
-4
lines changed Original file line number Diff line number Diff line change @@ -20,11 +20,20 @@ gem install redhound
20
20
## Usage
21
21
22
22
``` command
23
+ ___ ____ __
24
+ / _ \_ __ ___/ / / ___ __ _____ ___/ /
25
+ / , _/ -_) _ / _ \/ _ \/ // / _ \/ _ /
26
+ /_/| _| \_ _/\_ ,_/_//_/\_ __/\_ ,_/_//_/\_ ,_/
27
+
28
+ Version: 0.1.0
29
+ Dump and analyze network packets.
30
+
23
31
Usage: redhound [options] ...
24
32
25
33
Options:
26
34
-i, --interface INTERFACE name or idx of interface
27
35
-D, --list-interfaces print list of interfaces and exit
36
+ -w FILE write packets to a pcapng-format file named " outfile"
28
37
-h, --help display this help and exit
29
38
-v, --version display version information and exit
30
39
```
Original file line number Diff line number Diff line change 7
7
require_relative 'redhound/receiver'
8
8
require_relative 'redhound/socket_builder'
9
9
require_relative 'redhound/version'
10
+ require_relative 'redhound/writer'
Original file line number Diff line number Diff line change @@ -15,7 +15,7 @@ def run(argv)
15
15
warn 'Error: interface is required'
16
16
exit 1
17
17
end
18
- Receiver . run ( ifname : @options [ :ifname ] )
18
+ Receiver . run ( ifname : @options [ :ifname ] , filename : @options [ :filename ] )
19
19
end
20
20
21
21
def parse ( argv )
@@ -39,6 +39,7 @@ def parse(argv)
39
39
list_interfaces
40
40
exit
41
41
end
42
+ o . on ( '-w FILE' , 'write packets to a pcapng-format file named "outfile"' ) { |v | @options [ :filename ] = v }
42
43
o . on ( '-h' , '--help' , 'display this help and exit' ) do
43
44
puts o
44
45
exit
Original file line number Diff line number Diff line change 5
5
module Redhound
6
6
class Receiver
7
7
class << self
8
- def run ( ifname :)
9
- new ( ifname :) . run
8
+ def run ( ifname :, filename : )
9
+ new ( ifname :, filename : ) . run
10
10
end
11
11
end
12
12
13
- def initialize ( ifname :)
13
+ def initialize ( ifname :, filename : )
14
14
@ifname = ifname
15
15
@socket = SocketBuilder . build ( ifname :)
16
+ if filename
17
+ @writer = Writer . new ( filename :)
18
+ @writer . start
19
+ end
16
20
end
17
21
18
22
def run
19
23
loop do
20
24
msg , = @socket . recvfrom ( 2048 )
21
25
Analyzer . analyze ( msg :)
26
+ @writer . write ( msg ) if @writer
27
+ rescue Interrupt
28
+ @writer . stop if @writer
29
+ break
22
30
end
23
31
end
24
32
end
Original file line number Diff line number Diff line change
1
+ # frozen_string_literal: true
2
+
3
+ module Redhound
4
+ class Writer
5
+ def initialize ( filename :)
6
+ @filename = filename
7
+ end
8
+
9
+ def start
10
+ @file = File . open ( @filename , 'wb' )
11
+ @file . write ( file_header )
12
+ end
13
+
14
+ def write ( msg )
15
+ @file . write ( packet_record ( Time . now , msg . bytesize , msg . bytesize ) )
16
+ @file . write ( msg )
17
+ end
18
+
19
+ def stop
20
+ @file . close
21
+ end
22
+
23
+ private
24
+
25
+ def file_header
26
+ [
27
+ 0xa1b2c3d4 , # Magic Number (little-endian)
28
+ 2 , # Version Major
29
+ 4 , # Version Minor
30
+ 0 , # Timezone offset (GMT)
31
+ 0 , # Timestamp accuracy
32
+ 65535 , # Snapshot length
33
+ 1 # Link-layer header type (Ethernet)
34
+ ] . pack ( 'VvvVVVV' )
35
+ end
36
+
37
+ def packet_record ( timestamp , captured_length , original_length )
38
+ [
39
+ timestamp . to_i , # Timestamp seconds
40
+ ( timestamp . usec || 0 ) , # Timestamp microseconds
41
+ captured_length , # Captured packet length
42
+ original_length # Original packet length
43
+ ] . pack ( 'VVVV' )
44
+ end
45
+ end
46
+ end
You can’t perform that action at this time.
0 commit comments