class WinRM::PSRP::MessageDefragmenter
PowerShell Remoting Protocol message fragmenter.
Public Class Methods
new()
click to toggle source
# File lib/winrm/psrp/message_defragmenter.rb, line 22 def initialize @messages = {} end
Public Instance Methods
defragment(base64_bytes)
click to toggle source
# File lib/winrm/psrp/message_defragmenter.rb, line 26 def defragment(base64_bytes) fragment = fragment_from(Base64.decode64(base64_bytes)) @messages[fragment.object_id] ||= [] @messages[fragment.object_id].push fragment # rubocop:disable Style/GuardClause if fragment.end_fragment blob = [] @messages.delete(fragment.object_id).each { |frag| blob += frag.blob } return message_from(blob.pack('C*')) end # rubocop:enable Style/GuardClause end
fragment_from(byte_string)
click to toggle source
# File lib/winrm/psrp/message_defragmenter.rb, line 41 def fragment_from(byte_string) Fragment.new( byte_string[0..7].reverse.unpack('Q')[0], byte_string[21..-1].bytes, byte_string[8..15].reverse.unpack('Q')[0], byte_string[16].unpack('C')[0][0] == 1, byte_string[16].unpack('C')[0][1] == 1 ) end
message_from(byte_string)
click to toggle source
# File lib/winrm/psrp/message_defragmenter.rb, line 51 def message_from(byte_string) Message.new( '00000000-0000-0000-0000-000000000000', byte_string[4..7].unpack('V')[0], byte_string[40..-1], '00000000-0000-0000-0000-000000000000', byte_string[0..3].unpack('V')[0] ) end