using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace Makeref_Safe_OnStack
public static void Main(string[] args)
Structure structure = new Structure();
structure.syncBlock = 0xBADF00D;
structure.methodHandle = 0xBADF00D;
structure.field = 0xBADF00D;
var method = typeof(Program).GetMethod("GetStackAddress", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
RuntimeHelpers.PrepareMethod(method.MethodHandle);
var codeAddress = method.MethodHandle.GetFunctionPointer();
Console.WriteLine(codeAddress.ToString("X"));
Marshal.Copy(addressGetter, 0, codeAddress, addressGetter.Length);
var structureAddress = GetStackAddress() + 132;
Console.WriteLine(structureAddress.ToString("X"));
structure.methodHandle = (int)typeof(Klass).TypeHandle.Value;
Holder<Klass> holder = new Holder<Klass>();
GCHandle holderHandle = GCHandle.Alloc(holder);
var holderAddress = Marshal.ReadIntPtr(GCHandle.ToIntPtr(holderHandle));
Marshal.WriteIntPtr(holderAddress, 4, structureAddress + 4);
Console.WriteLine(holder.reference.GetType());
Console.WriteLine(holder.reference.Field);
Console.WriteLine(holder.reference.Field);
static byte[] addressGetter = new byte[]
static IntPtr GetStackAddress()
Console.WriteLine("Some dummy code to be replaced");