class TurboRex::MSRPC::MIDL::OifProcFormatString

Public Instance Methods

decompile() click to toggle source

return Procedure object

# File lib/turborex/msrpc/midl.rb, line 368
def decompile 
  header, hlength = parse_proc_fs_header_stream(@procfs_stream)
  @header = header
  @param_desc = []
  procedure = Procedure.new(header.oi_header.common.ProcNum)

  offset = hlength
  loop do |i|
    stream = @procfs_stream.dup
    stream.base_drift(offset)

    param_desc = OifParamDesc.new(stream, @typefs_stream, @cparser)

    begin
      param = param_desc.decompile # return Parameter object
    rescue TurboRex::Exception::MSRPC::InvalidParamDescriptor
      break
    end

    @param_desc << param_desc

    if param.is_return_type?
      procedure.set_return_type(param)
    else
      procedure.push_param(param)
    end

    offset += param_desc.fs_length
  end

  procedure
end
parse_proc_fs_header_stream(stream) click to toggle source
# File lib/turborex/msrpc/midl.rb, line 401
def parse_proc_fs_header_stream(stream)
  raw_header = stream.read(28)
  offset = 0
  header_s = Struct.new(:oi_header, :oif_header, :win2k_ext).new
  oi_header_s = Struct.new(:common, :explicit_handle_desc).new
  
  oi_header_p1 = @cparser.decode_c_struct('Oi_Header_HType_Flags_t', raw_header)
  oi_header = if (oi_header_p1.OiFlags & Oi_HAS_RPCFLAGS) == Oi_HAS_RPCFLAGS
                @cparser.decode_c_struct('Oi_Header_t', raw_header)
              else
                @cparser.decode_c_struct('Oi_Header_Without_RPCFlags_t', raw_header)
              end
  
  oi_header_s.common = oi_header
  offset += oi_header.sizeof
  if oi_header_p1.HandleType == FC_EXPLICIT_HANDLE
    explicit_hdesc = @cparser.decode_c_struct('Handle_Desc_Common_t', raw_header, offset)
    case explicit_hdesc.HandleType
    when FC_BIND_PRIMITIVE
      explicit_handle_desc = @cparser.decode_c_struct('ExplicitHandlePrimitive_t', raw_header, offset)
    when FC_BIND_GENERIC
      explicit_handle_desc = @cparser.decode_c_struct('ExplicitHandleGeneric_t', raw_header, offset)
    when FC_BIND_CONTEXT
      explicit_handle_desc = @cparser.decode_c_struct('ExplicitHandleContext_t', raw_header, offset)
    end
  
    offset += explicit_handle_desc.sizeof
    oi_header_s.explicit_handle_desc = explicit_handle_desc
  end
  
  header_s.oi_header = oi_header_s
  oif_header = @cparser.decode_c_struct('Oif_Header_t', raw_header, offset)
  offset += oif_header.sizeof
  header_s.oif_header = oif_header

  if (oif_header.InterpreterOptFlags.HasExtensions) == 1 
    size = @cparser.decode_c_struct('WIN2K_EXT', raw_header, offset).ExtensionVersion
    case size
    when WIN2K_EXT_SIZE
      win2k_ext = @cparser.decode_c_struct('WIN2K_EXT', raw_header, offset)
    when WIN2K_EXT64_SIZE
      win2k_ext = @cparser.decode_c_struct('WIN2K_EXT64', raw_header, offset)
    end
    offset += win2k_ext.sizeof
    header_s.win2k_ext = win2k_ext
  end


  [header_s, offset]
end