/// <summary> /// /// </summary> /// <param name="p"></param> /// <param name="toStringFuncAddress">The address where our injected toString() is stored</param> /// <param name="variableAddress">The address where the object's address will be stored in. After the toString()-execution this address will point to the returned string.</param> /// <returns></returns> public static void InjectIntoProcess(Process p, out IntPtr toStringFuncAddress, out IntPtr variableAddress, uint variableSize = 8u) { // Allocate 4 bytes for the variable variableAddress = p.Allocate(IntPtr.Zero, variableSize); // Build the toString function var toStringFunction = BuildToStringCode(variableAddress); // Allocate the bytes required for the function toStringFuncAddress = p.Allocate(IntPtr.Zero, (uint)toStringFunction.Length, AllocationType.Commit | AllocationType.Reserve, MemoryProtection.ExecuteReadWrite); // Important: Make it executable // Write into the process memory p.WriteArray(toStringFuncAddress, toStringFunction); // Flush instruction cache Imports.FlushInstructionCache(p.GetHandle(), toStringFuncAddress, (uint)toStringFunction.Length); }