Metasploit mailing list archives
[PATCH] speedup
From: john-metasploit at ofjj.net (Yoann Guillot)
Date: Thu, 25 Jun 2009 19:42:56 +0200
Hi
This is a patch that speeds up Msf::Simple::Framework.create by a factor 2 on
my machine. I'm not quite sure this is 100% correct, but it seem to be, as far
as I understand the framework.
The _intersect_expand method is particularly weird, but I think i preserved the
semantics.
Also PlatformList#& had a strange behavior in the beginning (with the 'all?' tests),
I think my version is correct (anyway there don't seem to be a module whose
PlatformList#all? is true).
--
Yoann Guillot
diff -r b71036428911 lib/msf/core/module/platform.rb
--- a/lib/msf/core/module/platform.rb Wed Jun 24 22:02:29 2009 +0200
+++ b/lib/msf/core/module/platform.rb Thu Jun 25 19:15:41 2009 +0200
@@ -67,13 +67,13 @@
# Finds all inherited children from a given module.
#
def self.find_children
- constants.map { |c|
- const_get(c)
- }.delete_if { |m|
- !m.kind_of?(Class) || ! (m < self)
- }.sort { |a, b|
- a::Rank <=> b::Rank
- }
+ @subclasses ||= []
+ @subclasses.sort_by { |a| a::Rank }
+ end
+
+ def self.inherited(subclass)
+ @subclasses ||= []
+ @subclasses << subclass
end
#
@@ -431,4 +431,4 @@
Rank = 100
Alias = "php"
end
-end
\ No newline at end of file
+end
diff -r b71036428911 lib/msf/core/module/platform_list.rb
--- a/lib/msf/core/module/platform_list.rb Wed Jun 24 22:02:29 2009 +0200
+++ b/lib/msf/core/module/platform_list.rb Thu Jun 25 19:15:41 2009 +0200
@@ -83,10 +83,7 @@
# Symbolic check to see if this platform list represents 'all' platforms.
#
def all?
- names.each do |name|
- return true if name == ''
- end
- return false
+ names.include? ''
end
#
@@ -119,39 +116,30 @@
# used for say, building a payload from a stage and stager
#
def &(plist)
+ # If either list has all in it, return the other one
+ if plist.all?
+ return self
+ elsif self.all?
+ return plist
+ end
+
list1 = plist.platforms
list2 = platforms
- total = [ ]
-
- # If either list has all in it, just merge the two
- if (plist.all? or all?)
- return list1.dup.concat(list2)
- end
-
- #
- # um, yeah, expand the lowest depth (like highest superset)
- # each time and then do another intersection, keep doing
- # this until no one has any children anymore...
- #
+ total = []
loop do
# find any intersections
inter = list1 & list2
# remove them from the two sides
- list1 = list1 - inter
- list2 = list2 - inter
+ list1 -= inter
+ list2 -= inter
# add them to the total
total += inter
- if list1.empty? || list2.empty?
- break
- end
+ break if list1.empty? || list2.empty?
- begin
- list1, list2 = _intersect_expand(list1, list2)
- rescue ::RuntimeError
- break
- end
+ # try to expand to subclasses to refine the match
+ break if ! _intersect_expand(list1, list2)
end
return Msf::Module::PlatformList.new(*total)
@@ -165,21 +153,28 @@
# been intersected with each other..
#
def _intersect_expand(list1, list2)
- (list1 + list2).sort { |a, b|
- a.name.split('::').length <=> b.name.split('::').length }.
- each { |m|
- children = m.find_children
- if !children.empty?
- if list1.include?(m)
- return [ list1 - [ m ] + children, list2 ]
- else
- return [ list1, list2 - [ m ] + children ]
- end
- end
+ # abort if no shared prefix is found between l1 and l2
+ # shortcircuits [Windows] & [Linux] without going
+ # through XP => SP2 => DE
+ ln1 = list1.map { |c| c.name }
+ ln2 = list2.map { |c| c.name }
+ return if not ln1.find { |n1|
+ ln2.find { |n2| n1[0, n2.length] == n2[0, n1.length] }
}
- # XXX what's a better exception to throw here?
- raise RuntimeError, "No more expansion possible", caller
+ (list1 + list2).sort { |a, b|
+ # find the superest class in both lists
+ a.name.count(':') <=> b.name.count(':')
+ }.find { |m|
+ # which has children
+ children = m.find_children
+ next if children.empty?
+ # replace this class in its list by its children
+ l = list1.include?(m) ? list1 : list2
+ l.delete m
+ l.concat children
+ true
+ }
end
end
Current thread:
- [PATCH] speedup Yoann Guillot (Jun 25)
- [PATCH] speedup HD Moore (Jun 25)
- [PATCH] speedup Yoann Guillot (Jun 25)
- [PATCH] speedup HD Moore (Jun 25)
