为什么注入的DLL会导致主机进程崩溃?

时间:2012-02-07 04:31:00

标签: windows access-violation dll-injection

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

一旦我清除了AppInit reg键,这个问题就消失了。我通过Process Monitor检查了它,并且每次注入此DLL时,我的应用程序崩溃了。我认为它只是写得很糟糕的间谍软件,但我已经发现其他DLL做同样的事情(例如acaptuser32.dll,这是合法的软件)。对我来说奇怪的是我的软件的先前版本没有崩溃。这两个版本之间有很多很多变化,所以很难说它是什么。

我从哪里开始?一些在线探索显示像Firefox这样的应用程序将LoadLibrary替换为黑名单DLL被注入。但是我想从更基本的开始 - 为什么应用程序现在崩溃了呢?

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

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

干杯

1 个答案:

答案 0 :(得分:1)

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

正如Raymond Chen所说的那样 - 订购很脆弱。如果其他人遇到此问题,我建议您调整DLL加载顺序。