글로벌 메세지 후킹
(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 으로 선언한것과 동일한 효과가 나타나는 것이죠는 개뿔 사실 대충 짐작만 할 뿐입니다. 



아무튼 코드는 예전 코드랑 크게 바뀐게 없으므로(리팩토링 정도?), 소스코드만 첨부하겠습니다.




Crystalcube_GlobalHook.zip