using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using DllUtils; using DllUtils.Attributes; using DllUtils.Memory; using DllUtils.Modules; using DllUtils.Process; namespace DllExportInjector { class Program { // To pass string in parameter CustomFunctionParams must be used // This will work only with cpp, in csharp unsafe struct is needed [CustomFunctionParams(EncodingType.ASCII)] public struct MyFunctionParams { [ParamPosition(0)] public string Param; [ParamPosition(1)] public int Number; } [StructLayout(LayoutKind.Sequential, Pack = 1)] public class AddParams { [MarshalAs(UnmanagedType.I4)] public int First; [MarshalAs(UnmanagedType.I4)] public int Second; } [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct CalculationResult { [MarshalAs(UnmanagedType.I4)] public int Addition; [MarshalAs(UnmanagedType.I4)] public int Subtraction; [MarshalAs(UnmanagedType.I4)] public int Multiply; [MarshalAs(UnmanagedType.I4)] public int Divide; } static void Main(string[] args) { Console.WriteLine("Welcome to CsharpInjector demo for DllExport library"); Console.WriteLine("Just a small reminder - you cannot inject to every process using this injector"); Console.WriteLine("Be sure to inject only to processes that match process configuration you use for this project (x86, x64)"); Console.Write("Put in name (without .exe) or id of the process you want to inject in: "); string read = Console.ReadLine(); RemoteProcessHandle processHandle; if (int.TryParse(read, out int processId)) { processHandle = Injector.GetRemoteProcess(processId); } else { processHandle = Injector.GetRemoteProcess(read); } if (processHandle == null) { Console.WriteLine("Process not found."); Console.Read(); return; } string dllPath = "DllExportLibrary.dll"; if (!File.Exists(dllPath)) { Console.WriteLine("Dll to inject not found."); } InjectedModule injectedModule = processHandle.Inject(dllPath); Console.WriteLine("Module injected"); Console.WriteLine("Calling Main function to alloc console"); FunctionResult result = injectedModule.ExecuteFunction("Main"); int mainResult = result.To(); Console.WriteLine($"Result from main: {mainResult} (should be 1)"); Console.WriteLine($"Sleeping for 1 second"); Thread.Sleep(1000); // Execute addition function and get its params Console.WriteLine("Calling Addition with params of 10 and 5; Expected result: 15"); result = injectedModule.ExecuteFunction("Add", new AddParams { First = 5, Second = 10 }); int additionResult = result.To(); Console.WriteLine("Result: " + additionResult); injectedModule.ExecuteFunction("MyFunction", new MyFunctionParams { Param = "Injected string!", Number = 1000 }); // Get result struct result = injectedModule.ExecuteFunction("Calc", new AddParams { First = 15, Second = 5 }); CalculationResult calculationResult = result.To(); bool freed = result.To(); injectedModule.Process.Close(); Console.ReadLine(); } } }