DLL injection 은 어떻게 이루어지는가? – SetWindowsHookEx ()

SetWindowsHookEx ()


이번에는 윈도우즈에서 정상적으로 지원하는 후킹 함수를 이용하는 방법을 알아보겠습니다. 윈도우즈는 OS와 프로세스 간에 메시지를 주고받는데요. 키보드를 누른다던지, 마우스를 클릭한다던지, 디버깅에 관한 메시지라던지 그런 것들을요. 그리고 그렇게 주고받는 메시지를 후킹할 수 있는 함수도 제공하고 있습니다.

사용자 삽입 이미지[그림 1] SetWindowsHookEx() 함수의 개요

SetWindowsHookEx() 함수가 그것이죠. [그림 1]처럼 이 함수에 삽입할 DLL의 Handler, 즉 주소와 함수의 주소를 인자로 넣음으로써 메모리에 올라간 프로세스에 삽입하게 됩니다.

SetWindowsHookEx (WH_KEYBOARD, KeyHookProc, hModule, NULL);


위 예처럼 함수를 작성합니다. hModule은 삽입할 DLL의 주소입니다. 이것은 LoadLibrary() 함수로 구할 수 있죠.

그리고 KeyHookProc은 DLL의 함수인데, GetProcAddress() 함수로 구할 수 있고, CallBack 함수로 등록할 수도 있습니다. 주의할 것은 KeyHookProc는 CallNextHookEx() 함수를 반환해야 한다는 것입니다. 후킹이 끝나고 나서 원래의 작업을 하기 위해서죠. 만약, 원래의 작업을 하지 않는다면, 사용자는 무엇인가가 잘목되었다는 것을 알 수 있고 자칫하면 블루스크린을 띄울 수도 있거든요.

[그림 1]에서 보면 네 번째 인자로 dwThreadId가 지정되어 있는데, 이것은 DLL을 삽입하려는 쓰레드의 ID입니다. GetCurrentThreadId() 함수로 구할 수 있습니다. 이 값이 0이라면, 현재 윈도우즈 데스크탑의 모든 쓰레드가 대상이 되죠.

사용자 삽입 이미지[그림 2] idHook 테이블

첫 번째 인자가 남았는데 이것이 후킹할 메시지입니다. OS와 여기에 지정된 메시지를 주고받는 쓰레드를 후킹하지요. 이 인자에 들어갈 수 있는 값은 [그림 2]에 정리되어 있습니다. 키보드, 마우스, 디버깅, 쉘과 관련된 15개의 메시지들이 있습니다. 이 메시지들에 대해 더 자세한 내용은 아래 참고 문헌에 나와 있으니 여기서는 생략하겠습니다.

마지막으로 작업이 모두 끝나면 메모리 반환을 위해서 UnhookWindowsHookEx() 함수로 후킹을 풀어줘야 합니다.

아래는 SetWindowsHookEx() 함수를 이용하는 예제 소스입니다.

#include <windows.h>

#pragma data_seg(".npdata")
    HINSTANCE hModule=NULL;
    HHOOK hKeyHook=NULL;
    HWND hWndBeeper=NULL;
#pragma data_seg()
#pragma comment (linker, "/SECTION:.npdata,RWS")

LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode>=0)
    {
        SendMessage(hWndBeeper,WM_USER+1,wParam,lParam);
    }
    return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
}

extern "C" __declspec(dllexport) void InstallHook(HWND hWnd)
{
    hWndBeeper=hWnd;
    hKeyHook=SetWindowsHookEx(WH_KEYBOARD,KeyHookProc,hModule,NULL);
}

extern "C" __declspec(dllexport) void UninstallHook()
{
    UnhookWindowsHookEx(hKeyHook);
}

BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpRes)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            hModule=hInst;
            break;
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}


참고 문헌

루트킷 : 윈도우 커널 조작의 미학, Greg Hoglund, James Butler, 2007, 에이콘
SetWindowsHookEx Function :: http://msdn.microsoft.com/library/ms644990.aspx
SetWindowsHookEx() 함수를 이용한 방법 :: http://blog.naver.com/amanahnr/90032952064

