Sha256: 0921c71136f9813190e1eef84d3d3dc861b3ee5305c56a6aa160257f91ba0452

Contents?: true

Size: 1.59 KB

Versions: 2

Compression:

Stored size: 1.59 KB

Contents

#!/usr/bin/env ruby
# -*- coding: binary -*-

require 'rex/io/stream_abstraction'
require 'rex/post/meterpreter/channel'

module Rex
module Post
module Meterpreter

###
#
# Stream
# ------
#
# This class represents a channel that is streaming.  This means
# that sequential data is flowing in either one or both directions.
#
###
class Stream < Rex::Post::Meterpreter::Channel

	include Rex::IO::StreamAbstraction

	class << self
		def cls
			return CHANNEL_CLASS_STREAM
		end
	end

	##
	#
	# Constructor
	#
	##

	#
	# Passes the initialization information up to the base class
	#
	def initialize(client, cid, type, flags)
		# sf: initialize_abstraction() before super() as we can get a scenario where dio_write_handler() is called
		# with data to write to the rsock but rsock has not yet been initialized. This happens if the channel
		# is registered (client.add_channel(self) in Channel.initialize) to a session and a 'core_channel_write'
		# request comes in before we have called self.initialize_abstraction()
		initialize_abstraction
		super(client, cid, type, flags)
	end

	##
	#
	# Remote I/O handlers
	#
	##

	#
	# Performs a write operation on the right side of the local stream.
	#
	def dio_write_handler(packet, data)
		rv = Rex::ThreadSafe.select(nil, [rsock], nil, 0.01)
		if(rv)
			rsock.write(data)
			return true
		else
			return false
		end
	end

	#
	# Performs a close operation on the right side of the local stream.
	#
	def dio_close_handler(packet)
		rsock.close

		return super(packet)
	end

	#
	# Cleans up the stream abstraction.
	#
	def cleanup
		super

		cleanup_abstraction
	end

end

end; end; end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
librex-0.0.68 lib/rex/post/meterpreter/channels/stream.rb
librex-0.0.66 lib/rex/post/meterpreter/channels/stream.rb