class Rex::Post::Meterpreter::GroupTlv
Group TLVs contain zero or more TLVs
Attributes
Public Class Methods
Initializes the group TLV container to the supplied type and creates an empty TLV array.
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
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
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
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
Synonym for each.
# File lib/rex/post/meterpreter/packet.rb, line 418 def each_tlv(type = TLV_TYPE_ANY, &block) each(type, &block) end
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
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
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
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
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
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
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
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
Zeros out the array of TLVs.
# File lib/rex/post/meterpreter/packet.rb, line 536 def reset self.tlvs = [] end
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