나는 을 가지고 있는데,이 API는 대상에서 처리하는 명명 된 파이프 트래픽을보기 위해 Win32 대상 응용 프로그램 (ASIO를 사용함)으로 후킹합니다. ReadFile 또는 WriteFile 호출로 트랜잭션의 시작을 설정하고 호출이 동 기적으로 이루어지면 해당 호출의 결과를 가져옵니다. 호출이 비동기 인 경우, 호출의 끝을 GetQueuedCompletionStatus에 연결하여 트랩합니다. 검색된 데이터는 Wireshark에 명명 된 파이프 연결을 서비스하는 내 ASIO 스레드 풀로 보내집니다. 그것은 실제로 꽤 달콤합니다.차단 된 Win32 API를 안전하게 언 후크 해제 할 수 있습니까?
프로그램을 원래 상태로 되돌려 야 할 때를 제외하고 모든 것이 잘 작동합니다. 함수의 언 Hooking 잘 작동, 사실은 기존 응용 프로그램이 Named Pipe를 통해 많은 요청을 처리하도록 대상 응용 프로그램을 강제로 않는 한 GetQueuedCompletionStatus에서 무기한 차단 될 수 있습니다. 이러한 스레드가 차단 해제되기를 기다리지 않으면 GetQueuedCompletionStatus가 결국 차단 해제되고 더 이상 존재하지 않는 코드 동굴로 돌아갈 때 AV가 발생합니다.
내가 시도한 또 다른 것은 GetQueuedCompletionStatus에 대한 각 호출을 추적하고 GetQueuedCompletionStatus의 LpOverlapped 매개 변수가 PostQueuedCompletionStatus에 해당하는 호출과 일치 할 때마다 후킹 기능에 신호를 알리는 것이 었습니다. 이것은 모든 것을 확실히 해독 합니다만, AV를 발생시키는 GetQueuedCompletionStatus 호출을 만든 코드를 심각하게 망칠 것입니다.
누구든지 이것을 처리 할 수있는 좋은 방법을 알고 있습니까? 나는 다음 중 하나를 할 수있는 경우에, 이것은 작동합니다 :
- 는 ASIO는
- 트랩 PostQueuedCompletionStatus 만든 더미 호출을 무시하고
- 만들기 스택에 리턴 값을 덮어 쓸 것 PostQueuedCompletionStatus로 전화 걸기 후킹 호출에 대한 함수 포인터 접근자를 전달하는 후킹 차단 호출을위한 트램펄린을 포함하는 반영구 코드 동굴. trampoline 함수는이 값이 null이 아닌 경우 대신 호출자에게 반환 실행 대신 해당 함수 포인터를 호출한다는 것을 알 수 있습니다. 디스패치를 해제 할 때 hooking 코드는 그 함수 포인터를 GetQueuedCompletionStatus의 주소로 설정할 수 있습니다. 그러면 호출자에게 적절한 호출 결과를 반환 할 수 있습니다.
다른 옵션과 함께 사용하기 위해이 응용 프로그램을 일반화 할 수 있다는 점을 제외하면 첫 번째 옵션은 쉽습니다. 두 번째 방법은 코드를 작성하여 가능한 한 안전하도록하려는 경우를 제외하고는 쉽습니다. 마지막 코드가 가능할 수도 있습니다. 코드 동굴로 외부 메모리 공간을 오염시키고 싶지 않습니다.
후크 기능 자체가 푸시 될 수 있습니까? 그렇다면, 입력 횟수를 추적 할 수 있고, 글로벌 "unhook"플래그 또는 신호에 대한 응답으로 입구 카운트가 0이 될 때 자체를 풀 수 있습니다. 완전히 스레드 안전성을 확보하기가 어려울 것입니다 그래도. –
OP : 먼저 제목과 두 번째 단락이 잘못되어 오해의 소지가 있습니다. 발걸음을 잡지 않는 데 문제가 없습니다. 귀하의 질문은 "DLL을 함수로 사용하여 DLL을 언로드하는 것이 안전한지를 어떻게 결정할 수 있습니까?"또는 이와 비슷한 형식 일 수 있습니다. 편집하십시오. 현재 막혀있는 함수를 언 후크하려면 그냥 후크를 푸십시오. 이 문제에 대한 가장 간단하고 안전한 솔루션은 DLL을로드 된 상태로 유지하는 것일 수 있습니다. – conio
@conio : 그건 공정한 일입니다. –