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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
Detours简介 (拦截x86机器上的任意的win32 API函数)