class Rex::Java::Serialization::Builder

This class provides a builder to help in the construction of Java serialized contents.

Public Instance Methods

new_array(opts = {}) click to toggle source

Creates a Rex::Java::Serialization::Model::NewArray

@param opts [Hash{Symbol => <Rex::Java::Serialization::Model::NewClassDesc, String, Array>}] @option opts [Rex::Java::Serialization::Model::NewClassDesc] :description @option opts [String] :values_type @option opts [Array] :values @return [Rex::Java::Serialization::Model::NewArray] @see new_class

# File lib/rex/java/serialization/builder.rb, line 17
def new_array(opts = {})
  class_desc = opts[:description] || new_class(opts)
  type = opts[:values_type] || ''
  values = opts[:values] || []

  array = Rex::Java::Serialization::Model::NewArray.new
  array.array_description = Rex::Java::Serialization::Model::ClassDesc.new
  array.array_description.description = class_desc
  array.type = type
  array.values = values

  array
end
new_class(opts = {}) click to toggle source

Creates a Rex::Java::Serialization::Model::NewClassDesc

@param opts [Hash{Symbol => <Rex::Java::Serialization::Model::NewClassDesc, Array>}] @option opts [String] :name @option opts [Fixnum] :serial @option opts [Fixnum] :flags @option opts [Array] :fields @option opts [Array] :annotations @option opts [Rex::Java::Serialization::Model::Element] :super_class @return [Rex::Java::Serialization::Model::NewClassDesc]

# File lib/rex/java/serialization/builder.rb, line 60
def new_class(opts = {})
  class_name = opts[:name] || ''
  serial_version = opts[:serial] || 0
  flags = opts[:flags] || 2
  fields = opts[:fields] || []
  annotations = opts[:annotations] || [Rex::Java::Serialization::Model::NullReference.new,
                                       Rex::Java::Serialization::Model::EndBlockData.new]
  super_class = opts[:super_class] || Rex::Java::Serialization::Model::NullReference.new

  class_desc = Rex::Java::Serialization::Model::NewClassDesc.new
  class_desc.class_name = Rex::Java::Serialization::Model::Utf.new(nil, class_name)
  class_desc.serial_version = serial_version
  class_desc.flags = flags
  class_desc.fields = []

  fields.each do |f|
    field = Rex::Java::Serialization::Model::Field.new
    field.type = f[0]
    field.name = Rex::Java::Serialization::Model::Utf.new(nil, f[1])
    field.field_type = Rex::Java::Serialization::Model::Utf.new(nil, f[2]) if f[2]
    class_desc.fields << field
  end

  class_desc.class_annotation = Rex::Java::Serialization::Model::Annotation.new
  class_desc.class_annotation.contents = annotations
  class_desc.super_class = Rex::Java::Serialization::Model::ClassDesc.new
  class_desc.super_class.description = super_class

  class_desc
end
new_object(opts = {}) click to toggle source

Creates a Rex::Java::Serialization::Model::NewObject

@param opts [Hash{Symbol => <Rex::Java::Serialization::Model::NewClassDesc, Array>}] @option opts [Rex::Java::Serialization::Model::NewClassDesc] :description @option opts [Array] :data @return [Rex::Java::Serialization::Model::NewObject] @see new_class

# File lib/rex/java/serialization/builder.rb, line 38
def new_object(opts = {})
  class_desc = opts[:description] || new_class(opts)
  data = opts[:data] || []

  object = Rex::Java::Serialization::Model::NewObject.new
  object.class_desc = Rex::Java::Serialization::Model::ClassDesc.new
  object.class_desc.description = class_desc
  object.class_data = data

  object
end