검색결과 리스트
글
글로벌 메세지 후킹
(Keyboard / Mouse Hooking)
History
2013-01-14 : .NET 의 Framework Version 이 다른 경우, Hook 이 안되는 버그 수정.
Intro
이전에 .NET 에서 글로벌 후킹을 하는 방법에 대해 포스팅을 한 적이 있습니다.
그때 그 방식(?)에는 문제점이 있었습니다.
바로, Callback 함수가 Static 이어야 한다는 것입니다.
대부분 인터넷에서 찾아 볼 수 있는 .NET 의 글로벌 메세지 후킹의 경우, CallBack 함수가 Static 입니다.
Static 으로 선언하지 않으면, CallBack 이 오지 않습니다.
이유는 MSDN 에도 써 있습니다.
정확히 기억은 나지 않지만, 어쨌든 요약하면 CallBack 함수의 주소를 찾을 수 없다는 이유입니다.
이렇게 CallBack 함수가 Static 인 경우에 문제가 있습니다.
바로 Thread 에 Safe 하지 않다는 것이죠.
니꺼 내꺼 구분이 없습니다. ㅠㅠ
Keyboard/Mouse 같이 메세지 타입에 따른 후킹 클래스는 만들 수 있습니다만,
KeybaordHooker hooker1 = new KeyboardHooker();
KeybaordHooker hooker2 = new KeyboardHooker();
KeybaordHooker hooker3 = new KeyboardHooker();
이런식으로 만드는게 불가능 합니다.
후킹 Callback 이 Static 이기 때문이죠.
Intent
앞서 설명한 문제를 해결할 방법에 대해서 찾아보았습니다.
해답은 바로!!!!!
Callback 을 Interface 로 선언하거나, abstract 로 선언하는 것입니다.
그렇게 선언한 뒤에, 자식 클래스에서 구현을 해 주면 됩니다.
이렇게 하면 .NET 의 CLR 이 특정 고정된 영역에 Callback 에 대한(Interface/abstract) 메모리 구조를 만들기 때문에 (아마 컴파일러나 컴퓨터 구조 수업을 배운 사람은 기억 나실겁니다.) 정적인 주소 영역을 만들어 낼 수가 있습니다.
그렇기 때문에 static 으로 선언한것과 동일한 효과가 나타나는 것이죠는 개뿔 사실 대충 짐작만 할 뿐입니다.
아무튼 코드는 예전 코드랑 크게 바뀐게 없으므로(리팩토링 정도?), 소스코드만 첨부하겠습니다.
'Microsoft > C#' 카테고리의 다른 글
인증서(certification) 만들기 (1) | 2014.04.09 |
---|---|
윈도우즈 방화벽 규칙 추가/설정/삭제하기 (3) | 2014.03.27 |
MessageQueue 구현하기 (3) | 2011.05.08 |
JSON 과 AJAX 그리고 C# (0) | 2011.04.25 |
방화벽/백신 프로그램 설치유무 확인 (0) | 2011.02.21 |
RECENT COMMENT