class TurboRex::Windows::ALPC::PortMessage

Constants

CallbackId
DataLength
MessageId
TotalLength
Type
UniqueProcess
UniqueThread

Attributes

attributes[RW]
buf_size[R]
callback_id[R]
client_id[R]
client_view_size[R]
data_info_offset[R]
data_length[RW]
do_not_use_this_field[R]
header[R]
header_size[R]
length[R]

header data member

message[R]
message_id[R]
message_size[R]
payload[R]
payload_size[R]
total_length[RW]
type[R]
zero_init[R]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/turborex/windows/alpc.rb, line 424
def initialize(opts = {})
  raw_message = opts[:raw_message]
  payload = opts[:payload]
  @payload = payload
  @attributes = MessageAttribute.new.struct

  if raw_message
    perform_raw_message raw_message
  elsif payload
    port_message = opts[:port_message]
    @header = (port_message ||= APIProxy.alloc_c_struct('PORT_MESSAGE'))
    set_header
    #@message_size = @header_size = port_message.sizeof
    if payload.is_a? String
      pure_set_msg payload, payload.bytesize
    elsif payload.is_a? ::Metasm::C::AllocCStruct
      pure_set_msg payload.str, payload.sizeof
    else
      raise TurboRex::Exception::ALPC::UnknownPayloadType
    end
  elsif opts[:alloc_size]
    @header = APIProxy.alloc_c_struct('PORT_MESSAGE')
    set_header

    @payload = 0.chr * opts[:alloc_size].to_i
    pure_set_msg @payload, @payload.bytesize
  end
end

Public Instance Methods

callback_id=(callback_id) click to toggle source
# File lib/turborex/windows/alpc.rb, line 527
def callback_id=(callback_id)
  @callback_id = @header.CallbackId = callback_id
  @message[0, @header_size] = @header.str
end
client_id=(client_id) click to toggle source
# File lib/turborex/windows/alpc.rb, line 512
def client_id=(client_id)
  if client_id.is_a? ClientID
    @client_id = client_id
  elsif client_id.is_a? ::Metasm::C::AllocCStruct
    @client_id = @do_not_use_this_field = ClientID.new(client_id.UniqueProcess, client_id.UniqueThread)
  else
    @client_id = @do_not_use_this_field = ClientID.new(client_id[0], client_id[1])
  end

  @header.ClientId.UniqueProcess = @client_id.unique_process
  @header.ClientId.UniqueThread = @client_id.unique_thread

  @message[0, @header_size] = @header.str
end
get_total_and_data_len() click to toggle source
# File lib/turborex/windows/alpc.rb, line 477
def get_total_and_data_len
  [@header.u1.s1.TotalLength, @header.u1.s1.DataLength]
end
header=(header) click to toggle source
# File lib/turborex/windows/alpc.rb, line 481
def header=(header)
  @header = header

  set_header
  set_data_length(@payload_size)
  pure_set_msg @payload, @payload_size
end
message_id=(id) click to toggle source
# File lib/turborex/windows/alpc.rb, line 507
def message_id=(id)
  @message_id = @header.MessageId = id
  @message[0, @header_size] = @header.str
end
payload=(payload) click to toggle source
# File lib/turborex/windows/alpc.rb, line 453
def payload=(payload)
  @payload = payload
  if payload.is_a? String
    @payload_size = payload.bytesize
  elsif payload.is_a? ::Metasm::C::AllocCStruct
    @payload_size = payload.sizeof
  end

  if @payload_size > @buf_size
    pure_set_msg payload, @payload_size
  else
    @message[@header_size, @payload_size] = payload
    set_data_length @payload_size
  end
end
refresh_message() click to toggle source
# File lib/turborex/windows/alpc.rb, line 532
def refresh_message
  return unless @message
  perform_raw_message @message
end
set_data_length(len) click to toggle source
# File lib/turborex/windows/alpc.rb, line 469
def set_data_length(len)
  @total_length = @header_size + len
  @data_length = len

  @header.u1.s1.TotalLength = @total_length
  @header.u1.s1.DataLength = @data_length
end
set_header() click to toggle source
# File lib/turborex/windows/alpc.rb, line 489
def set_header
  @total_length, @data_length = get_total_and_data_len
  @length = @header.u1.Length
  @type = @header.u2.s2.Type
  @data_info_offset = @header.u2.s2.DataInfoOffset
  @zero_init = @header.u2.ZeroInit
  @client_id = @do_not_use_this_field = ClientID.new(@header.ClientId.UniqueProcess, @header.ClientId.UniqueThread)
  @message_id = @header.MessageId
  @client_view_size = @callback_id = @header.ClientViewSize
  @header_size = @header.sizeof
end
type=(type) click to toggle source
# File lib/turborex/windows/alpc.rb, line 501
def type=(type)
  binding.pry
  @type = @header.u2.s2.Type = type
  @message[0, @header_size] = @header.str
end

Private Instance Methods

perform_raw_message(raw_message) click to toggle source
# File lib/turborex/windows/alpc.rb, line 539
def perform_raw_message(raw_message)
  raise "Invalid message class." unless raw_message.is_a?(::Metasm::C::AllocCStruct)
  @message = raw_message
  nport_message = APIProxy.np['PORT_MESSAGE']
  @header = nport_message.from_str raw_message[0, nport_message.sizeof]
  set_header

  @message_size = @message.sizeof
  @payload_size = @data_length
  @payload = @message[@header_size, @payload_size]
  @buf_size = @message.sizeof - @header_size
end
pure_set_msg(payload, payload_size) click to toggle source
# File lib/turborex/windows/alpc.rb, line 552
def pure_set_msg(payload, payload_size)
  @message_size = @header_size = @header.sizeof
  @payload_size = payload_size
  @buf_size = @payload_size + PORMSG_PAD
  @message_size += @buf_size
  @message = APIProxy.alloc_c_ary('BYTE', @message_size)
  set_data_length @payload_size
  @message[0, @header_size] = @header.str
  @message[@header_size, @payload_size] = payload
end