কৌতুক হওয়া উচিত 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);
}
সম্পূর্ণ উদাহরণ (এখন এক্স 86 এবং এক্স 64 উভয়ের সাথে কাজ করে)।