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