我创建了一个小型的C#桌面应用程序,它只有一个按钮来执行此操作:
OpenFileDialog of = new OpenFileDialog();
of.ShowDialog();
在Build I下的项目设置未选中"首选32位"这样创建的进程将是本机架构应用程序
然后我尝试使用Detours DetourCreateProcessWithDlls()
来使用本机64位DLL注入此过程
(我使用非自由64位绕道而行)
这个过程开始很好但是当我点击按钮时它就会挂起而没有任何反应。
即使DLL注入什么都不做,也会发生这种情况。
从我能够调试它可能与导入表的重写有关,绕道会注入DLL,但我找不到出错或挂起的位置。
Detours中是否存在与此相关的已知错误?
我尝试联系不存在的Microsoft以获得支持,但尚未收到任何回复。
答案 0 :(得分:1)
虽然微软可以为这个已知错误提供更新版本(如您在评论中所述),但我们还设法通过取消注释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版本只是实现特定的逻辑来处理这种情况。