컴퓨터 지식 네트워크 - 컴퓨터 사무실 - 시스템 후크란 무엇인가요?

시스템 후크란 무엇인가요?

실제로 Windows 시스템은 이벤트 중심 메커니즘을 기반으로 구축되었습니다. 직설적으로 말하면 전체 시스템은 메시지 전송을 통해 구현됩니다. 후크는 Windows 시스템에서 매우 중요한 시스템 인터페이스로, 일반 응용 프로그램에서는 달성하기 어려운 기능을 완료하기 위해 다른 응용 프로그램으로 전송된 메시지를 가로채고 처리하는 데 사용할 수 있습니다.

훅을 사용하면 특별하고 유용한 많은 기능을 구현할 수 있음을 알 수 있습니다. 따라서 고급 프로그래머라면 Hook 프로그래밍 방법을 마스터하는 것이 필요합니다.

후크에는 다양한 유형이 있으며 각 후크는 해당 메시지를 가로채고 처리할 수 있습니다. 예를 들어 키보드 후크는 키보드 메시지를 가로채고, 쉘 후크는 애플리케이션 메시지를 가로채고 시작하고 닫을 수 있습니다.

그림에 표시된 것처럼 전역 후크의 개략도입니다.

WH_GETMESSAGE 후크는 예제 프로그램에서 사용됩니다. 이 후크는 메시지 대기열에 전달된 Windows 메시지를 모니터링합니다.

후크는 스레드 후크와 시스템 후크로 구분할 수 있으며, 스레드 후크는 특정 스레드의 이벤트 메시지를 모니터링하고, 시스템 후크는 시스템 내 모든 스레드의 이벤트 메시지를 모니터링합니다. 시스템 후크는 시스템의 모든 애플리케이션에 영향을 미치기 때문에 후크 기능은 별도의 DLL(동적 연결 라이브러리)에 배치되어야 합니다. 1. Windows 후크 프로그램을 사용하려면 SDK의 여러 API 함수를 사용해야 합니다. 이러한 함수의 프로토타입과 설명은 다음과 같습니다:

hhook setwindowshookex(int ​​​​idhook, Hook_proc lpfn, hinstance hmod, dword dwthreadid);

매개변수 설명은 다음과 같습니다.

idhook: 후크 유형

lpfn: 후크 처리 함수 주소

hmod: 후크 함수가 포함된 모듈 핸들

dwthreadid: 모니터링 스레드 오브 후크

함수 설명: 이 함수는 시스템에서 idhook에 의해 지정된 유형의 후크를 걸어 해당 특정 메시지를 모니터링하고 처리합니다.

bool unhookwindowshookex(hhook hhk);

함수 설명: 이 함수는 hhk가 지정한 후크를 실행 취소합니다.

lresult callnexthookex(hhook hhk, int ncode, wparam wparam, lparam lparam);

함수 설명: 함수는 메시지를 아래쪽으로 전달하고 다음 후크 프로세스가 이 메시지를 가로챕니다.

2. 후크 처리에는 모듈과 프로세스 간의 데이터 주소 문제가 포함되므로 일반적인 상황은 후크를 동적 링크 라이브러리(dll)에 통합하는 것입니다. 즉, MFC DLL에 정적으로 연결된 일반 MFC DLL 중에서 선택할 수 있습니다. 표준 정적 링크 MFC DLL), 공유 MFC DLL(표준 동적 링크 MFC DLL)을 사용하는 일반 및 확장 MFC DLL(확장 MFC DLL). 첫 번째 유형의 DLL은 컴파일 중에 DLL에 사용되는 MFC 코드를 연결하고 프로그램을 실행할 때 다른 MFC 동적 링크 라이브러리의 지원을 필요로 하지 않지만 두 번째 유형의 DLL은 MFC 클래스에 동적으로 연결됩니다. 따라서 크기는 작지만 MFC 동적 링크 클래스 라이브러리의 지원에 의존합니다. 두 DLL 모두 MFC 프로그램과 Win32 프로그램에서 사용할 수 있습니다. 세 번째 유형의 DLL도 동적으로 연결되지만 MFC 클래스 라이브러리의 확장이므로 MFC 프로그램에서만 사용할 수 있습니다.

