Skip to content

Commit 2dce6e6

Browse files
author
HD Moore
committed
FIXRM rapid7#7292 by using hex class names
1 parent 6bb1b83 commit 2dce6e6

File tree

1 file changed

+9
-30
lines changed

1 file changed

+9
-30
lines changed

lib/msf/core/modules/loader/base.rb

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def load_module(parent_path, type, module_reference_name, options={})
113113
metasploit_class = nil
114114
module_path = self.module_path(parent_path, type, module_reference_name)
115115

116-
loaded = namespace_module_transaction(module_reference_name, :reload => reload) { |namespace_module|
116+
loaded = namespace_module_transaction(type + "/" + module_reference_name, :reload => reload) { |namespace_module|
117117
# set the parent_path so that the module can be reloaded with #load_module
118118
namespace_module.parent_path = parent_path
119119

@@ -301,7 +301,7 @@ def reload_module(original_metasploit_class_or_instance)
301301
reloaded_module_instance.datastore.update(original_metasploit_instance.datastore)
302302
end
303303
else
304-
elog("Failed to create instance of #{refname} after reload.", 'core')
304+
elog("Failed to create instance of #{original_metasploit_class_or_instance.refname} after reload.", 'core')
305305

306306
# Return the old module instance to avoid an strace trace
307307
return original_metasploit_class_or_instance
@@ -455,8 +455,8 @@ def module_reference_name_from_path(path)
455455
#
456456
# @see MODULE_SEPARATOR
457457
# @see #namespace_module_names
458-
def namespace_module_name(module_reference_name)
459-
namespace_module_names = self.namespace_module_names(module_reference_name)
458+
def namespace_module_name(uniq_module_reference_name)
459+
namespace_module_names = self.namespace_module_names(uniq_module_reference_name)
460460
namespace_module_name = namespace_module_names.join(MODULE_SEPARATOR)
461461

462462
namespace_module_name
@@ -466,40 +466,19 @@ def namespace_module_name(module_reference_name)
466466
# doesn't overwrite other (metasploit) module's classes. Invalid module name characters are escaped by using 'H*'
467467
# unpacking and prefixing each code with X so the code remains a valid module name when it starts with a digit.
468468
#
469-
# @param [String] module_reference_name The canonical name for the module.
469+
# @param [String] uniq_module_reference_name The unique canonical name for the module including type.
470470
# @return [Array<String>] {NAMESPACE_MODULE_NAMES} + <derived-constant-safe names>
471471
#
472472
# @see namespace_module
473-
def namespace_module_names(module_reference_name)
474-
relative_module_name = module_reference_name.camelize
475-
476-
module_names = relative_module_name.split(MODULE_SEPARATOR)
477-
478-
# The module_reference_name is path-like, so it can include characters that are invalid in module names
479-
valid_module_names = module_names.collect { |module_name|
480-
valid_module_name = module_name.gsub(/^[0-9]|[^A-Za-z0-9]/) { |invalid_constant_name_character|
481-
unpacked = invalid_constant_name_character.unpack('H*')
482-
# unpack always returns an array, so get first value to get character's encoding
483-
hex_code = unpacked[0]
484-
485-
# as a convention start each hex-code with X so that it'll make a valid constant name since constants can't
486-
# start with digits.
487-
"X#{hex_code}"
488-
}
489-
490-
valid_module_name
491-
}
492-
493-
namespace_module_names = NAMESPACE_MODULE_NAMES + valid_module_names
494-
495-
namespace_module_names
473+
def namespace_module_names(uniq_module_reference_name)
474+
NAMESPACE_MODULE_NAMES + [ "Mod" + uniq_module_reference_name.unpack("H*").first.downcase ]
496475
end
497476

498-
def namespace_module_transaction(module_reference_name, options={}, &block)
477+
def namespace_module_transaction(uniq_module_reference_name, options={}, &block)
499478
options.assert_valid_keys(:reload)
500479

501480
reload = options[:reload] || false
502-
namespace_module_names = self.namespace_module_names(module_reference_name)
481+
namespace_module_names = self.namespace_module_names(uniq_module_reference_name)
503482

504483
previous_namespace_module = current_module(namespace_module_names)
505484

0 commit comments

Comments
 (0)