bettercap 1.4.6 → 1.5.0
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.
- checksums.yaml +4 -4
- data/bin/bettercap +1 -1
- data/lib/bettercap.rb +1 -0
- data/lib/bettercap/context.rb +63 -70
- data/lib/bettercap/discovery/agents/base.rb +2 -2
- data/lib/bettercap/discovery/thread.rb +5 -4
- data/lib/bettercap/firewalls/base.rb +2 -4
- data/lib/bettercap/firewalls/{osx.rb → bsd.rb} +3 -3
- data/lib/bettercap/firewalls/linux.rb +2 -2
- data/lib/bettercap/firewalls/redirection.rb +5 -2
- data/lib/bettercap/logger.rb +6 -11
- data/lib/bettercap/memory.rb +56 -0
- data/lib/bettercap/monkey/em-proxy/proxy.rb +23 -0
- data/lib/bettercap/monkey/packetfu/pcap.rb +51 -0
- data/lib/bettercap/network/arp_reader.rb +2 -2
- data/lib/bettercap/network/network.rb +2 -2
- data/lib/bettercap/network/packet_queue.rb +2 -2
- data/lib/bettercap/network/protos/base.rb +8 -5
- data/lib/bettercap/network/protos/dhcp.rb +5 -124
- data/lib/bettercap/network/target.rb +7 -2
- data/lib/bettercap/options/core_options.rb +189 -0
- data/lib/bettercap/options/options.rb +167 -0
- data/lib/bettercap/options/proxy_options.rb +258 -0
- data/lib/bettercap/options/server_options.rb +71 -0
- data/lib/bettercap/options/sniff_options.rb +90 -0
- data/lib/bettercap/options/spoof_options.rb +71 -0
- data/lib/bettercap/proxy/{module.rb → http/module.rb} +8 -4
- data/lib/bettercap/proxy/{modules → http/modules}/injectcss.rb +2 -2
- data/lib/bettercap/proxy/{modules → http/modules}/injecthtml.rb +2 -2
- data/lib/bettercap/proxy/{modules → http/modules}/injectjs.rb +2 -2
- data/lib/bettercap/proxy/{proxy.rb → http/proxy.rb} +5 -2
- data/lib/bettercap/proxy/{request.rb → http/request.rb} +4 -0
- data/lib/bettercap/proxy/{response.rb → http/response.rb} +3 -0
- data/lib/bettercap/proxy/{ssl → http/ssl}/authority.rb +3 -1
- data/lib/bettercap/proxy/{ssl → http/ssl}/bettercap-ca.pem +0 -0
- data/lib/bettercap/proxy/{ssl → http/ssl}/server.rb +3 -1
- data/lib/bettercap/proxy/{sslstrip → http/sslstrip}/cookiemonitor.rb +2 -0
- data/lib/bettercap/proxy/{sslstrip → http/sslstrip}/lock.ico +0 -0
- data/lib/bettercap/proxy/{sslstrip → http/sslstrip}/strip.rb +4 -2
- data/lib/bettercap/proxy/{streamer.rb → http/streamer.rb} +7 -4
- data/lib/bettercap/proxy/stream_logger.rb +25 -9
- data/lib/bettercap/proxy/tcp/module.rb +75 -0
- data/lib/bettercap/proxy/tcp/proxy.rb +123 -0
- data/lib/bettercap/proxy/thread_pool.rb +1 -1
- data/lib/bettercap/sniffer/parsers/post.rb +1 -1
- data/lib/bettercap/sniffer/parsers/url.rb +1 -1
- data/lib/bettercap/sniffer/sniffer.rb +23 -17
- data/lib/bettercap/spoofers/arp.rb +21 -9
- data/lib/bettercap/spoofers/base.rb +12 -16
- data/lib/bettercap/spoofers/icmp.rb +4 -5
- data/lib/bettercap/spoofers/none.rb +0 -1
- data/lib/bettercap/version.rb +1 -1
- metadata +48 -19
- data/lib/bettercap/firewalls/openbsd.rb +0 -77
- data/lib/bettercap/options.rb +0 -600
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9a2d2ef953dadd1f83f919602e1ce9ea7412196
|
4
|
+
data.tar.gz: 3f72b7be236e36d547ea39d8542946202c2299d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab73ae16afddedccdc90f7a4e5c1a370ff6e020514562dfaa06b46123b838cfee1166751bec560c63143d3c24cf9e5c3bf25c7120aedf1abde3d31b2ea39503b
|
7
|
+
data.tar.gz: 43286b7a2efabda473a34c333d5cbe37c1fb83706aba9a8beced40c314c84b7799062084cb2ce5eafdd9b183aa1973a664bf96aba1b5adb661d298807eb52255
|
data/bin/bettercap
CHANGED
data/lib/bettercap.rb
CHANGED
data/lib/bettercap/context.rb
CHANGED
@@ -21,10 +21,8 @@ class Context
|
|
21
21
|
attr_accessor :ifconfig
|
22
22
|
# Instance of the current BetterCap::Firewalls class.
|
23
23
|
attr_accessor :firewall
|
24
|
-
# Network gateway
|
24
|
+
# Network gateway ( as an instance of BetterCap::Network::Target ).
|
25
25
|
attr_accessor :gateway
|
26
|
-
# A boolean value indicating if the gateway mac address was already resolved.
|
27
|
-
attr_accessor :gateway_mac_resolved
|
28
26
|
# A list of BetterCap::Target objects which is periodically updated.
|
29
27
|
attr_accessor :targets
|
30
28
|
# Instance of BetterCap::Discovery::Thread class.
|
@@ -42,6 +40,8 @@ class Context
|
|
42
40
|
attr_reader :timeout
|
43
41
|
# Instance of BetterCap::PacketQueue.
|
44
42
|
attr_reader :packets
|
43
|
+
# Instance of BetterCap::Memory.
|
44
|
+
attr_reader :memory
|
45
45
|
|
46
46
|
@@instance = nil
|
47
47
|
|
@@ -51,12 +51,6 @@ class Context
|
|
51
51
|
@@instance ||= self.new
|
52
52
|
end
|
53
53
|
|
54
|
-
# Runs a minor GC to collect young, short-lived objects.
|
55
|
-
def self.run_gc
|
56
|
-
Logger.debug "Running Ruby garbage collector ..."
|
57
|
-
GC.start( full_mark: false )
|
58
|
-
end
|
59
|
-
|
60
54
|
# Initialize the global context object.
|
61
55
|
def initialize
|
62
56
|
begin
|
@@ -66,47 +60,51 @@ class Context
|
|
66
60
|
Logger.exception e
|
67
61
|
end
|
68
62
|
|
69
|
-
@running
|
70
|
-
@timeout
|
71
|
-
@options
|
72
|
-
@ifconfig
|
73
|
-
@firewall
|
74
|
-
@gateway
|
75
|
-
@
|
76
|
-
@
|
77
|
-
@
|
78
|
-
@
|
79
|
-
@
|
80
|
-
@
|
81
|
-
@
|
82
|
-
@
|
83
|
-
@
|
84
|
-
@
|
63
|
+
@running = true
|
64
|
+
@timeout = 5
|
65
|
+
@options = Options.new iface
|
66
|
+
@ifconfig = nil
|
67
|
+
@firewall = nil
|
68
|
+
@gateway = nil
|
69
|
+
@targets = []
|
70
|
+
@spoofer = nil
|
71
|
+
@httpd = nil
|
72
|
+
@dnsd = nil
|
73
|
+
@proxies = []
|
74
|
+
@redirections = []
|
75
|
+
@discovery = Discovery::Thread.new self
|
76
|
+
@firewall = Firewalls::Base.get
|
77
|
+
@packets = nil
|
78
|
+
@memory = Memory.new
|
85
79
|
end
|
86
80
|
|
87
81
|
# Update the Context state parsing network related informations.
|
88
82
|
def update!
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
raise BetterCap::Error, "Could not determine IPv4 address of '#{@options.iface}', make sure this interface "\
|
93
|
-
'is active and connected.' if @ifconfig[:ip4_obj].nil?
|
94
|
-
|
95
|
-
raise BetterCap::Error, "Could not detect the gateway address for interface #{@options.iface}, "\
|
83
|
+
gw = @options.core.gateway || Network.get_gateway
|
84
|
+
raise BetterCap::Error, "Could not detect the gateway address for interface #{@options.core.iface}, "\
|
96
85
|
'make sure you\'ve specified the correct network interface to use and to have the '\
|
97
86
|
'correct network configuration, this could also happen if bettercap '\
|
98
|
-
'is launched from a virtual environment.' unless Network::Validator.is_ip?(
|
87
|
+
'is launched from a virtual environment.' unless Network::Validator.is_ip?(gw)
|
88
|
+
|
89
|
+
@gateway = Network::Target.new gw
|
90
|
+
@targets = @options.core.targets unless @options.core.targets.nil?
|
91
|
+
@ifconfig = PacketFu::Utils.ifconfig @options.core.iface
|
92
|
+
|
93
|
+
raise BetterCap::Error, "Could not determine IPv4 address of '#{@options.core.iface}', make sure this interface "\
|
94
|
+
'is active and connected.' if @ifconfig[:ip4_obj].nil?
|
99
95
|
|
100
96
|
Logger.debug '----- NETWORK INFORMATIONS -----'
|
101
97
|
Logger.debug " network = #{@ifconfig[:ip4_obj]}"
|
102
|
-
Logger.debug " gateway = #{@gateway}"
|
98
|
+
Logger.debug " gateway = #{@gateway.ip}"
|
103
99
|
Logger.debug " local_ip = #{@ifconfig[:ip_saddr]}\n"
|
104
100
|
@ifconfig.each do |key,value|
|
105
101
|
Logger.debug " ifconfig[:#{key}] = #{value}"
|
106
102
|
end
|
107
103
|
Logger.debug "--------------------------------\n"
|
108
104
|
|
109
|
-
@packets = Network::PacketQueue.new( @ifconfig[:iface], @options.packet_throttle, 4 )
|
105
|
+
@packets = Network::PacketQueue.new( @ifconfig[:iface], @options.core.packet_throttle, 4 )
|
106
|
+
# Spoofers need the context network data to be initialized.
|
107
|
+
@spoofer = @options.spoof.parse_spoofers
|
110
108
|
end
|
111
109
|
|
112
110
|
# Find a target given its +ip+ and +mac+ addresses inside the #targets
|
@@ -122,15 +120,13 @@ class Context
|
|
122
120
|
|
123
121
|
# Start everything!
|
124
122
|
def start!
|
125
|
-
# Start targets auto discovery
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
sleep 1.5
|
133
|
-
end
|
123
|
+
# Start targets auto discovery.
|
124
|
+
BetterCap::Logger.info( "Targeting the whole subnet #{@ifconfig[:ip4_obj].to_range} ..." ) unless @options.spoof.enabled? or @options.core.arpcache
|
125
|
+
@discovery.start
|
126
|
+
# give some time to the discovery thread to spawn its workers,
|
127
|
+
# this will prevent 'Too many open files' errors to delay host
|
128
|
+
# discovery.
|
129
|
+
sleep(1.5) unless @options.core.arpcache
|
134
130
|
|
135
131
|
# Start network spoofers if any.
|
136
132
|
@spoofer.each do |spoofer|
|
@@ -138,8 +134,8 @@ class Context
|
|
138
134
|
end
|
139
135
|
|
140
136
|
# Start proxies and setup port redirection.
|
141
|
-
if @options.
|
142
|
-
if @options.
|
137
|
+
if @options.proxies.any?
|
138
|
+
if ( @options.proxies.proxy or @options.proxies.proxy_https ) and @options.sniff.enabled?('URL')
|
143
139
|
BetterCap::Logger.warn "WARNING: Both HTTP transparent proxy and URL parser are enabled, you're gonna see duplicated logs."
|
144
140
|
end
|
145
141
|
create_proxies!
|
@@ -150,22 +146,14 @@ class Context
|
|
150
146
|
create_servers!
|
151
147
|
|
152
148
|
# Start network sniffer.
|
153
|
-
if @options.
|
149
|
+
if @options.sniff.enabled?
|
154
150
|
Sniffer.start self
|
155
|
-
elsif @options.
|
151
|
+
elsif @options.spoof.enabled? and !@options.proxies.any?
|
156
152
|
Logger.warn 'WARNING: Sniffer module was NOT enabled ( -X argument ), this '\
|
157
|
-
'will cause the MITM to run but no data to be collected.'
|
153
|
+
'will cause the MITM to run but no data to be collected.'
|
158
154
|
end
|
159
155
|
end
|
160
156
|
|
161
|
-
def post_sniffer_enabled?
|
162
|
-
( @options.sniffer and @options.parsers.include?('POST') )
|
163
|
-
end
|
164
|
-
|
165
|
-
def need_gateway?
|
166
|
-
( @options.arpcache == false or @options.has_spoofer? )
|
167
|
-
end
|
168
|
-
|
169
157
|
# Stop every running daemon that was started and reset system state.
|
170
158
|
def finalize
|
171
159
|
@running = false
|
@@ -208,7 +196,7 @@ class Context
|
|
208
196
|
def enable_port_redirection!
|
209
197
|
@redirections = @options.get_redirections(@ifconfig)
|
210
198
|
@redirections.each do |r|
|
211
|
-
Logger.debug "Redirecting #{r.protocol} traffic from
|
199
|
+
Logger.debug "Redirecting #{r.protocol} traffic from #{r.src_address.nil? ? '*' : r.src_address}:#{r.src_port} to #{r.dst_address}:#{r.dst_port}"
|
212
200
|
@firewall.add_port_redirection( r )
|
213
201
|
end
|
214
202
|
end
|
@@ -216,19 +204,24 @@ class Context
|
|
216
204
|
# Initialize the needed transparent proxies and the processor routined which
|
217
205
|
# is needed in order to run proxy modules.
|
218
206
|
def create_proxies!
|
219
|
-
if @options.has_proxy_module?
|
220
|
-
Proxy::Module.register_modules
|
221
|
-
raise BetterCap::Error, "#{@options.proxy_module} is not a valid bettercap proxy module." if Proxy::Module.modules.empty?
|
207
|
+
if @options.proxies.has_proxy_module?
|
208
|
+
Proxy::HTTP::Module.register_modules
|
209
|
+
raise BetterCap::Error, "#{@options.proxies.proxy_module} is not a valid bettercap proxy module." if Proxy::HTTP::Module.modules.empty?
|
222
210
|
end
|
223
211
|
|
224
212
|
# create HTTP proxy
|
225
|
-
if @options.proxy
|
226
|
-
@proxies << Proxy::Proxy.new( @ifconfig[:ip_saddr], @options.proxy_port, false )
|
213
|
+
if @options.proxies.proxy
|
214
|
+
@proxies << Proxy::HTTP::Proxy.new( @ifconfig[:ip_saddr], @options.proxies.proxy_port, false )
|
227
215
|
end
|
228
216
|
|
229
217
|
# create HTTPS proxy
|
230
|
-
if @options.proxy_https
|
231
|
-
@proxies << Proxy::Proxy.new( @ifconfig[:ip_saddr], @options.proxy_https_port, true )
|
218
|
+
if @options.proxies.proxy_https
|
219
|
+
@proxies << Proxy::HTTP::Proxy.new( @ifconfig[:ip_saddr], @options.proxies.proxy_https_port, true )
|
220
|
+
end
|
221
|
+
|
222
|
+
# create TCP proxy
|
223
|
+
if @options.proxies.tcp_proxy
|
224
|
+
@proxies << Proxy::TCP::Proxy.new( @ifconfig[:ip_saddr], @options.proxies.tcp_proxy_port, @options.proxies.tcp_proxy_upstream_address, @options.proxies.tcp_proxy_upstream_port )
|
232
225
|
end
|
233
226
|
|
234
227
|
@proxies.each do |proxy|
|
@@ -239,16 +232,16 @@ class Context
|
|
239
232
|
# Initialize and start the needed servers.
|
240
233
|
def create_servers!
|
241
234
|
# Start local DNS server.
|
242
|
-
if @options.dnsd
|
243
|
-
Logger.warn "Starting DNS server with spoofing disabled, bettercap will only reply to local DNS queries." unless @options.
|
235
|
+
if @options.servers.dnsd
|
236
|
+
Logger.warn "Starting DNS server with spoofing disabled, bettercap will only reply to local DNS queries." unless @options.spoof.enabled?
|
244
237
|
|
245
|
-
@dnsd = Network::Servers::DNSD.new( @options.dnsd_file, @ifconfig[:ip_saddr], @options.dnsd_port )
|
238
|
+
@dnsd = Network::Servers::DNSD.new( @options.servers.dnsd_file, @ifconfig[:ip_saddr], @options.servers.dnsd_port )
|
246
239
|
@dnsd.start
|
247
240
|
end
|
248
241
|
|
249
242
|
# Start local HTTP server.
|
250
|
-
if @options.httpd
|
251
|
-
@httpd = Network::Servers::HTTPD.new( @options.httpd_port, @options.httpd_path )
|
243
|
+
if @options.servers.httpd
|
244
|
+
@httpd = Network::Servers::HTTPD.new( @options.servers.httpd_port, @options.servers.httpd_path )
|
252
245
|
@httpd.start
|
253
246
|
end
|
254
247
|
end
|
@@ -49,8 +49,8 @@ class Base
|
|
49
49
|
# Return true if +ip+ must be skipped during discovery, otherwise false.
|
50
50
|
def skip_address?(ip)
|
51
51
|
# don't send probes to the gateway if we already have its MAC.
|
52
|
-
if ip == @ctx.gateway
|
53
|
-
return
|
52
|
+
if ip == @ctx.gateway.ip
|
53
|
+
return !@ctx.gateway.mac.nil?
|
54
54
|
# don't send probes to our device
|
55
55
|
elsif ip == @local_ip
|
56
56
|
return true
|
@@ -31,7 +31,7 @@ class Thread
|
|
31
31
|
def stop
|
32
32
|
@running = false
|
33
33
|
if @thread != nil
|
34
|
-
Logger.info( 'Stopping network discovery thread ...' ) unless @ctx.options.arpcache
|
34
|
+
Logger.info( 'Stopping network discovery thread ...' ) unless @ctx.options.core.arpcache
|
35
35
|
begin
|
36
36
|
@thread.exit
|
37
37
|
rescue
|
@@ -97,17 +97,18 @@ class Thread
|
|
97
97
|
# This method implements the main discovery logic, it will be executed within
|
98
98
|
# the spawned thread.
|
99
99
|
def worker
|
100
|
-
Logger.debug( 'Network discovery thread started.' ) unless @ctx.options.arpcache
|
100
|
+
Logger.debug( 'Network discovery thread started.' ) unless @ctx.options.core.arpcache
|
101
101
|
|
102
102
|
prev = []
|
103
103
|
while @running
|
104
104
|
@ctx.targets = Network.get_alive_targets(@ctx).sort_by { |t| t.sortable_ip }
|
105
105
|
|
106
|
-
print_differences( prev ) unless @ctx.options.arpcache
|
106
|
+
print_differences( prev ) unless @ctx.options.core.arpcache
|
107
107
|
|
108
108
|
prev = @ctx.targets
|
109
109
|
|
110
|
-
|
110
|
+
@ctx.memory.optimize!
|
111
|
+
sleep(1) if @ctx.options.core.arpcache
|
111
112
|
end
|
112
113
|
end
|
113
114
|
end
|
@@ -22,12 +22,10 @@ class Base
|
|
22
22
|
def get
|
23
23
|
return @@instance unless @@instance.nil?
|
24
24
|
|
25
|
-
if RUBY_PLATFORM =~ /darwin/
|
26
|
-
@@instance = Firewalls::
|
25
|
+
if RUBY_PLATFORM =~ /openbsd/ or RUBY_PLATFORM =~ /darwin/
|
26
|
+
@@instance = Firewalls::BSD.new
|
27
27
|
elsif RUBY_PLATFORM =~ /linux/
|
28
28
|
@@instance = Firewalls::Linux.new
|
29
|
-
elsif RUBY_PLATFORM =~ /openbsd/
|
30
|
-
@@instance = Firewalls::OpenBSD.new
|
31
29
|
else
|
32
30
|
raise BetterCap::Error, 'Unsupported operating system'
|
33
31
|
end
|
@@ -13,8 +13,8 @@ This project is released under the GPL 3 license.
|
|
13
13
|
|
14
14
|
module BetterCap
|
15
15
|
module Firewalls
|
16
|
-
# OSX Firewall class.
|
17
|
-
class
|
16
|
+
# *BSD and OSX Firewall class.
|
17
|
+
class BSD < Base
|
18
18
|
# If +enabled+ is true will enable packet forwarding, otherwise it will
|
19
19
|
# disable it.
|
20
20
|
def enable_forwarding(enabled)
|
@@ -49,7 +49,7 @@ class OSX < Base
|
|
49
49
|
config_file = "/tmp/bettercap_pf_#{Process.pid}.conf"
|
50
50
|
|
51
51
|
File.open( config_file, 'a+t' ) do |f|
|
52
|
-
f.write "rdr pass on #{r.interface} proto #{r.protocol} from any to any port #{r.src_port} -> #{r.dst_address} port #{r.dst_port}\n"
|
52
|
+
f.write "rdr pass on #{r.interface} proto #{r.protocol} from any to #{r.src_address.nil? ? 'any' : r.src_address} port #{r.src_port} -> #{r.dst_address} port #{r.dst_port}\n"
|
53
53
|
end
|
54
54
|
|
55
55
|
# load the rule
|
@@ -50,7 +50,7 @@ class Linux < Base
|
|
50
50
|
# accept all
|
51
51
|
Shell.execute('iptables -P FORWARD ACCEPT')
|
52
52
|
# add redirection
|
53
|
-
Shell.execute("iptables -t nat -A PREROUTING -i #{r.interface} -p #{r.protocol} --dport #{r.src_port} -j DNAT --to #{r.dst_address}:#{r.dst_port}")
|
53
|
+
Shell.execute("iptables -t nat -A PREROUTING -i #{r.interface} -p #{r.protocol} #{r.src_address.nil? ? '' : "-d #{r.src_address}"} --dport #{r.src_port} -j DNAT --to #{r.dst_address}:#{r.dst_port}")
|
54
54
|
end
|
55
55
|
|
56
56
|
# Remove the +r+ BetterCap::Firewalls::Redirection port redirection object.
|
@@ -58,7 +58,7 @@ class Linux < Base
|
|
58
58
|
# remove post route
|
59
59
|
Shell.execute('iptables -t nat -D POSTROUTING -s 0/0 -j MASQUERADE')
|
60
60
|
# remove redirection
|
61
|
-
Shell.execute("iptables -t nat -D PREROUTING -i #{r.interface} -p #{r.protocol} --dport #{r.src_port} -j DNAT --to #{r.dst_address}:#{r.dst_port}")
|
61
|
+
Shell.execute("iptables -t nat -D PREROUTING -i #{r.interface} -p #{r.protocol} #{r.src_address.nil? ? '' : "-d #{r.src_address}"} --dport #{r.src_port} -j DNAT --to #{r.dst_address}:#{r.dst_port}")
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
@@ -18,6 +18,8 @@ class Redirection
|
|
18
18
|
attr_reader :interface
|
19
19
|
# Protocol name.
|
20
20
|
attr_reader :protocol
|
21
|
+
# Source address.
|
22
|
+
attr_reader :src_address
|
21
23
|
# Source port.
|
22
24
|
attr_reader :src_port
|
23
25
|
# Destination address.
|
@@ -26,10 +28,11 @@ class Redirection
|
|
26
28
|
attr_reader :dst_port
|
27
29
|
|
28
30
|
# Create the redirection rule for the specified +interface+ and +protocol+.
|
29
|
-
# Redirect
|
30
|
-
def initialize( interface, protocol, src_port, dst_address, dst_port )
|
31
|
+
# Redirect +src_address+:+src_port+ to +dst_address+:+dst_port+
|
32
|
+
def initialize( interface, protocol, src_address, src_port, dst_address, dst_port )
|
31
33
|
@interface = interface
|
32
34
|
@protocol = protocol
|
35
|
+
@src_address = src_address
|
33
36
|
@src_port = src_port
|
34
37
|
@dst_address = dst_address
|
35
38
|
@dst_port = dst_port
|
data/lib/bettercap/logger.rb
CHANGED
@@ -23,18 +23,13 @@ module Logger
|
|
23
23
|
@@thread = nil
|
24
24
|
|
25
25
|
# Initialize the logging system.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
@@debug = debug
|
33
|
-
@@logfile = logfile
|
26
|
+
def init( ctx )
|
27
|
+
@@debug = ctx.options.core.debug
|
28
|
+
@@logfile = ctx.options.core.logfile
|
29
|
+
@@silent = ctx.options.core.silent
|
30
|
+
@@timestamp = ctx.options.core.log_timestamp
|
31
|
+
@@ctx = ctx
|
34
32
|
@@thread = Thread.new { worker }
|
35
|
-
@@silent = silent
|
36
|
-
@@timestamp = with_timestamp
|
37
|
-
@@ctx = Context.get
|
38
33
|
end
|
39
34
|
|
40
35
|
# Log the exception +e+, if this is a beta version, log it as a warning,
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
=begin
|
3
|
+
|
4
|
+
BETTERCAP
|
5
|
+
|
6
|
+
Author : Simone 'evilsocket' Margaritelli
|
7
|
+
Email : evilsocket@gmail.com
|
8
|
+
Blog : http://www.evilsocket.net/
|
9
|
+
|
10
|
+
This project is released under the GPL 3 license.
|
11
|
+
|
12
|
+
=end
|
13
|
+
|
14
|
+
module BetterCap
|
15
|
+
# This class is responsible for garbage collection and memory stats printing.
|
16
|
+
class Memory
|
17
|
+
def initialize
|
18
|
+
GC.enable
|
19
|
+
s = GC.stat
|
20
|
+
@total_allocs = s[:total_allocated_objects]
|
21
|
+
@total_freed = s[:total_freed_objects]
|
22
|
+
end
|
23
|
+
|
24
|
+
def optimize!
|
25
|
+
GC.start
|
26
|
+
begin
|
27
|
+
s = GC.stat
|
28
|
+
new_allocs = s[:total_allocated_objects]
|
29
|
+
new_freed = s[:total_freed_objects]
|
30
|
+
allocs_d = nil
|
31
|
+
freed_d = nil
|
32
|
+
|
33
|
+
if new_allocs < @total_allocs
|
34
|
+
allocs_d = new_allocs.to_s.green
|
35
|
+
elsif new_allocs > @total_allocs
|
36
|
+
allocs_d = new_allocs.to_s.red
|
37
|
+
else
|
38
|
+
allocs_d = new_allocs
|
39
|
+
end
|
40
|
+
|
41
|
+
if new_freed < @total_freed
|
42
|
+
freed_d = new_freed.to_s.red
|
43
|
+
elsif new_freed > @total_freed
|
44
|
+
freed_d = new_freed.to_s.green
|
45
|
+
else
|
46
|
+
freed_d = new_freed
|
47
|
+
end
|
48
|
+
|
49
|
+
Logger.debug "GC: allocd objects: #{allocs_d} freed objects: #{freed_d}"
|
50
|
+
|
51
|
+
@total_allocs = new_allocs
|
52
|
+
@total_freed = new_freed
|
53
|
+
rescue; end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|