2012-02-07 1 views
2

내 소프트웨어의 새로운 릴리스를 베타 테스트 중이므로 여러 사용자가 앱을 실행할 때 예외를 신고했습니다. 두 경우 모두 다음과 같습니다. "응용 프로그램을 올바르게 시작할 수 없습니다 (0xc0000142)". 또한 0xc0000005로 보았습니다. 이 오류가있는 로컬 시스템을 발견하고 디버거에서 실행하면 "datamngr.dll"에 액세스 위반이 발생하여 힙에 할당에 실패했습니다. 신속하게 "datamngr.dll"이 스파이웨어이며 시스템의 AppInit에로드 된 것처럼로드되고 있음을 발견했습니다.주입되는 모든 DLL이 호스트 프로세스를 중단시키는 이유는 무엇입니까?

일단 내가 AppInit 등록 키를 지우면이 문제가 해결되었습니다. Process Monitor를 통해 체크해 봤는데이 DLL이 주입 될 때마다 어플리케이션이 다운되었습니다. 나는 그것이 심하게 작성된 스파이웨어라고 생각했지만, 같은 DLL (합법적 인 소프트웨어 인 acaptuser32.dll 등)을 사용하는 다른 DLL을 발견했습니다. 이상한 점은 이전 버전의 소프트웨어가 다운되지 않는다는 것입니다. 두 버전 간에는 많은 변화가 있었으므로 그것이 무엇인지 말하는 것은 어렵습니다.

여기서부터 시작하겠습니다. 일부 온라인 탐색은 Firefox와 같은 앱이 LoadLibrary를 삽입하여 블랙리스트 DLL을 대체한다는 것을 보여줍니다. 하지만 좀 더 기본적인 것부터 시작하고 싶습니다. 이전에 없었던 응용 프로그램이 지금 왜 충돌하고 있습니까?

나는 이것이 매우 모호하다는 것을 알고 있지만, 그것은 꽤 피할 수없는 일이다. 나는 내가 잘못하고있는 프로젝트의 속성에 뭔가 명백한 것이 있기를 바라고 있습니다. 나는 ASLR on 및 off, DEP on/off로 시도했다 ... 나는 user32.dll 지연로드를 시도하고 수동으로 LoadLibrary (SetErrorMode가 오류를 무시하도록 설정 됨)를 통해로드하고 아무 것도 작동하지 않는다. Windows XP 및 Windows 7 (32 및 64 비트)에서 이러한 현상이 발생하는 것을 확인했습니다.

어디서부터 시작해야하는지에 대한 조언이 있으면 크게 환영 할 것입니다. 다른 사람이 필요하면 최대한 많은 정보를 제공 할 것입니다.

건배

+0

[당신은 꽤 많이 골치가났다] (http://blogs.msdn.com/b/oldnewthing/archive/2007/12/13/6648400.aspx) – Luke

+0

어떤 종류의 버전 컨트롤이 있습니까? 가장 분명한 문제 해결 방법은 동작이 변경된 정확한 지점을 확인하는 것입니다. 개인적으로는 응용 프로그램 소스 자체가 아닌 빌드 도구가 변경된 경우 소스에서 이전 버전을 다시 빌드하는 것으로 시작합니다. –

+0

응용 프로그램의 주 기능을 입력하기 전이나 후에 프로그램이 중단됩니까? 런타임 라이브러리의 주요 기능은 어떻습니까? –

답변

1

나는 수정을 발견했다. DLL을 사용하거나 사용하지 않는 버전에서 DLL로드 순서를 비교하기 위해 프로세스 모니터를 사용했습니다. 그때 내가 쳤던 한 가지는 C++ DLL로, LoadLibrary를 통해 .NET을로드 할 때 먼저 포함되었습니다. CLR은 매우 큰 짐승이기 때문에 DLL과 모든 .NET DLL을 지연 로딩하기로 결정했습니다. 그게 전부입니다 - 제 문제가 사라졌습니다.

Raymond Chen이 말했듯이 주문은 약합니다. 다른 사람들이이 문제를 겪는다면 DLL 로딩 순서를 조정하는 것이 좋습니다.

관련 문제