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 364 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 432 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 457 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 379 def each(type = TLV_TYPE_ANY, &block) get_tlvs(type).each(&block) end
Synonym for each.
# File lib/rex/post/meterpreter/packet.rb, line 386 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 400 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 393 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 532 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 468 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 481 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 490 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 407 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 497 def has_tlv?(type) return get_tlv(type) != nil end
Zeros out the array of TLVs.
# File lib/rex/post/meterpreter/packet.rb, line 504 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 518 def to_r raw = '' self.each() { |tlv| raw << tlv.to_r } return [raw.length + 8, self.type].pack("NN") + raw end