윈도우에서 프로그래밍을 하던 리버싱을 하던 참.. 핸들이라는 말을 많이 듣게됩니다. 리눅스는 디스크립터라고 해야나요??;;
아무튼 저도 API를 처음 접할때.. 시스템 프로그래밍을 처음 접할때..등등 이놈의 핸들이라는 놈 때문에 상당히 머리아팠습니다. 정작 코드를 짜는데 정확히 이해를 못하고 짜니까 기분이 찝찝했죠.
그 당시에는 그냥 넘겼는데 이것저것 많이 보다보니 이제는 조금 알겠더군요. 그래서 한번 적어볼까 합니다.
전 3가지의 핸들을 설명해보겠습니다. 사실 제가 아는건 3가지밖에 없습니다.. 더 있다면 알려주세요~! 공부해보겠습니다.
먼저 첫번째입니다.
이렇게 해서 구한 핸들입니다.
위 핸들은 사용자 또는 프로세스에서 프로세스 생성요청이 OS에 들어오면 OS는 내부적으로 커널오브젝트를 생성합니다.
이 커널오브젝트라는 것은 해당 프로세스를 관리하기 위한 오브젝트입니다. 이렇게 생성된 커널오브젝트는
해당 프로세스가 생성이 되면 그 프로세스에 대한 정보로 채워지게 됩니다. 이런 커널오브젝트는 파일을 생성시켜도, 프로세스가 생성되도 항상 따라서 생성되게 됩니다. 일반적인 방법으로 이 커널오브젝트에 직접적인 접근은 불가능하지요. 그러면 어떻게 이 커널오브젝트에 접근을 하느냐.. 바로 커널오브젝트에는 생성되면서 번호가 부여되게됩니다.
위 코드를 보시면 OpenProcess의 리턴값이 바로 그 커널오브젝트의 번호입니다. 핸들이라는 것이죠.
결론을 내보면~!
세번째 인자로 전달된 PID값을 가지고 있는 프로세스의 커널오브젝트 핸들을 즉, 번호를 가져오는 것이지요.
두번째 핸들입니다. 바로 인스턴스 핸들이라는 것입니다.
아마 Windows API를 공부해보신 분이라면 많이 봤을법한 핸들입니다. CreateWindow인자로 들어가기도 하지요.
Windows API의 메인 함수인 WinMain을 보시겠습니다.
WinMain이 호출되면서 첫번째 매개변수로 HINSTANCE가 전달됩니다.
사람들이 이것을 인스턴스 핸들이라고 말합니다.
바로 이 인스턴스 핸들은 각 프로그램당 하나씩 가지고 있습니다. 위 커널오브젝트의 핸들 같은 경우는 한 프로세스에서 여러 핸들을 가지고 있을수 있습니다. 각 프로세스 핸들 테이블에서 관리를 하게 되지요. 아무튼.. 이 인스턴스 핸들은 바로 바로!
ImageBase입니다. 두개다 비교해보던 도중 말이 딱 드러맞더군요.
인스턴스 핸들은.. 각 프로세스의 코드영역의 핸들이라고 합니다. 그리고 ImageBase는 Code영역 시작 주소입니다.
그래서 그냥 두 값을 비교해본결과 같더군요 -_-;;
그리고 그 값을 구하는 방법은.. GetModuleHandle인자로 NULL을 전달하면됩니다.
뭐 그냥.. 이런식이랄까요?? ^^;;
전 몇일 전까지만 해도 인스턴스 핸들을 잘 몰랐는데...
몇 년 전부터 알았던.. ImageBase가 인스턴스 핸들이라는 것을 알고 허무허무..
그리고 세번째 입니다. HWND입니다. CreateWindow리턴 값이기도하죠.
이 핸들은 윈도우 핸들입니다. 이건 그냥 그림 한장이면 설명이 끝날듯 싶군요.
( 치트엔진 : 역분석 할 때 특정 값 잡아서 루틴 찾아갈 때 유용한 툴이죠.. )
위 그림을 보시면 상당히 많은 버튼들과 창들이 있습니다. 이 때 각각의 창과 버튼을 조작하기 위해선 그 버튼과 창을 구분할수 있는 무언가가 필요합니다. 바로 그 값이 핸들입니다.
자료형은 HWND이죠. 위에 빨간색으로 몇개만 네모쳐놨지만..
사실 모든 창과 버튼에 각각 핸들이 존재한다고 생각하시면 됩니다.
뭐.. 더 이상 설명은 필요가 없겠군요.
아무튼 핸들이라는 것이 참 많습니다.
자료형만 봐도 HANDLE, HINSTANCE, HWND 전부 다르군요.
핸들 뜻이.. 조종되다..라는 뜻이니 아무래도 윈도우는 조종할 것이 많으니 핸들도 많나봅니다...
추가정보가 있다면 댓글로 달아주세요 ~!
'My Study > Programming&Theory' 카테고리의 다른 글
둘 중 큰수 찾는 정의 된 메크로 (0) | 2010.09.01 |
---|---|
콘솔모드에서 메시지 처리 (0) | 2010.09.01 |
프로세스 환경변수 (6) | 2010.07.20 |
Thread Injection ( Code Injection ) (4) | 2010.06.14 |
BSOD에러 창 띄우기 (2) | 2010.06.04 |