177 lines
6.0 KiB
Ruby
177 lines
6.0 KiB
Ruby
module Msf
|
|
module Ui
|
|
module Gtk2
|
|
|
|
#
|
|
# Gtk2 Interface for Metasploit Opcodes database
|
|
#
|
|
class MsfOpcode
|
|
|
|
# Create the opcode client instance
|
|
$client = Rex::Exploitation::OpcodeDb::Client.new
|
|
|
|
#
|
|
# Modules Opcodes
|
|
#
|
|
class Modules < Msf::Ui::Gtk2::SkeletonOpcode
|
|
|
|
def initialize
|
|
comment = "information about imports, exports, segments, and specific module attributes "
|
|
|
|
# Array for the face buttons
|
|
buttons = [ Gtk::Stock::OK, Gtk::Dialog::RESPONSE_OK ], [ Gtk::Stock::CLOSE, Gtk::Dialog::RESPONSE_NONE ]
|
|
|
|
# call the parent
|
|
super("Modules", comment, buttons)
|
|
self.default_response = Gtk::Dialog::RESPONSE_OK
|
|
|
|
# Hash to store the global values
|
|
@filter = {}
|
|
|
|
@collect = {}
|
|
@collect_locales = {}
|
|
@collect_platforms = {}
|
|
@collect_modules = Gtk::TextBuffer.new
|
|
|
|
@collect['Exports'] = Gtk::CheckButton.new("Include module export information")
|
|
@collect['Imports'] = Gtk::CheckButton.new("Include module import information")
|
|
@collect['Segments'] = Gtk::CheckButton.new("Include module segment information")
|
|
@collect['Detailed'] = Gtk::CheckButton.new("Display detailed output")
|
|
|
|
stuff.pack_start(@collect['Exports'], false, false, 0)
|
|
stuff.pack_start(@collect['Imports'], false, false, 0)
|
|
stuff.pack_start(@collect['Segments'], false, false, 0)
|
|
stuff.pack_start(@collect['Detailed'], false, false, 0)
|
|
|
|
# For Locales frame
|
|
frame_locale = Gtk::Frame.new
|
|
stuff.pack_start(frame_locale, false, false, 0)
|
|
@table_locale = Gtk::Table.new(3, 2, true)
|
|
frame_locale.add(@table_locale)
|
|
create_locales
|
|
|
|
# For Platforms frame
|
|
frame_platforms = Gtk::Frame.new
|
|
stuff.pack_start(frame_platforms, false, false, 0)
|
|
@table_platforms = Gtk::Table.new(3, 2, true)
|
|
frame_platforms.add(@table_platforms)
|
|
create_platforms
|
|
|
|
# For Modules frame
|
|
frame_modules = Gtk::Frame.new
|
|
stuff.pack_start(frame_modules, false, false, 0)
|
|
@vbox_modules = Gtk::VBox.new(false, 10)
|
|
frame_modules.add(@vbox_modules)
|
|
create_modules(@collect_modules)
|
|
|
|
signal_connect('response') do |dialog, response_id|
|
|
if response_id == Gtk::Dialog::RESPONSE_OK
|
|
collect()
|
|
end
|
|
end
|
|
|
|
show_all and run
|
|
destroy
|
|
end
|
|
|
|
#
|
|
# Display all supported locales
|
|
#
|
|
def create_locales
|
|
@collect_locales['english'] = Gtk::CheckButton.new("English")
|
|
@collect_locales['french'] = Gtk::CheckButton.new("French")
|
|
@collect_locales['italian'] = Gtk::CheckButton.new("Italian")
|
|
@collect_locales['german'] = Gtk::CheckButton.new("German")
|
|
@table_locale.attach_defaults(@collect_locales['english'], 0, 1, 1, 2)
|
|
@table_locale.attach_defaults(@collect_locales['french'], 0, 1, 2, 3)
|
|
@table_locale.attach_defaults(@collect_locales['italian'], 1, 2, 1, 2)
|
|
@table_locale.attach_defaults(@collect_locales['german'], 1, 2, 2, 3)
|
|
end
|
|
|
|
#
|
|
# Display all supported platforms
|
|
#
|
|
def create_platforms
|
|
@collect_platforms['NT'] = Gtk::CheckButton.new("Windows NT")
|
|
@collect_platforms['2000'] = Gtk::CheckButton.new("Windows 2000")
|
|
@collect_platforms['XP'] = Gtk::CheckButton.new("Windows XP")
|
|
@collect_platforms['2003'] = Gtk::CheckButton.new("Windows 2003")
|
|
@table_platforms.attach_defaults(@collect_platforms['NT'], 0, 1, 1, 2)
|
|
@table_platforms.attach_defaults(@collect_platforms['2000'], 0, 1, 2, 3)
|
|
@table_platforms.attach_defaults(@collect_platforms['XP'], 1, 2, 1, 2)
|
|
@table_platforms.attach_defaults(@collect_platforms['2003'], 1, 2, 2, 3)
|
|
end
|
|
|
|
#
|
|
# Display a Gtk::TextView for modules
|
|
#
|
|
def create_modules(buffer)
|
|
label = Gtk::Label.new(" A comma separated list of module names to filter (Ex: kernel32.dll,user32.dll)")
|
|
label.set_alignment(0, 0)
|
|
@vbox_modules.pack_start(label, false, false, 0)
|
|
textview = Gtk::TextView.new(buffer)
|
|
textview.set_size_request(480, 50)
|
|
@vbox_modules.pack_start(textview, true, true, 0)
|
|
end
|
|
|
|
#
|
|
# Collect data
|
|
#
|
|
def collect
|
|
|
|
# For Global option
|
|
@collect.each_pair do |key, value|
|
|
if value.active?
|
|
@filter[key] = true
|
|
end
|
|
end
|
|
|
|
# For locales
|
|
@filter['LocaleNames'] = ""
|
|
@collect_locales.each_pair do |key, value|
|
|
if value.active?
|
|
@filter['LocaleNames'] = @filter['LocaleNames'] + key
|
|
end
|
|
end
|
|
|
|
# For platform
|
|
@filter['PlatformNames'] = ""
|
|
@collect_platforms.each_pair do |key, value|
|
|
if value.active?
|
|
@filter['PlatformNames'] = @filter['PlatformNames'] + key
|
|
end
|
|
end
|
|
|
|
# For module
|
|
@filter['ModuleNames'] = @collect_modules.get_text.split(/,/)
|
|
|
|
# Perform an XML request
|
|
modules = $client.modules(@filter)
|
|
|
|
display($client.last_xml)
|
|
|
|
end
|
|
|
|
#
|
|
# Display the matched modules
|
|
#
|
|
def display(xml)
|
|
|
|
# Load XML
|
|
doc = REXML::Document.new(xml)
|
|
|
|
doc.elements.each("Array/Hash/Entry[@name='name']") do |element|
|
|
puts element.text
|
|
end
|
|
|
|
# puts doc.elements["Array/Hash/Entry[@name='name']"].text
|
|
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|