2017-03-14 1 views
-1

다른 프로세스에 주입 된 CBT 후크가 있으며 이전에 정상적으로 작동하고있었습니다. 이 CBT 후크는 C++/CLI DLL로 작성되며 C# DLL을 참조합니다. 이 C# DLL에는 C++/CLI DLL의 x86 및 x64 빌드에 공통된 유형이 포함되어 있기 때문에 필요합니다. 그러나 CBT 후크가 작동하지 않아 C# DLL을 찾을 수 없다고 주장했습니다. 이로 인해 CBT 후크가 주입 된 모든 프로그램이 즉시 중단됩니다. 이전에는 없었습니다.CBT 후크에 여러 DLL이 있음

BinaryFormatter 및 명명 된 파이프를 사용하여 후크 프로 시저에서 데이터를 이전 프로세스로 다시 전송했기 때문에 직렬화를 돕기 위해 공통 유형을 C# DLL로 옮겼습니다. 주입되는 공정의 주소 공간.

내 질문은 어떻게 C# DLL을 런타임에 후크 프로 시저에서 찾을 수 있습니까? C# DLL과 C++/CLI DLL은 같은 디렉터리에 있습니다.

예외 형식 'System.IO.FileNotFoundException'처리되지 않은 예외가 IvyLock.Native.dll 에서 발생

추가 정보 (이 내 C++/CLI의 DLL의 86 변종) : 수 파일 또는 어셈블리 'IvyLock, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = ...'또는 해당 종속성 중 하나를로드하지 마십시오. 시스템이 지정된 파일을 찾을 수 없습니다. 이것은 IvyLock.Native.dll과 같은 디렉토리에 내 C#의 DLL입니다

참고 : 모든 것이 단순히 중독되는 프로세스와 동일한 디렉토리에 IvyLock.dll를 복사하면 완벽하게 작동하지만,이 분명히 글로벌 훅으로 확장 할 수 없으며,이 애플리케이션이 제대로 작동하려면 크로스 아키텍처 글로벌 훅이 필요합니다. IvyLock.dll이 검색되는 경로를 변경하면 문제가 완화 될 것이라고 추측합니다. 어떻게해야합니까?

주 2 : GAC에 IvyLock.dll 추가는 문제를 해결하고, 훨씬 더 확장 성이 있지만, 관리자 액세스를 필요로 잠재적 열심히 배포, 나는 IvyLock를 업데이트 할 때마다 할 수있는 고통이다 .dll. 가능하다면이 해결책을 피하고 싶습니다.

+0

(프로젝트 속성에서 구성 가능한) IvyLock.dll을 지연 시키도록 설정 한 경우 절대 경로를 사용하여 'LoadLibrary'를 실행하면 문제를 해결할 수 있습니다 (내 생각 엔) – xanatos

+0

여기의 문제는 dll에 대한 검색 경로는 앱의 기본 디렉토리이며 dll2를로드하는 dll1과 함께 app1, dll1, dll2가있는 경우 검색 경로는 여전히 dll1의 경로가 아닌 app1의 경로입니다. – xanatos

+0

기다려 ... 내 오류 ... .NET 어셈블리의 로딩을 리디렉션하고 싶습니다. http://stackoverflow.com/a/1373295/613130을 사용하십시오. (따라서'AppDomain.CurrentDomain.AssemblyResolve' 이벤트를 사용하십시오.). 다른 솔루션은 C++ (순수) 솔루션이 있고 C++/CLI 어셈블리를로드하려는 경우에 좋았습니다. – xanatos

답변

0

결국 .NET에서 CBT 후크를 사용하지 않아서이 문제를 피할 수있었습니다. CBT 후크를 사용하는 나의 목적은 응용 프로그램이 창을 열 때를 ​​감지 한 다음 암호가 입력 될 때까지 해당 창을 고정시키는 것이 었습니다. 대신 P/Invoke를 사용하여 SuspendThreadResumeThread을 사용하여 암호를 입력 할 때까지 프로세스를 일시 중지했다가 다시 시작합니다.

0

여기에 X-Y 문제가 있습니다.

다른 프로세스에로드 된 후크가 해당 프로세스의 게스트이므로 호환되지 않는 방식으로 프로세스 상태를 변경하면 안됩니다. .NET을 프로세스에로드하는 것은 호환되지 않는 동작이며, 나중에 주 프로그램이 CLR을 호스팅하려고 시도하면 오류가 발생합니다.

다른 프로세스는 이미 .NET을 사용하고 있으며 게스트 DLL과 호환되지 않는 app.config 구성을 가지고있을 수 있습니다. 그들은 당신의 도서관을 사용하기 위해 그들의 시스템을 설계하지 않았다; 어떤 이유로 든 DLL의 구성 요구 사항을 고려해야하는 이유는 무엇입니까?

해결책은 게스트 (후크) DLL에서 모든 .NET 코드를 제거하는 것입니다. 이것은 C# 도우미 DLL을 의미하는 것이 아니라 C++/CLI 고유 코드 만 의미합니다. 검색 경로를 변경하고 더 많은 .NET 어셈블리를로드하면 문제가 악화됩니다.

관련 문제