Exemple #1
0
		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();
			}
		}