Similar Posts

  • DLL Injection 은 어떻게 이루어지는가? – DLL? 그게 뭐야?

    루트킷을 비롯하여 바이러스, 악성코드 등 여러 분야에 두루 쓰이는 기법이 DLL Injection입니다. 윈도우즈 OS에 한정되어 적용되는 것이지만, 윈도우즈 자체의 점유율이 높은 이유로 아주 효과적으로 공격자가 원하는 작업을 수행할 수 있는 방법이죠. 최근 루트킷에 대해 공부하면서 이 DLL Injection이 어떻게 이루어지는 알게 된 것을 정리해봅니다. DLL? 그게 뭐야? DLL은 윈도우즈 OS에서 사용되는 동적 연결 라이브러리 실행…

  • Windows Debugging Intrenals: A to Z

    Articles에 문서를 업데이트 했습니다. Windows 의 내부 매커니즘이 어떻게 유저 모드 디버깅을 제공하는지에 대하여 설명한 Alex Ionescu 의 3부작 시리즈를 번역하였습니다. Alex Ionescu 는 ReactOS 의 커널 개발자이면서 『Windows Internals』 의 저자입니다. 이 문서는 Dbgk 라는 NT 커널(ntoskrnl)의 객체와 디버그 이벤트를 주고받는 방법에 대해서 Win32 (kernel32) 관점부터 DbgUi 객체와 NT 시스템 라이브러리(ntdll)까지 설명합니다. 문서를 이해하기…

  • SPYKIDS OWNZ YOUR SYSTEM, 제로보드4 속수무책으로 당하다.

    Zone-h.kr에서는 국내의 해킹된 사이트를 알려줍니다. 그런데 오늘따라 유난히 많은 사이트들이 해킹되었습니다. 최근에 잠잠하던 거랑 비교해서 이례적인데요. 현재 시각 11시 6분… 22개의 해킹된 사이트 중 20개의 사이트가 브라질의 SPYKIDS라는 팀에 의해 해킹되었습니다. 이들 사이트는 제로보드4를 사용중입니다. 아무래도 SPYKIDS 팀은 제로보드4를 집중적으로 노린 것 같네요. 이미 예전부터 제로보드4는 보안상 취약점이 많은 것으로 알려졌는데 아직 많은 사이트들이 이…

  • Windows Kernelmode, Keyboard Independent Keylogger

    Articles에 문서를 업데이트 했습니다. 곧 입대할 CERT-IS의 에잇(?)스, REDBIT(@RED_BIT) 군의 번역문서입니다. “후킹을 통한 키로거 제작방법. 기존의 필터드라이버나 혹은 그와 유사한 버스드라이버 등을 이용했을 경우에 발생하는 키보드 레이아웃 차이에 따른 호환성 문제를 해결한 키로거 제작방법이다. 하지만 이러한 방식은 안티키로거와 같은 프로그램의 특이성 때문에 실생활에서 인터넷뱅킹의 키 입력을 가로챌 수는 없겠지만, 추가적인 방법으로 충분히 데이터를 훔쳐낼 수…

  • OpenSSH 제로데이 익스플로잇, 속지 마세요.

    인터넷에 OpenSSH의 제로데이 익스플로잇이라고 소개하며 떠도는 소스파일이 있습니다 openssh0day.c 인데요. 저는 버그트럭에서 Justin Kim 님이 올리신 글 덕분에 이게 가짜란 것을 알았습니다. 시험삼아 버추어박스로 페도라를 띄운 후 컴파일해서 실행 해봤는데요. /home 폴더 아래의 모든 데이터를 날리더군요. 정말 어처구니가 없는 녀석이었습니다. 아래는 openssh0day.c 안의 쉘코드 내용입니다. 실제로는 아스키 문자로 되어 있는 것을 printf() 함수로 출력하였습니다. 보시다시피…

  • InvokeClearTracks () at INETCPL.cpl in IE7

    Internet Explorer의 “검색 기록 삭제” 기능에 대해 조사할 일이 있어서 리버싱을 해보았습니다. 이 분석은 Windows XP SP3에서 IE7에 대하여 행하였습니다. INETCPL.cpl IE7에서 “검색 기록 삭제” 기능은 “도구 -> 인터넷 옵션 -> 일반” 탭에 있거나 “인터넷 등록 정보”에 있습니다. 다들 아시다시피 여기에서는 IE로 접속했던 웹사이트에서 내려받은 임시 파일, 쿠키나 히스토리(기록), 저장된 암호 등을 삭제할 수 있습니다….

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다