메시지 후킹 예제

64비트 Windows 설치의 데스크톱에 있는 모든 응용 프로그램을 연결하려면 적절한 프로세스에서 각각 32비트 전역 후크와 64비트 글로벌 후크를 설치하고 정상적인 작동을 차단하지 않도록 후킹 응용 프로그램에서 메시지를 계속 펌핑해야 합니다. 이미 32비트 전역 후킹 응용 프로그램이 있고 각 응용 프로그램의 컨텍스트에서 실행할 필요가 없는 경우 64비트 버전을 만들 필요가 없습니다. 이것은 너무 멋지다!!, 나는 이것을 내 스크립트에서 사용하고 싶지만 작업 관리자와 같은 모든 창을 연결하는 것은 아닙니다. 그것은 모든 창을 후크 할 수 있습니까? oO ::SendMessage 또는 ::PostMessage에서 포인터를 다시 전달할 수 없습니다 (상대 포인터를 공유 메모리 영역으로 다시 전달하는 문제는 무시합니다. 생성할 수 있는 모든 포인터는 DLL의 주소(후크된 프로세스로 재배치) 또는 후크된 프로세스의 주소(프로세스 A 또는 프로세스 B)를 참조할 것이므로 프로세스에서 완전히 쓸모가 없을 수 있기 때문입니다. WPARAM 또는 LPARAM에서 주소 공간-독립적인 정보만 전달할 수 있습니다. 일반적으로, 나는 우회와 후킹을 배우는 것이 좋습니다 – 그것은 단지 재미있다면, 그것은 충분합니다 : 당신은 빨리 진행하고 그것을 좋아합니다. 하지만 심각한 프로젝트에 대 한 후킹 필요 하는 경우, 당신은 쉽게 무료 및 오픈 (하지만 조금 더 복잡 한) mhook 같은 라이브러리로 전환 거 야, 우회 를 구입 하거나 자신의 바퀴를 발명 할 것 이다 (마지막 두 경우 오히려 심각한 이유가 필요). 후킹의 본질은 응용 프로그램이 필요한 함수가 다른 주소에 있다고 믿게하는 것입니다.

운영 체제 및 소프트웨어는 런타임에 이벤트 후크를 쉽게 삽입할 수 있는 수단을 제공할 수 있습니다. 후크를 삽입하는 프로세스에 충분한 권한이 부여된 경우 사용할 수 있습니다. 예를 들어 Microsoft Windows를 사용하면 대화 상자, 스크롤 막대 및 메뉴뿐만 아니라 다른 항목에 대한 시스템 이벤트 및 응용 프로그램 이벤트를 처리하거나 수정하는 데 사용할 수 있는 후크를 삽입할 수 있습니다. 또한 후크가 키보드 및 마우스 이벤트를 삽입, 제거, 처리 또는 수정할 수 있도록 합니다. Linux는 NetFilter를 통해 커널 내에서 네트워크 이벤트를 처리하기 위해 유사한 방식으로 후크를 사용할 수 있는 또 다른 예제를 제공합니다. 또한 위의 예제에서 hook 함수(hkVirtualFn1)는 멤버 함수 자체가 아니므로 __thiscall 호출 규칙을 사용할 수 없습니다. __fastcall은 인수에 대한 ECX 레지스터를 살펴보는 유일한 다른 호출 규칙이므로 대신 사용해야 합니다. Windows API 후킹은 API 함수 호출을 가로챌 수 있는 프로세스입니다. 이렇게 하면 운영 체제 또는 소프트웨어의 동작 방식을 제어할 수 있습니다. 후크를 활용하는 소프트웨어 솔루션 중 일부는 맬웨어 방지 소프트웨어, 응용 프로그램 보안 솔루션, 보안 모니터링 도구, 시스템 유틸리티, 프로그래밍 도구 및 기타 여러 가지 를 포함합니다. 키를 누르면 Windows에서 WM_KEYDOWN 메시지를 보낸 다음 WM_CHAR 메시지를 보냅니다. 모든 WM_KEYDOWN 메시지 뒤에 WM_CHAR 메시지가 있는 것은 아닙니다.

Windows가 응용 프로그램에 보내는 WM_DEADCHAR, WM_SYSDEADCHAR와 같은 다른 메시지가 있습니다. 어쨌든, 나는이 메시지에 대해 논의하지 않을 것이다. 이제, 우리의 주제에 오고, 우리는 WH_GETMESSAGE 후크를 사용하여 WM_CHAR 메시지를 트랩 할 수 있습니다. WH_GETMESSAGE 후크를 사용하면 응용 프로그램에서 GetMessage() 또는 PeekMessage() 함수에서 반환될 메시지를 모니터링할 수 있습니다.