Sztuką powinien być VirtualAlloc z EXECUTE_READWRITE
FLAG (potrzebuje P / Invoke) i Marshal.GetDelegateForFunctionPointer .
Oto zmodyfikowana wersja przykładu rotacji liczb całkowitych (pamiętaj, że nie jest potrzebny żaden niebezpieczny kod):
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate uint Ret1ArgDelegate(uint arg1);
public static void Main(string[] args){
byte[] asmBytes = new byte[]
{
0x55,
0x8B, 0xEC,
0x8B, 0x45, 0x08,
0xD1, 0xC8,
0x5D,
0xC3
};
IntPtr executableMemory =
VirtualAlloc(
IntPtr.Zero,
(UIntPtr) asmBytes.Length,
AllocationType.COMMIT,
MemoryProtection.EXECUTE_READWRITE
);
Marshal.Copy(asmBytes, 0, executableMemory, asmBytes.Length);
Ret1ArgDelegate del =
(Ret1ArgDelegate) Marshal.GetDelegateForFunctionPointer(
executableMemory,
typeof(Ret1ArgDelegate)
);
uint n = (uint)0xFFFFFFFC;
n = del(n);
Console.WriteLine("{0:x}", n);
VirtualFree(executableMemory, UIntPtr.Zero, FreeType.DECOMMIT);
}
Pełny przykład (teraz działa z X86 i X64).