Files
metasploit-gs/lib/rex/java/serialization/model/stream.rb
T

123 lines
3.9 KiB
Ruby
Raw Normal View History

2014-12-10 09:52:23 -06:00
# -*- coding: binary -*-
2014-12-03 17:59:00 -06:00
module Rex
module Java
module Serialization
module Model
# This class provides a Java Stream representation
2014-12-03 17:59:00 -06:00
class Stream < Element
2014-12-04 18:28:25 -06:00
include Rex::Java::Serialization::Model::Contents
2014-12-03 17:59:00 -06:00
# @!attribute magic
2014-12-03 19:31:46 -06:00
# @return [Fixnum] The stream signature
2014-12-03 17:59:00 -06:00
attr_accessor :magic
# @!attribute version
# @return [Fixnum] The stream version
2014-12-03 17:59:00 -06:00
attr_accessor :version
# @!attribute contents
2014-12-05 20:11:45 -06:00
# @return [Array] The stream contents
2014-12-03 17:59:00 -06:00
attr_accessor :contents
2014-12-05 20:11:45 -06:00
# @!attribute references
# @return [Array] The stream objects to be referenced through handles
2014-12-05 17:35:38 -06:00
attr_accessor :references
2014-12-03 17:59:00 -06:00
2014-12-05 16:52:59 -06:00
def initialize(stream = nil)
2014-12-05 20:11:45 -06:00
super(nil)
2014-12-03 17:59:00 -06:00
self.magic = STREAM_MAGIC
self.version = STREAM_VERSION
self.contents = []
2014-12-05 17:35:38 -06:00
self.references = []
end
2014-12-09 19:37:42 -06:00
# Deserializes a Rex::Java::Serialization::Model::Stream
2014-12-03 17:59:00 -06:00
#
# @param io [IO] the io to read from
# @return [self] if deserialization succeeds
2015-04-05 18:43:03 -05:00
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
2014-12-03 17:59:00 -06:00
def decode(io)
self.magic = decode_magic(io)
2014-12-03 19:31:46 -06:00
self.version = decode_version(io)
2014-12-03 17:59:00 -06:00
2014-12-05 12:42:27 -06:00
until io.eof?
2014-12-05 17:14:37 -06:00
content = decode_content(io, self)
2014-12-05 12:42:27 -06:00
self.contents << content
end
2014-12-03 17:59:00 -06:00
self
end
2014-12-09 19:37:42 -06:00
# Serializes the Rex::Java::Serialization::Model::Stream
2014-12-03 17:59:00 -06:00
#
# @return [String] if serialization succeeds
2015-04-05 18:43:03 -05:00
# @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
2014-12-03 17:59:00 -06:00
def encode
encoded = ''
2014-12-03 19:31:46 -06:00
encoded << [magic].pack('n')
2014-12-03 17:59:00 -06:00
encoded << [version].pack('n')
contents.each do |content|
encoded << encode_content(content)
2014-12-03 17:59:00 -06:00
end
encoded
end
2014-12-05 20:11:45 -06:00
# Adds an element to the references array
#
2015-04-03 14:01:31 -05:00
# @param ref [Rex::Java::Serialization::Model::Element] the object to save as reference dst
2014-12-05 20:11:45 -06:00
def add_reference(ref)
self.references.push(ref)
end
2014-12-07 17:52:09 -06:00
# Creates a print-friendly string representation
#
# @return [String]
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
2014-12-03 17:59:00 -06:00
private
# Deserializes the magic stream value
#
# @param io [IO] the io to read from
# @return [String] if deserialization succeeds
2015-04-05 18:43:03 -05:00
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
2014-12-03 17:59:00 -06:00
def decode_magic(io)
magic = io.read(2)
2014-12-03 19:31:46 -06:00
unless magic && magic.length == 2 && magic.unpack('n')[0] == STREAM_MAGIC
2015-04-05 18:43:03 -05:00
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize Stream'
2014-12-03 17:59:00 -06:00
end
2014-12-03 19:31:46 -06:00
STREAM_MAGIC
2014-12-03 17:59:00 -06:00
end
# Deserializes the version stream
#
# @param io [IO] the io to read from
# @return [Fixnum] if deserialization succeeds
2015-04-05 18:43:03 -05:00
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
2014-12-03 17:59:00 -06:00
def decode_version(io)
version = io.read(2)
unless version && version.unpack('n')[0] == STREAM_VERSION
2015-04-05 18:43:03 -05:00
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize Stream'
2014-12-03 17:59:00 -06:00
end
2014-12-03 19:31:46 -06:00
STREAM_VERSION
2014-12-03 17:59:00 -06:00
end
end
end
end
end
end