Windows 시스템의 후크는 이 기술을 통해 Windows 시스템의 거의 모든 메시지를 가로채고 모니터링하고 처리할 수 있는 매우 강력한 기능을 가지고 있습니다. 이 기술은 다양한 소프트웨어, 특히 모니터링, 자동 녹화 및 기타 시스템 모니터링 기능이 필요한 소프트웨어에 널리 사용될 수 있습니다. 이 기사에서는 독자들에게 참고 자료가 되기를 바라면서 이 주제를 논의합니다.
1. 후크의 메커니즘과 종류
Windows 애플리케이션은 모두 메시지 중심이며 애플리케이션의 작동은 수신하는 메시지의 유형과 내용에 따라 달라집니다. 후크는 Dos 인터럽트 차단 처리 메커니즘과 유사합니다. 후크는 Windows 메시지 처리 메커니즘의 플랫폼으로, 애플리케이션은 지정된 창의 특정 메시지를 모니터링하고 메시지가 대상 창에 도달하기 전에 처리하도록 서브루틴을 설정할 수 있습니다.
Windows에는 두 가지 유형의 후크가 있습니다. 하나는 전체 시스템 내의 메시지를 모니터링하는 시스템 후크(RemoteHook)이고, 다른 하나는 프로세스 내의 메시지만 가로채는 스레드 후크(LocalHook)입니다. 시스템 후크의 경우 후크 기능(HookFunction)은 Windows 시스템의 DLL(동적 연결 라이브러리)에서 구현되어야 합니다. 스레드 후크의 경우 후크 기능은 DLL 또는 해당 응용 프로그램에서 구현될 수 있습니다. 개발자가 후크를 생성하면 Windows는 먼저 시스템 메모리에 후크에 대한 정보가 포함된 데이터 구조를 생성한 다음 해당 구조를 기존 후크 목록에 추가하고 새 후크가 이전 후크 앞에 정렬되기 때문입니다. 후크. 이벤트 발생 시 로컬 Hook이 설치되어 있으면 현재 프로세스의 Hook 함수가 호출됩니다. 원격 Hook인 경우 시스템은 다른 프로세스의 주소 공간에 Hook 함수를 삽입해야 하며, 이를 위해서는 Hook 함수가 동적 링크 라이브러리에 있어야 하므로 원격 Hook을 사용하려면 반드시 Hook 함수를 넣어야 합니다. 후크 함수를 동적 링크 라이브러리에 넣습니다. Hook에 의해 모니터링되는 메시지 유형에 대해 Windows에서는 총 다음과 같은 유형을 제공합니다. 표 1에 표시된 대로:
표 1. Windows 메시지 유형
메시지 유형 상수 식별자 | 값 | 메시지 유형 | 적용 범위 |
WH_CALLWNDPROC | 4 | 창에 메시지 | 스레드 또는 시스템 |
WH_CALLWNDPROCRET | 12 | 창에서 반환된 메시지 | 스레드 또는 시스템 |
WH_CBT | 5 | 창 변경, 포커스 설정 등의 메시지 | 스레드 또는 시스템 |
WH_DEBUG | 9 | 다른 Hook의 Hook 실행 여부 | 스레드 또는 시스템 |
WH_FOREGROUNDIDLE | 11 | 포그라운드 프로그램이 유휴 상태입니다. | 스레드 또는 시스템 |
WH_GETMESSAGE | 3 | 메시지 대기열에 게시된 메시지 | 스레드 또는 시스템 |
WH_저널 재생 | 1 | 녹음된 메시지를 재생합니다 | 체계 |
WH_JOURNALRECORD | 0 | 입력 메시지 모니터링 및 기록 | 체계 |
WH_키보드 | 2 | 키보드 메시지 | 스레드 또는 시스템 |
WH_MOUSE | 7 | 마우스 메시지 | 스레드 또는 시스템 |
WH_MSGFILTER | -1 | 메뉴 스크롤 막대, 대화 상자 메시지 | 스레드 또는 시스템 |
WH_SHELL | 10 | 쉘 메시지 | 스레드 또는 시스템 |
WH_SYSMSGFILTER | 6 | 메뉴 스크롤 막대, 모든 스레드에 대한 대화 상자 메시지 | 체계 |
2. VB 프로그래밍에서 후크 구현
(1) Hook 함수의 형식(HOOK Function). 후크 함수는 실제로 함수입니다. 시스템 후크인 경우 해당 함수는 동적 링크 라이브러리에 배치되어야 합니다. 이 함수는 VB에서 다음과 같은 특정 매개변수 형식을 갖습니다.
개인 함수 HookFunc(ByVal nCode는 길게, ByVal wParam은 길게, ByVal lParam은 길게) |
그 중 nCode는 후크가 생성되는 상황을 나타내며 후크에 따라 가능한 값의 집합이 다릅니다. wParam 및 lParam 반환 값에는 모니터링되는 메시지의 내용이 포함됩니다. Hook이 모니터링하는 메시지의 종류는 nCode의 값에 따라 다릅니다. VB로 설정된 후크 기능의 경우 일반적인 프레임워크 형식은 다음과 같습니다.
개인 함수 HookFunc(ByVal nCode는 길게, ByVal wParam은 길게, ByVal lParam은 길게) nCode 케이스 선택 케이스 ncode<0:hookfunc=callnexthookex(hHookFunc, nCode, wParam, lParam) 케이스 값 1: 처리 1: HookFunc=X1 사례2:처리과정 2:HookFunc=X1 … 선택 종료 종료 기능 |
함수의 반환 값입니다. 메시지를 처리하려면 0을 전달하고, 그렇지 않으면 1을 전달하고 메시지를 먹습니다.
(2) 후크의 설치 및 실행. 후크를 설치하는 데 여러 API 함수가 사용됩니다. API 함수 SetWindowsHookEx()를 사용하여 응용 프로그램 정의 후크 서브루틴을 후크 목록에 설치할 수 있습니다. SetWindowsHookEx() 함수의 선언은 다음과 같습니다.
SetWindowsHookEx Lib user32 Alias 함수 선언 SetWindowsHookExA(ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long |
idHook 값은 처리하는 메시지 유형입니다. lpfn 값은 후크 서브루틴의 주소 포인터입니다. dwThreadId 매개변수가 0이거나 다른 프로세스에서 생성된 스레드의 식별자인 경우 lpfn은 DLL의 후크 서브루틴을 가리켜야 합니다. 또한 lpfn은 현재 프로세스의 후크 서브루틴 코드를 가리킬 수 있습니다. hMod 값은 lpfn이 가리키는 서브루틴을 포함하는 DLL을 식별하는 애플리케이션의 핸들입니다. dwThreadId가 현재 프로세스에서 생성된 스레드를 식별하고 서브루틴 코드가 현재 프로세스에 있는 경우 hMod는 0이어야 합니다. dwThreadId 값은 설치된 후크 하위 프로세스와 관련된 스레드의 식별자입니다. 0인 경우 후크 하위 프로세스는 모든 스레드와 연결됩니다. 후크가 성공적으로 설치되면 후크 하위 프로세스의 핸들이 반환됩니다. 실패하면 0이 반환됩니다.
또한 후크 목록이 가리키는 다음 후크 서브루틴을 실행하려면 일반적으로 후크 서브루틴에서 CallNextHookEx() 함수를 호출해야 합니다. 그렇지 않으면 다른 후크가 설치된 응용 프로그램이 후크 알림을 받지 못하여 잘못된 결과가 발생합니다. CallNextHookEx() 함수의 선언은 다음과 같습니다.
CallNextHookEx Libuser32 Alias 함수 선언 CallNextHookEx(ByVal hHook As Long, ByVal ncode As Lonog, ByVal wParam As Long, lParam As Any) As Long |
hHook 값은 SetWindowsHookEx()의 반환 값이고 nCode, wParam, lParam은 Hook 함수의 세 가지 매개 변수입니다. 프로그램이 종료되기 전에 UnhookWindowsHookEx() 함수를 호출하여 후크와 관련된 시스템 리소스를 해제해야 합니다. UnhookWindowsEx() 함수는 다음과 같이 선언됩니다.
함수 선언 Unhook WindowsHookEx Lib user32 Alias Unhook WindowsHookEx(ByVal hHook As Long)As Long |
hHook은 Hook, 즉 Hook 하위 프로세스의 핸들을 설치할 때 반환되는 값입니다.
(3) VB에서 Hook을 설치할 때 주의해야 할 사항. lpfn 매개변수는 HookFunc의 주소입니다. VB는 HookFunc 코드가 표준 .BAS 모듈에 배치되어야 하고 HookFunc 주소로 전달되어야 한다고 규정합니다. 이는 클래스 모듈에 배치되거나 상위 양식에 첨부될 수 없습니다. RemoteHook의 경우 HookFunc가 동적 링크 라이브러리에 포함되어야 하므로 VB에서 RemoteHook를 사용하는 경우 GetModuleHandle() 및 GetProcAddress()라는 두 가지 API 함수도 사용해야 합니다.
GetModuleHandle Libkernel32 별칭 GetModuleHandleA(ByVal lpModuleName As String) 함수를 길게 선언하세요. GetProcAddress Lib kernel32 별칭 GetProcAddress(ByVal hModule As Long, ByVal lpProcName As String) 함수 선언 |
hmod 값은 Hook 프로세스가 포함된 모듈 이름 핸들입니다. LocalHook인 경우 값은 Null(VB에서는 0이 전달됨)일 수 있고, RemoteHook인 경우 GetModuleHandle(name.dll)을 사용하여 전달할 수 있습니다. .