windows - 为什么注入(inject)的任何 DLL 都会使主机进程崩溃?

标签 windows access-violation dll-injection

在对我的软件的新版本进行 Beta 测试时,一些用户报告了运行该应用程序时出现的异常情况。在这两种情况下都是:“应用程序无法正确启动 (0xc0000142)”。我也看到它是 0xc0000005。我发现一个本地系统也有这个错误,并发现在调试器下运行它时,“datamngr.dll”有访问冲突并且在堆上分配失败。我很快发现“datamngr.dll”是 spy 软件,并且像在系统的 AppInit 中一样被加载。

一旦我清除了 AppInit 注册表项,这个问题就消失了。我通过 Process Monitor 检查了它,每当注入(inject)这个 DLL 时,我的应用程序就会崩溃。我以为它只是写得很糟糕的 spy 软件,但后来我发现其他 DLL 也在做同样的事情(例如 acaptuser32.dll,它是合法软件)。对我来说奇怪的是我的软件的以前版本不会崩溃。这两个版本之间有很多很多变化,所以很难说是什么。

我从哪里开始?一些在线探索显示 Firefox 等应用程序将 LoadLibrary 替换为黑名单 DLL,以免被注入(inject)。但我想从更基本的问题开始——为什么应用程序现在会崩溃,而以前不会?

我意识到这是非常模糊的,但这几乎是不可避免的。我希望在我做错的项目的属性中有一些明显的东西。我试过打开和关闭 ASLR,打开和关闭 DEP...我试过延迟加载 user32.dll 并通过 LoadLibrary 手动加载它(将 SetErrorMode 设置为忽略错误),但没有任何效果。我们已经看到这种情况发生在 Windows XP 和 Windows 7(32 位和 64 位)上。

任何关于从哪里开始的指示将不胜感激。如果有人需要其他详细信息,我会提供尽可能多的信息。

干杯

最佳答案

我确实找到了解决办法。我使用 Process Monitor 来比较 DLL 在有和没有 DLL 注入(inject)器的版本中的加载顺序。然后让我印象深刻的一件事是我首先包含加载 .NET(通过 LoadLibrary)的 C++ DLL。由于 CLR 是如此庞大,我决定尝试延迟加载该 DLL 和所有 .NET DLL。就是这样 - 我的问题已经解决了。

所以正如 Raymond Chen 所说 -- 排序是脆弱的。如果其他人遇到这个问题,我建议只调整您的 DLL 加载顺序。

关于windows - 为什么注入(inject)的任何 DLL 都会使主机进程崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9171031/

相关文章:

c++ - 通过 CreateRemoteThread 注入(inject) DLL?

windows - 如果在多行替换中死亡,Perl 会报告错误的行号。这是预期的还是错误?

c - 读取数组时发生访问冲突

c# - 在奇怪的情况下抛出 AccessViolationException

delphi - 在 Delphi VCL 表单中使用 LParam 0 确定 WM_SYSCOMMAND 的发送者

c - 无法卸载注入(inject)的 DLL

c++ - WinAPI 获取对另一个应用程序控件的访问权限

Windows Perl --> Unix 在移植后不工作,可能是编码问题

c++ - LoadLibrary 找不到 ntoskrnl

windows - 哪种 RTOS 最适合在装有 Windows 的同一台 PC 上工作?