module BeEF
module Extension
module Evasion
class Evasion
include Singleton
@@config = BeEF::Core::Configuration.instance
@@enabled = @@config.get('beef.extension.evasion.enable')
def initialize
return unless @@enabled
@techniques ||= load_techniques
if @techniques.empty?
print_error '[Evasion] Initialization failed. No obfuscation techniques specified.'
@@config.set('beef.extension.evasion.enable', false)
return
end
print_debug "[Evasion] Loaded obfuscation chain: #{@techniques.join(', ')}"
end
def load_techniques
techniques = @@config.get('beef.extension.evasion.chain') || []
return [] if techniques.empty?
chain = []
techniques.each do |technique|
unless File.exist?("#{$root_dir}/extensions/evasion/obfuscation/#{technique}.rb")
print_error "[Evasion] Failed to load obfuscation technique '#{technique}' - file does not exist"
next
end
chain << technique
end
chain
rescue StandardError => e
print_error "[Evasion] Failed to load obfuscation technique chain: #{e.message}"
[]
end
def obfuscate(input)
@input = apply_chain(input)
end
def add_bootstrapper
bootstrap = ''
@techniques.each do |technique|
klass = BeEF::Extension::Evasion.const_get(technique.capitalize).instance
if klass.need_bootstrap?
print_debug "[Evasion] Adding bootstrapper for technique: #{technique}"
bootstrap << klass.get_bootstrap
end
end
bootstrap
rescue StandardError => e
print_error "[Evasion] Failed to bootstrap obfuscation technique: #{e.message}"
print_error e.backtrace
end
def apply_chain(input)
output = input
@techniques.each do |technique|
print_debug "[Evasion] Applying technique: #{technique}"
klass = BeEF::Extension::Evasion.const_get(technique.capitalize).instance
output = klass.execute(output, @@config)
end
print_debug "[Evasion] Obfuscation completed (#{output.length} bytes)"
output
rescue StandardError => e
print_error "[Evasion] Failed to apply obfuscation technique: #{e.message}"
print_error e.backtrace
end
end
end
end
end