또한 일부 전역 변수를 저장하고 마지막 후크 메시지 이벤트가 발생했을 때의 상태를 유지하려면 전역 데이터 공유 데이터 세그먼트를 설정해야 합니다.

3. Win32 DLL의 시작 및 종료 기능은 모두 DLLMain입니다.

이 함수는 프로세스나 스레드가 DLL을 로드하고 언로드할 때마다 호출됩니다.

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 여기서 첫 번째 매개변수는 DLL을 나타냅니다. 스레드 오프로딩 핸들), DLL_PROCESS_DETACH(프로세스 오프로딩). DLLMain 함수에서는 전달된 이 매개변수의 값을 판단하고 다양한 매개변수 값을 기반으로 DLL에서 필요한 초기화 또는 정리 작업을 수행할 수 있습니다. Win32 환경에서는 모든 프로세스의 공간이 서로 독립적이므로 애플리케이션 간의 상호 작용은 줄어들지만 프로그래밍의 난이도는 크게 높아집니다. 프로세스가 DLL을 동적으로 로드하면 시스템은 DLL 주소를 프로세스의 전용 공간에 자동으로 매핑하고 DLL의 전역 데이터 복사본을 프로세스 공간에 복사합니다. 값이 반드시 동일할 필요는 없습니다. DLL 메모리가 프로세스 공간에 매핑되면 각 프로세스는 자체 전역 메모리 복사본을 갖게 됩니다. DLL을 로드하는 각각의 새로운 프로세스는 이 메모리 영역을 다시 초기화합니다. 즉, 프로세스는 더 이상 DLL을 독점적으로 공유할 수 없습니다. 따라서 Win32 환경에서 여러 프로세스 간에 데이터를 공유하려면 필요한 설정을 해야 합니다. 한 가지 방법은 공유해야 할 데이터를 별도로 분리해 독립된 데이터 세그먼트에 배치하고 해당 세그먼트의 속성을 공유로 설정한 후 메모리 공유 DLL을 생성하는 것이다. Hook 프로그램을 생성할 때 Hook 처리를 동적 링크 라이브러리에 통합해야 하므로 루틴에 두 개의 프로젝트를 생성해야 합니다.

1. 후크 처리 동적 링크 라이브러리

(1) mfc appwizard(dll)을 선택하여 새 프로젝트를 만들고 이름을 "spy"로 지정합니다.

(2) mfc 확장 dll 유형을 선택합니다.

(3) "hook.h"라는 새 헤더 파일을 만들고 코드를 다음과 같이 수정합니다.

extern C LRESULT CALLBACK mouseproc(int code, WPARAM wparam, LPARAM lparam ); //후크 처리 기능

extern C bool WINAPI starthook(); //후크 기능 시작

extern C bool WINAPI stophook(); /p>

extern C int WINAPI getresultl(); //왼쪽 마우스 클릭 횟수를 가져오는 함수

extern C int WINAPI getresultr(); 클릭

(4) spy.cpp 프로그램 코드를 다음과 같이 수정합니다:

#include Hook.h //헤더 파일 후크 포함

#pragma data_seg(publicdata ) / /전역 데이터 세그먼트 정의

HHOOK hhook=NULL; //후크 핸들

HINSTANCE pinstance=NULL; //후크 모듈 핸들

UINT mouseclickl= 0; //왼쪽 마우스 클릭 횟수를 기록하는 변수

UINT mouseclickr=0; //오른쪽 마우스 클릭 횟수를 기록하는 변수

#pragma data_seg()

extern C int APIENTRY

DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)

