// // InjectCommand.cs // // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System.ComponentModel; using System.Diagnostics; using Remora.Commands.Attributes; using Remora.Commands.Groups; using Remora.Results; namespace NosSmooth.Injector.CLI.Commands { /// /// Injection command for injecting .NET 5+ libraries with UnmanagedCallersOnly method. /// internal class InjectCommand : CommandGroup { private readonly NosInjector _injector; /// /// Initializes a new instance of the class. /// /// The nos smooth injector. public InjectCommand(NosInjector injector) { _injector = injector; } /// /// The command to inject. /// /// The id of the process or part of its name. /// The path to the dll to inject. /// The full type specifier. Default is LibraryName.DllMain, LibraryName. /// The name of the UnmanagedCallersOnly method. Default is Main. /// A result that may or may not have succeeded. [Command("inject")] public async Task Inject ( [Description("The id of the process to inject into.")] string process, [Description("The path to the dll to inject.")] string dllPath, [Option('t', "type"), Description("The full type specifier. Default is LibraryName.DllMain, LibraryName")] string? typeName = null, [Option('m', "method"), Description("The name of the UnmanagedCallersOnly method. Default is Main")] string? methodName = null ) { if (!int.TryParse(process, out var processId)) { var foundProcess = Process.GetProcesses().FirstOrDefault (x => x.ProcessName.Contains(process, StringComparison.OrdinalIgnoreCase)); if (foundProcess is null) { return Result.FromError(new NotFoundError("Could not find the given process.")); } processId = foundProcess.Id; } var dllName = Path.GetFileNameWithoutExtension(dllPath); var result = _injector.Inject ( processId, dllPath, typeName ?? $"{dllName}.DllMain, {dllName}", methodName ?? "Main", new byte[] { 1, 2, 3, 4, 5 } ); if (!result.IsSuccess) { return Result.FromError(result); } Console.WriteLine($"Got {result.Entity} from the managed injected dll."); return Result.FromSuccess(); } } }