Hüner olmalıdır VirtualAlloc ile EXECUTE_READWRITE
-flag ve (P / ınvoke gerekiyor) Marshal.GetDelegateForFunctionPointer .
Döndürme tamsayı örneğinin değiştirilmiş bir sürümü aşağıda verilmiştir (burada güvenli olmayan koda gerek olmadığını unutmayın):
[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);
}
Tam örnek (artık hem X86 hem de X64 ile çalışıyor).