{ if (dwReason == DLL_PROCESS_ATTACH)

{… //기계 생성 코드의 생략된 부분

new CDynLinkLibrary(SpyDLL);

pinstance=hInstance; //모듈 핸들 가져오기

}

…… ;

}

extern C LRESULT CALLBACK mouseproc(int code, WPARAM wparam, LPARAM lparam)//hook 처리 함수

{

if (codelt; 0) //코드<0인 경우 callnexthookex를 직접 호출하여 반환

return CallNextHookEx(hhook, code, wparam, lparam);

if(wparam== WM_LBUTTONDOWN)

{ mouseclickl; //왼쪽 마우스 클릭 횟수 기록}

if(wparam==WM_RBUTTONDOWN)

{ mouseclickr; //마우스 오른쪽 클릭 횟수 기록}

return CallNextHookEx(hhook, code, wparam, lparam);

}

extern C bool WINAPI starthook()//후크 함수 시작

{

hhook=SetWindowsHookEx(WH_MOUSE, mou

seproc, pinstance, 0); //연결

if(hhook!=NULL)

return true;

else return false;

}

extern C bool WINAPI stophook() //후크 기능 취소

{ return UnhookWindowsHookEx(hhook) //후크 취소}

extern C int WINAPI getresultl()//왼쪽 마우스 클릭 횟수를 반환합니다.

{ return mouseclickl;}

extern C int WINAPI getresultr()//오른쪽 마우스 클릭 횟수를 반환합니다.

{ return mouseclickr;}

(5) spy.def 프로그램 코드를 다음과 같이 수정합니다:

내보내기

stophook @2

starthook @1

getresultl @3

getresultr @4

(6) 프로젝트를 컴파일하고 spy.dll 파일을 생성합니다. 및 spy.lib 문서. 2. 후크를 사용하여 애플리케이션 구축

(1) 단일 문서 실행 파일(exe) 프로젝트를 생성합니다.

(2) 리소스의 기본 메뉴를 수정하고 그 아래에 "시작", "실행 취소", "제거"라는 세 개의 하위 메뉴 항목이 있는 "모니터링" 메뉴 항목을 추가합니다.

(3) 프로젝트에 spy.lib 파일을 추가합니다.

(4) "시작", "실행 취소" 및 "제거" 메뉴 항목의 명령 응답 기능을 다음과 같이 수정합니다:

#include E:\DevStudio\MyProjects\spy \hook .h //경로는 다를 수 있습니다

void CMainFrame::OnMenuitem32771() //"시작" 메뉴 항목의 응답 함수

{ starthook() }

void CMainFrame::OnMenuitem32772() //"취소" 메뉴 항목에 대한 응답 함수

{ stophook();}

void CMainFrame::OnMenuitem32773() //"제거" 메뉴 항목 응답 함수

{ int resultl=getresultl();

int resultr=getresultr();

char buffer[80 ];

wsprintf(버퍼, 프로그램 실행 중에 마우스 왼쪽 버튼을 d번 클릭하고, 마우스 오른쪽 버튼을 d번 클릭합니다!, resultl, resultr);

: MessageBox( this-gt; m_hWnd, buffer, message, MB_OK)

}

이 프로젝트를 컴파일하고 생성된 실행 파일 디렉터리에 spy.dll을 넣어 프로그램을 실행합니다. 실행할 때 "모니터" 메뉴에서 "시작" 메뉴 항목을 선택하면 후크가 작동하기 시작하고 "실행 취소" 메뉴 항목을 선택하면 시스템이 "제거" 메뉴를 선택합니다. 항목을 선택하면 프로그램은 모니터링 중에 사용자가 왼쪽 및 오른쪽 마우스 버튼을 각각 클릭한 횟수를 보고합니다.

上篇: 내 이층침대에서 잤던 형의 전자책 txt 전집 下篇: 에어컨은 어떤 상황에서 제습합니까
관련 내용