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