123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- module Msf
- class Plugin::ThreadTest < Msf::Plugin
- class ConsoleCommandDispatcher
- include Msf::Ui::Console::CommandDispatcher
- def name
- 'ThreadTest'
- end
- def commands
- {
- 'start_thread' => 'Start a background thread that writes to the console',
- 'stop_thread' => 'Stop a background thread',
- 'list_thread' => 'List running threads'
- }
- end
- def cmd_start_thread(*_args)
- if @mythread
- print_line('Test thread is already running')
- return
- end
- @mythread = ::Thread.new do
- loop do
- print_line('--- test thread ---')
- select(nil, nil, nil, 5)
- end
- end
- print_line('Test thread created')
- end
- def cmd_stop_thread(*_args)
- if !@mythread
- print_line('No test thread is running')
- return
- end
- @mythread.kill
- @mythread = nil
- print_line('Test thread stopped')
- end
- def cmd_list_thread(*_args)
- Thread.list.each do |t|
- print_line(format('Thread: 0x%.8x (%s/%d) (%s)', t.object_id, t.status, t.priority, t.tsource))
- print_line('')
- end
- end
- end
- #
- # The constructor is called when an instance of the plugin is created. The
- # framework instance that the plugin is being associated with is passed in
- # the framework parameter. Plugins should call the parent constructor when
- # inheriting from Msf::Plugin to ensure that the framework attribute on
- # their instance gets set.
- #
- def initialize(framework, opts)
- super
- # If this plugin is being loaded in the context of a console application
- # that uses the framework's console user interface driver, register
- # console dispatcher commands.
- add_console_dispatcher(ConsoleCommandDispatcher)
- # Extend the thread to track the calling source
- Thread.class_eval("
- attr_accessor :tsource
- alias initialize_old initialize
- def initialize(&block)
- self.tsource = caller(1)
- initialize_old(&block)
- end
- ", __FILE__, __LINE__ - 9)
- print_status('ThreadTest plugin loaded.')
- end
- #
- # The cleanup routine for plugins gives them a chance to undo any actions
- # they may have done to the framework. For instance, if a console
- # dispatcher was added, then it should be removed in the cleanup routine.
- #
- def cleanup
- # If we had previously registered a console dispatcher with the console,
- # deregister it now.
- remove_console_dispatcher('ThreadTest')
- end
- #
- # This method returns a short, friendly name for the plugin.
- #
- def name
- 'threadtest'
- end
- #
- # This method returns a brief description of the plugin. It should be no
- # more than 60 characters, but there are no hard limits.
- #
- def desc
- 'Internal test tool for testing thread usage in Metasploit'
- end
- end
- end
|