2011. 8. 20. 21:01

Internet Explorer_Hidden 윈도우 보호하기 (IE Web Control Message Hooking)

대상 PID에서 IE Web Control을 사용할 때,
EndTask나 WM_CLOSE 전송 공격으로 해당 PID를 무력화 혹은 강제 종료 시킬 수 있습니다.

다음과 같은 방식이면 공격할 수 있습니다.


만일, 이런 공격을 방어하고자 한다면,
WM_CLOSE를 Skip 하도록 코딩하면 됩니다.
즉, OnClose()에서 기본 함수 호출을 하지 않도록 하는 것입니다.

허나, Internet Explorer_Hidden 같은 경우에는,
OS에서 생성하고 관리하기 때문에,
WM_CLOSE를 Skip 하려면 Internet Explorer_Hidden의 WNDPROC을 subclassing 해야 합니다.

다음과 같이 subclass을 하면 되니 참고하시기 바랍니다.
물론, 여기에서는 WM_CLOSE 방어이지만,
다른 응용도 가능하니, 도움이 되리라 생각됩니다.

전체적인 흐름은,
  1. 실행 Process에서 WM_CREATE Hook
  2. Internet Explorer_Hidden가 생성되는 것을 포착
  3. 새로운 WNDPROC으로 subclassing
  4. 해당 함수에서 WM_CLOSE를 무시함

과 같습니다.

수정될 Class는 theApp이 해당됩니다. 즉, CWinApp 입니다. (물론 다른 class에서 사용해도 됩니다.)

아래 부분을 theApp의 header 파일에 추가합니다.


그리고 아래 부분은 theApp의 생성자에 추가합니다.
 

마지막으로, 아래 부분을 theApp의 C++ 파일에 추가합니다.


그러면, Internet Explorer_Hidden Window의 WNDPROC이 fn_new_wndproc_IE로 redirect됩니다.
현재는 WM_CLOSE를 무시하도록 했는데, 더 다른 응용도 가능하겠죠?

이제 마지막으로, InitInstance에서 윈도우 생성전에 HookIE()를 호출하고,
ExitInstance에서 UnHookIE()를 호출하면 완료됩니다.