Added API BeEF::Module.get_options() override. Added API.matched?() method to determine if a conditional API register is met. API methods can now return data to the core

git-svn-id: https://beef.googlecode.com/svn/trunk@1248 b87d56ec-f9c0-11de-8c8a-61c5e9addfc9
This commit is contained in:
passbe
2011-09-01 06:45:49 +00:00
parent f228138fb2
commit 7186b75aad
3 changed files with 35 additions and 5 deletions

View File

@@ -59,6 +59,16 @@ module API
return false
end
# match is used to determine if a fire() method should continue, matchs a registered API hook without the owner
def matched?(c, method, params = [])
@registry.each{|r|
if r['class'] == c and r['method'] == method and params == r['params']
return true
end
}
return false
end
# unregister API call from owner, class and method
def unregister(id)
@registry.delete_if{|r|
@@ -72,7 +82,7 @@ module API
@registry.each{|r|
if r['class'] == c and r['method'] == method
if r['params'].length == 0 or r['params'] == params
owners << r['owner']
owners << { :owner => r['owner'], :id => r['id']}
end
end
}
@@ -95,13 +105,17 @@ module API
def fire(c, m, *args)
mods = self.get_owners(c, m, args)
if mods.length > 0
data = []
if self.verify_api_path(c, m) and c.ancestors[0].to_s > "BeEF::API"
method = self.get_api_path(c, m)
mods.each do |mod|
begin
#Only used for API Development
#print_info "API: #{mod} fired #{method}"
mod.send method, *args
result = mod[:owner].method(method).call(*args)
if not result == nil
data << {:api_id => mod[:id], :data => result}
end
rescue Exception => e
print_error "API Fire Error: #{e.message} in #{mod.to_s}.#{method.to_s}()"
end
@@ -109,7 +123,9 @@ module API
else
print_error "API Path not defined for Class: "+c.to_s+" Method: "+m.to_s
end
return data
end
return nil
end
end

View File

@@ -25,7 +25,8 @@ module API
'pre_soft_load' => :pre_soft_load,
'post_soft_load' => :post_soft_load,
'pre_hard_load' => :pre_hard_load,
'post_hard_load' => :post_hard_load
'post_hard_load' => :post_hard_load,
'get_options' => :get_options
}
def pre_soft_load(mod); end
@@ -36,6 +37,8 @@ module API
def post_hard_load(mod); end
def get_options; end
end
end

View File

@@ -38,14 +38,25 @@ module Module
# Gets all module options
def self.get_options(mod)
if BeEF::API::Registra.instance.matched?(BeEF::API::Module, 'get_options', [mod])
options = BeEF::API::Registra.instance.fire(BeEF::API::Module, 'get_options', mod)
mo = []
options.each{|o|
if o[:data].kind_of?(Array)
mo += o[:data]
else
print_debug "API Warning: return result for BeEF::Module.get_options() was not an array."
end
}
return mo
end
if self.check_hard_load(mod)
class_name = BeEF::Core::Configuration.instance.get("beef.module.#{mod}.class")
class_symbol = BeEF::Core::Command.const_get(class_name)
if class_symbol and class_symbol.respond_to?(:options)
return class_symbol.options
else
#makes too much noise as many modules dont have options defined
#print_debug "Module '#{mod}', no options method defined"
print_debug "Module '#{mod}', no options method defined"
end
end
return []