unsafe static public MemoryPatch Patch(IntPtr target, Action action) { int size = 8; var mr = GetPermissions(target); if (mr != null) { MemoryProtection(target, size, mprot.Read|mprot.Write); var ums = new UnmanagedMemoryStream((byte *)target, 0, size, FileAccess.ReadWrite); byte[] unpatched = new byte[size]; ums.Read(unpatched, 0, size); ums.Seek(0, SeekOrigin.Begin); var writer = new X86Writer(ums, (IntPtr)size); writer.Mov32(X86Register32.EAX, Marshal.GetFunctionPointerForDelegate(action).ToInt32()); writer.Jmp(X86Register32.EAX); ums.Seek(0, SeekOrigin.Begin); byte[] patched = new byte[size]; ums.Read(patched, 0, size); return new MemoryPatch(target, action, patched, unpatched); } else { throw new Exception(); } }