본문 바로가기
Programming/Tips(C++,C#)

0129 - Message Hook

by 곰네Zip 2009. 1. 29.

*함수를 Hook한다. = 주소를 바꾸어버린다~. 보안이냐 바이러스냐. 어차피 둘다 써먹는일이다.

*MFC에서 메시지 훅을 아주 대놓고 지원해준다. 바로..
 1)SetWindowHookEx
 2)APIHook - IATHook
                - Hook(주소변경)
  1)은  MS에서 지원하는 채널을 통한 훅이있다. 그러나 2)로가면 리눅스/윈도우 상관없이 다먹힌다.. -0-;;
  지존은 PIC를 건드리는것을 후킹하는것. 방법이 아예없다. 즉, 로우레벨로 내려가버리면... ㅋ;;;

 1) SetWindowHookEx의 치명적 보안결함은 무엇이든 다 후킹할 수 있다.

만약 내가 dll을 로드해놓았다. 현재 실행중인 어떠한 프로세스로 포커스를 옮겨서 후킹할 준비를 시켜버리면... 그 실행프로세스의 가상메모리공간에 MsgHook.dll이 올라간다.

///////////////////////////////////////////////////////////////////////////////////////
//간략한 소스
-DLL에 들어가는것
HANDLE g_hModule;
HANDLE g_hHook;

BOOL StartKeyLog(HWND hWndEdi){ //써줄 윈도우 핸들이 넘어온거다.
  g_hHook = ::SetWindowsHookEX(WH_JOURNALRECORD, KeyRecordProc,(HINSTANCE)g_hModule,0);
  // WH_JOURNALRECORD : Input을모조리후킹해라... ㄷㄷㄷ
  //WH_CALLWNDPROC : 호출프로시저를 후킹
 if(g_hHook == NULL){
  error처리
  return FALSE;
 }
 return TRUE;
}

BOOL APIENTRY DllMain(HANDLE hModule... ){ //이것은 StartKeyLog주소를 넘겨준다.
}

LRESULT CALLBACK KeyRecordProc(int nCode, WPARAM, LPARAM){ //메시지핸들러와비슷
 if(nCode < 0) return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
   LPEVENTMSG lpEvent;
 if(nCode == HC_ACTION){
   lpEvent = (LPEVENTMSG) lParam;
   if(lpEvent->message == WM_KEYDOWN){ //키보드눌렸음?
     문자열 확인후
      SetWindowText를 해주어라. 그러면 Write된다.(Edit에.. 윈도우 핸들로 넘어왔으니)
   }
 }
}

이 함수를 test App에서 호출한다. 그러면 이것이 메모리에 로딩된다.
-App에서
OnTimer에서{
  ::GetActiveWindow() << 누가 활성화되어있는가.
}

*OpenProcess 잘 건드려보자.
*DLL의 묵시적로딩은 다 정보가 남는다. 이거 보안상 매우.... ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
반응형

댓글