เคล็ดลับควรเป็นVirtualAllocพร้อมด้วยEXECUTE_READWRITE
-flag (ต้องการ P / Invoke) และMarshal.GetDelegateForFunctionPointer 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)