2

私のソフトウェアの新しいリリースのベータテストで、何人かのユーザーがアプリの実行時に例外を報告しました。どちらの場合も、「アプリケーションを正しく起動できませんでした(0xc0000142)」です。私もそれを0xc0000005として見ました。このエラーのあるローカルシステムも見つかりました。デバッガーで実行すると、「datamngr.dll」にアクセス違反があり、ヒープへの割り当てに失敗しました。「datamngr.dll」がスパイウェアであり、システムのAppInitにあるようにロードされていることをすぐに発見しました。

AppInit regキーをクリアすると、この問題は解消されました。Process Monitorを介してチェックアウトしましたが、このDLLが挿入されるたびに、アプリケーションがクラッシュしました。ひどく書かれたスパイウェアだと思っていましたが、それ以来、他のDLLが同じことをしているのを見つけました(正規のソフトウェアであるacaptuser32.dllなど)。私にとって奇妙なのは、私のソフトウェアの以前のバージョンがクラッシュしないことです。2つのバージョンの間には多くの変更が加えられているため、それが何であるかを判断するのは困難です。

ここからどこから始めればいいですか?一部のオンライン探索では、FirefoxなどのアプリがLoadLibraryに取って代わり、DLLが挿入されないようにブラックリストに登録しています。しかし、もっと基本的なことから始めたいと思います。以前はクラッシュしなかったのに、なぜアプリケーションがクラッシュするのでしょうか。

これは非常に曖昧だと思いますが、それはかなり避けられません。私が間違って行っているプロジェクトのプロパティに明らかな何かがあることを願っています。ASLRのオンとオフ、DEPのオンとオフを試しました... user32.dllの遅延ロードを試し、LoadLibrary(エラーを無視するようにSetErrorModeを設定)を介して手動でロードしましたが、何も機能しません。これは、WindowsXPおよびWindows7(32ビットおよび64ビット)で発生します。

どこから始めればよいかについてのポインタをいただければ幸いです。他の詳細が必要な場合は、できるだけ多くの情報を提供します。

乾杯

4

1 に答える 1

1

私は修正を見つけました。Process Monitor を使用して、DLL インジェクターがあるバージョンとないバージョンの DLL ロードの順序を比較しました。そのとき私を驚かせたのは、(LoadLibrary 経由で) .NET をロードする C++ DLL が最初に含まれていたことです。CLR は非常に巨大なので、その DLL とすべての .NET DLL を遅延読み込みすることにしました。それだけです - 私の問題はなくなりました。

Raymond Chen が言ったように、順序付けは脆弱です。他の人がこの問題に遭遇した場合は、DLL の読み込み順序を微調整することをお勧めします。

于 2012-02-07T23:55:08.093 に答える