namespace MxNativeClient; public sealed class ObjectExporterClient { private readonly string _host; private readonly int _port; public ObjectExporterClient(string host = "127.0.0.1", int port = 135) { _host = host; _port = port; } public ResolveOxidFailure ResolveOxidUnauthenticated(ulong oxid, IReadOnlyList? requestedProtseqs = null) { using var client = new DceRpcTcpClient(_host, _port); client.Connect(); var bind = client.Bind(ObjectExporterMessages.IObjectExporter, versionMajor: 0, versionMinor: 0); if (bind.PacketType != DceRpcPacketType.BindAck) { throw new InvalidOperationException($"Unexpected bind response packet type {bind.PacketType}."); } byte[] request = ObjectExporterMessages.EncodeResolveOxidRequest( oxid, requestedProtseqs ?? [ObjectExporterMessages.ProtseqNcacnIpTcp]); var response = client.Call(contextId: 0, ObjectExporterMessages.ResolveOxidOpnum, request); return ObjectExporterMessages.ParseResolveOxidFailure(response.StubData.Span); } public DceRpcResponsePdu ResolveOxidWithNtlmConnect(ulong oxid, IReadOnlyList? requestedProtseqs = null) { using var client = new DceRpcTcpClient(_host, _port); client.Connect(); var bind = client.BindWithNtlmConnect(ObjectExporterMessages.IObjectExporter, versionMajor: 0, versionMinor: 0); if (bind.PacketType != DceRpcPacketType.BindAck) { throw new InvalidOperationException($"Unexpected bind response packet type {bind.PacketType}."); } byte[] request = ObjectExporterMessages.EncodeResolveOxidRequest( oxid, requestedProtseqs ?? [ObjectExporterMessages.ProtseqNcacnIpTcp]); return client.CallBound(ObjectExporterMessages.ResolveOxidOpnum, request); } public DceRpcResponsePdu ResolveOxidWithNtlmPacketIntegrity(ulong oxid, IReadOnlyList? requestedProtseqs = null) { using var client = new DceRpcTcpClient(_host, _port); client.Connect(); var bind = client.BindWithNtlmPacketIntegrity(ObjectExporterMessages.IObjectExporter, versionMajor: 0, versionMinor: 0, targetName: _host); if (bind.PacketType != DceRpcPacketType.BindAck) { throw new InvalidOperationException($"Unexpected bind response packet type {bind.PacketType}."); } byte[] request = ObjectExporterMessages.EncodeResolveOxidRequest( oxid, requestedProtseqs ?? [ObjectExporterMessages.ProtseqNcacnIpTcp]); return client.CallBound(ObjectExporterMessages.ResolveOxidOpnum, request); } public DceRpcResponsePdu ResolveOxidWithManagedNtlmPacketIntegrity(ulong oxid, IReadOnlyList? requestedProtseqs = null) { using var client = new DceRpcTcpClient(_host, _port); client.Connect(); var bind = client.BindWithManagedNtlmPacketIntegrity(ObjectExporterMessages.IObjectExporter, versionMajor: 0, versionMinor: 0); if (bind.PacketType != DceRpcPacketType.BindAck) { throw new InvalidOperationException($"Unexpected bind response packet type {bind.PacketType}."); } byte[] request = ObjectExporterMessages.EncodeResolveOxidRequest( oxid, requestedProtseqs ?? [ObjectExporterMessages.ProtseqNcacnIpTcp]); return client.CallBound(ObjectExporterMessages.ResolveOxidOpnum, request); } }