Detours 会破坏 .NET 应用程序

Posted

技术标签:

【中文标题】Detours 会破坏 .NET 应用程序【英文标题】:Detours corrupts a .NET application 【发布时间】:2014-08-21 15:38:39 【问题描述】:

我创建了一个小型 C# 桌面应用程序,它有一个按钮来执行此操作:

OpenFileDialog of = new OpenFileDialog();
of.ShowDialog();    

在 Build I unchecked“Prefer 32-bit”下的项目设置中,这样创建的进程将是本机架构应用程序

然后我尝试使用 Detours DetourCreateProcessWithDlls()向本机 64 位 DLL 注入此进程@ (我使用的是非免费的 64 位弯路)

该过程开始正常,但是当我单击按钮时它只是挂起并且没有任何反应。

即使 DLL 注入什么也没做,也会发生这种情况。

从我能够调试的情况来看,它可能与导入表的重写有关,detours 确实注入了 DLL,但我找不到问题所在或挂起的位置。

Detours 中是否存在与此相关的已知错误? 我尝试联系不存在的 Microsoft 寻求支持,但尚未得到任何回复。

【问题讨论】:

嗨,嘘,我遇到了完全相同的问题,也将其范围缩小到DetoursRestoreAfterWith - 您是否设法解决了这个问题或理解为什么会发生这种情况? 是的,这是 Detours 中的一个错误。我让微软修复它。如果您有商业许可证,您应该联系他们,他们会向您发送更新 【参考方案1】:

虽然 Microsoft 可以提供更新版本来修复此已知错误(就像您在 cmets 中所述),但我们也设法通过取消对 modules.cpp 中以下代码部分的注释并注释掉 __debugbreak 调用来手动修复它:

#if 0
    if (pder->pclr != NULL && pder->clr.Flags != ((PDETOUR_CLR_HEADER)pder->pclr)->Flags) 
        // If we had to promote the 32/64-bit agnostic IL to 64-bit, we don't want
        // to restore its IAT.
        __debugbreak();
        return TRUE;
    
#endif

这部分实际上导致DetourRestoreAfterWith 函数在 AnyCPU 编译进程的情况下避免尝试恢复 IAT。较新的 Detours 版本只需实现特定的逻辑来处理此类情况。

【讨论】:

以上是关于Detours 会破坏 .NET 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 Microsoft Detours 时访问冲突

Detours简介 (拦截x86机器上的任意的win32 API函数)

如何在 C++ 中使用 Detours 扩展程序内函数而不进入无限循环?

VS2019 Detours 使用注意事项

VS2019 Detours 使用注意事项

VS2019 Detours 使用注意事项