class Rex::Java::Serialization::Model::Stream

This class provides a Java Stream representation

Attributes

contents[RW]

@!attribute contents

@return [Array] The stream contents
magic[RW]

@!attribute magic

@return [Fixnum] The stream signature
references[RW]

@!attribute references

@return [Array] The stream objects to be referenced through handles
version[RW]

@!attribute version

@return [Fixnum] The stream version

Public Class Methods

new(stream = nil) click to toggle source
# File lib/rex/java/serialization/model/stream.rb, line 24
def initialize(stream = nil)
  super(nil)
  self.magic = STREAM_MAGIC
  self.version = STREAM_VERSION
  self.contents = []
  self.references = []
end

Public Instance Methods

add_reference(ref) click to toggle source

Adds an element to the references array

@param ref [Rex::Java::Serialization::Model::Element] the object to save as reference dst

# File lib/rex/java/serialization/model/stream.rb, line 66
def add_reference(ref)
  self.references.push(ref)
end
decode(io) click to toggle source

Deserializes a Rex::Java::Serialization::Model::Stream

@param io [IO] the io to read from @return [self] if deserialization succeeds @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed

# File lib/rex/java/serialization/model/stream.rb, line 37
def decode(io)
  self.magic = decode_magic(io)
  self.version = decode_version(io)

  until io.eof?
    content = decode_content(io, self)
    self.contents << content
  end

  self
end
encode() click to toggle source

Serializes the Rex::Java::Serialization::Model::Stream

@return [String] if serialization succeeds @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed

# File lib/rex/java/serialization/model/stream.rb, line 53
def encode
  encoded = ''
  encoded << [magic].pack('n')
  encoded << [version].pack('n')
  contents.each do |content|
    encoded << encode_content(content)
  end
  encoded
end
to_s() click to toggle source

Creates a print-friendly string representation

@return [String]

# File lib/rex/java/serialization/model/stream.rb, line 73
def to_s
  str = "@magic: 0x#{magic.to_s(16)}\n"
  str << "@version: #{version}\n"
  str << "@contents: [\n"
  contents.each do |content|
    str << "  #{print_content(content)}\n"
  end
  str << "]\n"
  str << "@references: [\n"
  references.each do |ref|
      str << "  [#{(references.index(ref) + BASE_WIRE_HANDLE).to_s(16)}] #{print_content(ref)}\n"
  end
  str << "]\n"
end

Private Instance Methods

decode_magic(io) click to toggle source

Deserializes the magic stream value

@param io [IO] the io to read from @return [String] if deserialization succeeds @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed

# File lib/rex/java/serialization/model/stream.rb, line 95
def decode_magic(io)
  magic = io.read(2)

  unless magic && magic.length == 2 && magic.unpack('n')[0] == STREAM_MAGIC
    raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize Stream'
  end

  STREAM_MAGIC
end
decode_version(io) click to toggle source

Deserializes the version stream

@param io [IO] the io to read from @return [Fixnum] if deserialization succeeds @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed

# File lib/rex/java/serialization/model/stream.rb, line 110
def decode_version(io)
  version = io.read(2)
  unless version && version.unpack('n')[0] == STREAM_VERSION
    raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize Stream'
  end

  STREAM_VERSION
end