class Rex::Post::Meterpreter::GroupTlv

Group TLVs contain zero or more TLVs

Attributes

tlvs[RW]

Public Class Methods

new(type) click to toggle source

Initializes the group TLV container to the supplied type and creates an empty TLV array.

Calls superclass method Rex::Post::Meterpreter::Tlv::new
# File lib/rex/post/meterpreter/packet.rb, line 396
def initialize(type)
  super(type)

  self.tlvs = [ ]
end

Public Instance Methods

add_tlv(type, value = nil, replace = false, compress=false) click to toggle source

Adds a TLV of a given type and value.

# File lib/rex/post/meterpreter/packet.rb, line 464
def add_tlv(type, value = nil, replace = false, compress=false)

  # If we should replace any TLVs with the same type...remove them first
  if (replace)
    each(type) { |tlv|
      if (tlv.type == type)
        self.tlvs.delete(tlv)
      end
    }
  end

  if (type & TLV_META_TYPE_GROUP == TLV_META_TYPE_GROUP)
    tlv = GroupTlv.new(type)
  else
    tlv = Tlv.new(type, value, compress)
  end

  self.tlvs << tlv

  return tlv
end
add_tlvs(tlvs) click to toggle source

Adds zero or more TLVs to the packet.

# File lib/rex/post/meterpreter/packet.rb, line 489
def add_tlvs(tlvs)
  if (tlvs != nil)
    tlvs.each { |tlv|
      add_tlv(tlv['type'], tlv['value'])
    }
  end
end
each(type = TLV_TYPE_ANY, &block) click to toggle source

Enumerates TLVs of the supplied type.

# File lib/rex/post/meterpreter/packet.rb, line 411
def each(type = TLV_TYPE_ANY, &block)
  get_tlvs(type).each(&block)
end
each_tlv(type = TLV_TYPE_ANY, &block) click to toggle source

Synonym for each.

# File lib/rex/post/meterpreter/packet.rb, line 418
def each_tlv(type = TLV_TYPE_ANY, &block)
  each(type, &block)
end
each_tlv_with_index(type = TLV_TYPE_ANY, &block) click to toggle source

Synonym for each_with_index.

# File lib/rex/post/meterpreter/packet.rb, line 432
def each_tlv_with_index(type = TLV_TYPE_ANY, &block)
  each_with_index(type, block)
end
each_with_index(type = TLV_TYPE_ANY, &block) click to toggle source

Enumerates TLVs of a supplied type with indexes.

# File lib/rex/post/meterpreter/packet.rb, line 425
def each_with_index(type = TLV_TYPE_ANY, &block)
  get_tlvs(type).each_with_index(&block)
end
from_r(raw) click to toggle source

Converts the TLV group container from raw to all of the individual TLVs.

# File lib/rex/post/meterpreter/packet.rb, line 564
def from_r(raw)
  offset = 8

  # Reset the TLVs array
  self.tlvs = []
  self.type = raw.unpack("NN")[1]

  # Enumerate all of the TLVs
  while (offset < raw.length-1)

    tlv = nil

    # Get the length and type
    length, type = raw[offset..offset+8].unpack("NN")

    if (type & TLV_META_TYPE_GROUP == TLV_META_TYPE_GROUP)
      tlv = GroupTlv.new(type)
    else
      tlv = Tlv.new(type)
    end

    tlv.from_r(raw[offset..offset+length])

    # Insert it into the list of TLVs
    tlvs << tlv

    # Move up
    offset += length
  end
end
get_tlv(type, index = 0) click to toggle source

Gets the first TLV of a given type.

# File lib/rex/post/meterpreter/packet.rb, line 500
def get_tlv(type, index = 0)
  type_tlvs = get_tlvs(type)

  if (type_tlvs.length > index)
    return type_tlvs[index]
  end

  return nil
end
get_tlv_value(type, index = 0) click to toggle source

Returns the value of a TLV if it exists, otherwise nil.

# File lib/rex/post/meterpreter/packet.rb, line 513
def get_tlv_value(type, index = 0)
  tlv = get_tlv(type, index)

  return (tlv != nil) ? tlv.value : nil
end
get_tlv_values(type) click to toggle source

Returns an array of values for all tlvs of type type.

# File lib/rex/post/meterpreter/packet.rb, line 522
def get_tlv_values(type)
  get_tlvs(type).collect { |a| a.value }
end
get_tlvs(type) click to toggle source

Returns an array of TLVs for the given type.

# File lib/rex/post/meterpreter/packet.rb, line 439
def get_tlvs(type)
  if (type == TLV_TYPE_ANY)
    return self.tlvs
  else
    type_tlvs = []

    self.tlvs.each() { |tlv|
      if (tlv.type?(type))
        type_tlvs << tlv
      end
    }

    return type_tlvs
  end
end
has_tlv?(type) click to toggle source

Checks to see if the container has a TLV of a given type.

# File lib/rex/post/meterpreter/packet.rb, line 529
def has_tlv?(type)
  return get_tlv(type) != nil
end
reset() click to toggle source

Zeros out the array of TLVs.

# File lib/rex/post/meterpreter/packet.rb, line 536
def reset
  self.tlvs = []
end
to_r() click to toggle source

Converts all of the TLVs in the TLV array to raw and prefixes them with a container TLV of this instance's TLV type.

# File lib/rex/post/meterpreter/packet.rb, line 550
def to_r
  raw = ''

  self.each() { |tlv|
    raw << tlv.to_r
  }

  return [raw.length + 8, self.type].pack("NN") + raw
end