Итак, создаем проект, я взял на пример консоль, там не важно. В настройках сразу включили возможность юзать unsafe (небезопасный код) У нас есть два класса: namespace inline_hook { public static class Original { public static void Write() { Console.WriteLine("Оригинальная функция."); } } public static class ToHook { public static void Write() { Console.WriteLine("Дубликат."); } } } Код namespace inline_hook { public static class Original { public static void Write() { Console.WriteLine("Оригинальная функция."); } } public static class ToHook { public static void Write() { Console.WriteLine("Дубликат."); } } } Задача хука в следующем: при вызове Original.Write(); Код Original.Write(); должна сработать ToHook.Write(); Код ToHook.Write(); как это устроить? Вот так: namespace inline_hook { using System; using System.Reflection; internal static class Program { [STAThread] public static void Main() { MethodBase original = typeof(Original).GetMethod("Write", BindingFlags.Static | BindingFlags.Public); MethodBase hooked = typeof(ToHook).GetMethod("Write", BindingFlags.Static | BindingFlags.Public); Original.Write(); Hook.HookFunction(original, hooked); Original.Write(); Console.ReadKey(); } } public static class Hook { public static unsafe void HookFunction(MethodBase Original, MethodBase HookClass) { if (Original == null || HookClass == null) { return; } IntPtr functionPointer = Original.MethodHandle.GetFunctionPointer(), functionPointer2 = HookClass.MethodHandle.GetFunctionPointer(); byte* ptr = (byte*)functionPointer.ToPointer(); int num = (int)functionPointer.ToPointer(); int num2 = (int)functionPointer2.ToPointer(); *ptr = 0xE9; // E9 = _asm jmp - безусловный прыжок на другую область памяти. *(int*)(ptr + 1) = num2 - (num + 5); // запись адреса для прыжка } } } Код namespace inline_hook { using System; using System.Reflection; internal static class Program { [STAThread] public static void Main() { MethodBase original = typeof(Original).GetMethod("Write", BindingFlags.Static | BindingFlags.Public); MethodBase hooked = typeof(ToHook).GetMethod("Write", BindingFlags.Static | BindingFlags.Public); Original.Write(); Hook.HookFunction(original, hooked); Original.Write(); Console.ReadKey(); } } public static class Hook { public static unsafe void HookFunction(MethodBase Original, MethodBase HookClass) { if (Original == null || HookClass == null) { return; } IntPtr functionPointer = Original.MethodHandle.GetFunctionPointer(), functionPointer2 = HookClass.MethodHandle.GetFunctionPointer(); byte* ptr = (byte*)functionPointer.ToPointer(); int num = (int)functionPointer.ToPointer(); int num2 = (int)functionPointer2.ToPointer(); *ptr = 0xE9; // E9 = _asm jmp - безусловный прыжок на другую область памяти. *(int*)(ptr + 1) = num2 - (num + 5); // запись адреса для прыжка } } } Оригинальная функция - обман для человека который хочет крякнуть твое ПО, а в дубликате - весь нужный тебе метод. Представим ситуацию: выложил ты программу в сеть, сделал привязку к ПК, и назвал стоимость активации. Хитрый человек - платить за удобство предоставляемое программой естественно не захочет и попытается что-то предпринять какие то меры, разкалупал но твою программу, видит, вызов какой то функции, допустим связанной с лицензией, название которой аппетитно звучит, переходит, а там белиберда несвязная. Когда дубликат, в свою очередь, выполняет нужные действия. В масштабных проектах, с кучами кода, такие махинации в виде хуков, сплошное издевательство.