【问题标题】:Code injection does not work with MSCorLib in .Net 2.x代码注入不适用于 .Net 2.x 中的 MSCorLib
【发布时间】:2019-01-03 06:30:08
【问题描述】:

在我们的 .Net 应用程序中,我们想要跟踪通过 .Net 代码打开的文件。任何打开的文件,执行调用总是通过一个内部实例方法 FileStrem.Init(...) ,它在 mscorlib 中可用。

为了将我们的监控代码注入任何 .Net 方法,我们使用 Microsoft 提供的 ICorProfiler API 在 C++ 中构建了一个框架。它所做的只是在模块加载完成后,从加载的模块中从目标方法读取现有的 IL,使用 IL 构建自定义代码并将其注入目标方法。

这个框架运行良好。我们能够将监控代码注入到许多方法中,包括 .Net 4.x 的 mscorlib 中的 FileStream.Init(...) 方法。但是在 .Net 2.x 中不会调用相同的注入代码。

我们能够将我们的代码注入到任何 .Net DLL 中,除了用于 .Net 2.x 的 mscorlib。代码被正确注入,但没有被调用。注入代码后,我已经验证了 FileStream.Init(...) 的 IL;我可以看到我的代码存在。但是,不知道为什么它没有被调用。然而,相同的代码适用于 .Net 4.x 的 FileStream.Init(...) 文件。

这是通过 IL 注入的示例 C++ 代码 -

// Read existing IL
ModuleID modId = 0x2030202; // module id of mscorlib
mdToken tkMethodId = 0x2492333; // Method token for FileStream.Init(...)
LPCBYTE methodBodyIL;
pICorProfilerInfo->GetILFunctionBody(modId, tkMethodId, &methodBodyIL, NULL)

// build monitoring IL and inject it into the bytes read from FileStream.Init
InjectCode(&methodBodyIL)

// Update the injected method back to mscorlib in memory
pICorProfilerInfo->SetILFunctionBody(modId, tkMethodId, methodBodyIL)

知道为什么它在 .Net 2.x 的 mscorlib 中不起作用吗?

【问题讨论】:

  • 第一个问题...是 32 位还是 64 位的问题?一些做得不好的注入仅适用于 32 位。尝试打印IntPtr.Size 或等效项。
  • 它是 64 位的。注入发生在 C++ 中,我没有 IntPtr.Size。不过我在注入前后验证了methodBodyIL的大小和内容。看起来不错。事实上,同样适用于 .Net 4.x
  • 您是否依赖 COR_PRF_DISABLE_ALL_NGEN_IMAGES 禁用 ngen 图像?直到 .Net 4 才引入该标志,并且 ngen 图像会干扰您尝试执行的操作。
  • 是的,我使用了 COR_PRF_DISABLE_ALL_NGEN_IMAGES。我现在该怎么办?
  • 当时的解决方案是使用COR_PRF_USE_PROFILE_IMAGES,并希望没有安装启用profiler的图像。

标签: .net .net-2.0 code-injection clr-profiling-api


【解决方案1】:

如果方法的主体被 ngen-ed 图像覆盖(mscorlib 通常是 ngen-ed),则无法替换方法的主体。您可能正在使用 COR_PRF_DISABLE_ALL_NGEN_IMAGES 标志来禁用 ngen 图像,但该标志直到 .NET 4 才引入,因此不适用于 .NET 2。

在.NET 2 天里,常见的解决方案是使用COR_PRF_USE_PROFILE_IMAGES,并希望机器没有生成任何启用分析支持的 ngen 图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2017-11-09
    • 2019-09-11
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多