1

我正在寻找一种在运行时注入(添加/替换)3-d 方管理的 .NET 程序集中的方法代码的方法。我在 VS2017 中使用 C# 执行此操作。

我试过了:

  • 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 工作的任何想法或一些替代方法来实现动态管理挂钩。

4

0 回答 0