चाल होना चाहिए VirtualAlloc साथ EXECUTE_READWRITE
-flag और (पी / आह्वान की जरूरत है) Marshal.GetDelegateForFunctionPointer ।
यहां रोटेट पूर्णांक उदाहरण का एक संशोधित संस्करण है (ध्यान दें कि यहां किसी असुरक्षित कोड की आवश्यकता नहीं है):
[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);
}
पूर्ण उदाहरण (अब X86 और X64 दोनों के साथ काम करता है)।