Решение методов Hook 3-сторонней управляемой сборки - PullRequest
1 голос
/ 05 июля 2019

Я ищу способ внедрения (добавления / замены) кода методов в управляемые сборки сторонних разработчиков .NET во время выполнения. Я делаю это с помощью C # в VS2017.

Я пытался:

  • PlayHooky (https://github.com/wledfor2/PlayHooky), отлично работает, но не поддерживает оригинальные вызовы методов, и для проекта, над которым я работаю, я хочу что-то хорошо протестированное и надежное.
  • Easyhook (https://easyhook.github.io), примеры в Интернете показывают, как внедрить управляемый код в неуправляемые API, не удалось найти информацию, даже если он предназначен для внедрения управляемых в управляемые.
  • Deviare v.2.0 (http://whiteboard.nektra.com/deviare-v-2-0), просто не работал, даже после их Руководства по быстрому запуску, никакой информации о поддержке целевых управляемых сборок.

Вот код EasyHook, который у меня не работал:

TestClass r = new TestClass();
MethodInfo originalMethodInfo = typeof(TestClass).GetMethod(nameof(TestClass.DoSomething));
IntPtr originalMethodInfoPtr = originalMethodInfo.MethodHandle.GetFunctionPointer();

MethodInfo replacementMethodInfo = typeof(Program).GetMethod(nameof(Program.DoSomething));
IntPtr replacementMethodInfoPtr = replacementMethodInfo.MethodHandle.GetFunctionPointer();
//Create hook
using (LocalHook hook = EasyHook.LocalHook.CreateUnmanaged(originalMethodInfoPtr, replacementMethodInfoPtr, IntPtr.Zero))
{
    hook.ThreadACL.SetInclusiveACL(new int[1]);//Enable hook
    r.DoSomething();//Call original method, expecting replacement method to be called
    Console.ReadKey();
}

Когда я пытался использовать EasyHook.LocalHook.Create, я получал "Managed Debugging Assistant 'Reentrancy' : 'Attempting to call into managed code without transitioning out first..." исключение.

Я ищу какие-либо идеи, как заставить EasyHook работать, или какие-то альтернативные способы достижения управляемого подключения на лету.

...