2012-02-07 3 views
2

В бета-тестировании новой версии моего программного обеспечения несколько пользователей сообщили об исключениях при запуске приложения. В обоих случаях это: «Приложение не смогло начать правильно (0xc0000142)». Я также видел его как 0xc0000005. Я также нашел локальную систему с этой ошибкой и обнаружил, что при запуске ее в отладчике «datamngr.dll» имел нарушение доступа и не выполнял выделение в куче. Я быстро обнаружил, что «datamngr.dll» является шпионским ПО и загружается, как и в AppInit системы.Почему любая DLL-инъекция вызывает сбои в хост-процессе?

После того, как я очистил ключ реестра AppInit, эта проблема исчезла. Я проверил его через Process Monitor, и всякий раз, когда эта DLL была введена, мое приложение разбилось. Я думал, что это просто плохо написанная программа-шпион, но с тех пор я нашел другие DLL-приложения, которые делают то же самое (например, acaptuser32.dll, что является законным программным обеспечением). Что странно для меня, так это предыдущая версия моего программного обеспечения не падает. Было много и много изменений между двумя версиями, поэтому трудно сказать, что это такое.

С чего начать? Некоторые онлайн-исследования показывают, что приложения, такие как Firefox, заменяют LoadLibrary на черный список DLL. Но я хотел бы начать с более простых - почему приложение теперь терпит крах, когда это не было раньше?

Я понимаю, что это очень расплывчато, но это в значительной степени неизбежно. Я надеюсь, что есть что-то очевидное в свойствах для проекта, который я делаю неправильно. Я пытался с ASLR включить и выключить, DEP включен и выключен ... Я пробовал загрузить загрузку user32.dll и вручную загружать его через LoadLibrary (с SetErrorMode установлен для игнорирования ошибок), и для меня ничего не работает. Мы видели это в Windows XP и Windows 7 (32 и 64-разрядных).

Любые указатели о том, с чего начать, будем очень благодарны. Я предоставлю как можно больше информации, если кому-то понадобятся другие детали.

Cheers

+0

[Вы очень котенок] (http://blogs.msdn.com/b/oldnewthing/archive/2007/12/13/6648400.aspx) – Luke

+0

Есть ли у вас контроль над версиями? Наиболее очевидной мерой устранения неполадок было бы определение точной точки, в которой было изменено поведение, хотя лично я начал бы перестраивать предыдущую версию из исходного кода, если это изменение в ваших инструментах построения, а не в самом источнике приложения. –

+0

Сбой программы перед или после ввода основной функции вашего приложения? Как насчет основной функции библиотеки времени выполнения? –

ответ

1

Я нашел исправление. Я использовал Process Monitor для сравнения порядка загрузки DLL в версиях с и без DLL-инжекторов. Одна вещь, которая поразила меня, - это C++ DLL, с которой я загружаю .NET (через LoadLibrary). Поскольку CLR - такой большой зверь, я решил попробовать задержать загрузку DLL и всех DLL-библиотек .NET. Это все, что нужно - моя проблема исчезла.

Так что, как сказал Раймонд Чен, заказ неустойчив. Если другие люди сталкиваются с этой проблемой, я предлагаю просто настроить ваш порядок загрузки DLL.