캡스톤보고서 Dll Injection 을이용한 KeyLogger 제작및탐지방법분석 팀명 : 4 조 Guardian 지도교수 : 양정모교수님 조장 : 조민제 (4년) 신예원 (4년) 이상철 (4년) 유명곤 (4년) 2013.5 중부대학교정보보호학과
요약문 1. 연구제목 DLL Injection 을이용한 KeyLogger 제작및탐지방법연구 2. 연구목적및필요성인터넷의발달과컴퓨터의성능과보안프로그램성능과기술이발전함에따라악성코드의기술과기교도많이발전하였다. 그리고악성코드의기술도늘어남에따라초보자도쉽게사용이가능해지고본인이모르는사이개인 PC가감염이되어좀비PC를활용해전국가적피해를일으킨사례와악성코드에개인의 PC나스마트폰등이감염되어개인정보가유출개인의지적피해나금전적피해등이발생한사례를종종볼수가있다. 그리하여본졸업작품은악성코드를만들어봄으로써많은사람들에게악성코드의위험성을인식시키고, 과거로부터현재까지악성코드들의역사와다양한종류의악성코드들을공부하여악성코드의감염경로, 감염방식, 피해의종류등을분석해다양한악성코드들을방어하는보안기술습득에의의를둔다. 3. 연구내용본연구에서는공격하는방법을알아야더욱강력하게방어를할수있다는의견을기반으로악성코드를제작, 이를통해대응방법에대하여연구하였다. 제작한키로거 (KeyLogger) 를실행시자동실행레지스트리에프로그램을등록하고타겟프로그램인메모장을실행하면키로거가메모장에 Dll Injection을수행, 키보드에서발생한메시지들을후킹하여텍스트파일로저장하여 FTP 서버로전송한다. 4. 연구결과본작품은악성코드의공격을방어위해직접악성코드를제작, 분석및실험을해봄으로써악성코드의감염경로및구동원리등을공부하는데목적이있다. 현재개발한프로그램은 MFC와 VC++ 을이용하여해킹이나기능개선등에사용되는 Dll Injection 기술을사용한다. 옵션을통해타겟프로세스를설정하고프로그램을실행하면해당프로세스가실행중인지를감시하다프로세스가실행시 Dll Injection을수행하고후킹을하여키보드메시지를파일로저장하여 FTP서버로전송하는프로그램을개발하였다. 작품활동을진행하다보니최초계획에있던탐지기능을제작하지못했다. Dll Injection의한기법인 SetWindowsHook Ex() 함수를사용한것인데이는탐지가쉽지않고탐지법에대한자료도충분치않아제작에어려움을겪어제외하게되었다. 이를통해윈도우프로그래밍의다양한기법, 기술들을알게되었다. 향후계획으로다른다양한해킹기법들을공부하여악성코드나루트킷등해킹툴을탐지하는프로그램을개발해보겠다.
목 차 요약문 1. 연구계획 4 1.1 구성원 4 1.2 연구의개요 4 1.3 연구의목적 4 2. 기반기술 4 2.1 Win API 란? 4 2.2 MFC 란? 5 2.3 Hooking 7 2.3.1 Hooking 이란? 7 2.3.2 Hooking의다양한방법 7 2.3.3 Dll Injection 이란? 8 3. 연구내용 9 3.1 주간활동보고 9 3.2 프로그램의구성도 9 3.3 프로그램의기능 9 3.4 레지스트리등록 10 3.5 Dll Injection 수행 11 3.6 타겟프로그램후킹 12 3.7 후킹내용 FTP 서버전송 13 4. 결론 14 5. 참고자료 14
1. 연구계획 1.1 구성원 구성원 조장조민제 (4 학년 ) 역할분담 자료조사및개발, 디버깅, 테스트 전체역할분담지시및관리총괄 4 조 Guardian 조원 신예원 (4 학년 ) 이상철 (4 학년 ) 자료조사및프로그램개발, 디버깅, 테스트 졸업작품진행상황기록및정리 유명곤 (4 학년 ) 보고서및 PPT 자료작성 1.2 연구의개요 인터넷의발달과컴퓨터의성능과보안프로그램성능과기술이발전함에따라악성코드의기술과기교도많이발전하였다. 그리고악성코드의기술도늘어남에따라초보자도쉽게사용이가능해지고본인이모르는사이개인 PC가감염이되어좀비PC를활용해전국가적피해를일으킨사례와악성코드에개인의 PC나스마트폰등이감염되어개인정보가유출개인의지적피해나금전적피해등이발생한사례를종종볼수가있다. 그리하여본졸업작품은악성코드를만들어봄으로써많은사람들에게악성코드의위험성을인식시키고자한다. 1.3 연구의목적 과거로부터현재까지악성코드들의역사와다양한종류의악성코드들을공부하고직접제 작하여악성코드의감염경로, 감염방식, 피해의종류등을분석해다양한악성코드들을방 어하는보안기술습득에의의를둔다. 2. 기반기술 2.1 Win API 란? Win API란 Application Programming Interface의약자로운용체제가응용프로그램을위해제공하는함수들의집합으로특정시스템을위한함수집합을이르는일반명사이며그중의하나가윈도우즈 API이나요즘은일반적으로 API라하면윈도우즈 API를말하는경우가많다. API는운영체제의중요한부분이며운영체제그자체라고도할수있다. 4
API도윈도우즈버전에따라여러가지종류가있다. 16비트운영체제인윈도우즈 3.1에서제공하는 API를 Win16 API라부르며 16비트환경의윈도우즈를위한 API이고 Win32 API 란 32비트환경의윈도우즈를위한 API이다. Win16에비해 Win32가양적으로나질적으로더확장되었음은더말할나위도없다. Win32는기본적으로 Win16 API를포용하고있으며현재는 Win64 API가사용되고있다. API와비슷한말로는 SDK라는표현이사용되기도한다. SDK는원래 API를사용하여프로그램을개발하는개발툴킷이었으나지금은의미가전용되어 API와거의같은뜻으로쓰인다. 즉 API 함수는곧 SDK 함수와같은뜻이며이프로그램은 SDK로만들었습니다라고하는것은순수한 API만을사용하여만든프로그램이라는뜻이다. 2.2 MFC 란? MFC란 Microsoft Foundation Class의약자로 C++ 언어를기반으로한윈도우즈응용프로그램제작을위한 C++ 클래스라이브러리의집합이다. 따라서대부분의클래스들은 C++ 언어를확장하여만들어졌으며 700개가넘는방대한 Win API를기반으로윈도우즈응용프로그램을제작할때자주사용되는 API들을클래스화하여묶어놓고, 마이크로소프트사의새로운기술들이소개될때마다해당 API를클래스화하여윈도우즈응용프로그램을제작하는프로그래머에게제공되는아주유용한클래스라이브러리이다. MFC 프로그램은크게단일윈도우 (SDI: Single Document Interface) 와다중윈도우 (MDI: Multiple Document Interface) 로나눌수있습니다. 아래그림은 SDI 에대한기본구조도로 써 MFC 는기본적으로네개의클래스가모여하나의윈도우를생성합니다. < 그림 1 > MFC 의구조 5
< 그림 2> MFC 클래스의계층도 기본적으로위와같이이루어져있다. MFC 프로젝트를처음 Visual Studio C++ 로만들경우위와같은계층구조에서크게벗어나지않는범위내에서파생클래스로모든클래스를상속받아서만들어지게된다. 그래서처음부터끝까지모든것을프로그래머가프로그래밍을하는것이아니라, 공통적인부분은 MFC클래스에서제공하는기능을그대로이용하고, 고유한기능들만만들어삽입하여주면된다. 다음은주요클래스의설명이다. CWinAPP 클래스화면에보이지않는오브젝트를구현한클래스이며, 다음과같은역할을한다. 프로그램의시작과종료를담당 프로그램이시작될때, 메인프레임윈도우를생성 메시지루프를돌면서프로그램구동 프로그램전체를대표하는기능을수행 CWnd 클래스윈도우라는오브젝트를클래스로구현한것이다. 이클래스는약 300여개의멤버함수들을가지고있는데첫번째로, 윈도우의크기, 위치, 모양, 상태등을제어하는함수로약 100여개의멤버함수가여기에속한다. 두번째로, 윈도우를발생시키는메시지를처리하는함수이다. 메시지처리기는윈도우메시지마다각각하나씩존재하기때문에약 200여개의메시지처리기가존재한다. 메시지처리기란? 말그대로메시지를처리해주는것이다. WM_??? 메시지가발생하게되면은 CWnd클래스는메시지를보고앞의 WM을떼고, On_??? 라는메시지에대응되는처리기를호출하게된다. 그래서메시지를처리기를재정의해줌으로써원하는처리를할수있게되는것이다. 6
CDocument 클래스프로그램에서처리하는데이터를저장하고, 읽어보고, 처리하는데필요한모든기능을수행하는눈에보이지않는오브젝트 파일로부터데이터를읽어오는기능 파일에데이터를저장하는기능 새로운데이터를만드는기능 작업중인데이터를닫는기능 데이터가변경된사실을뷰오브젝트에알리는기능 2.3 후킹 (Hooking) 2.3.1 후킹 (Hooking) 이란? Hooking 은정보를가로채원하는정보를얻고, 실행흐름을변경하고, 원래와다른기능을 제공하게하는기술로갈고리란단어의 Hook 을이용하여 Hooking 이라명명되어있다. 2.3.2 후킹 (Hooking) 의다양한방법 후킹은크게두개로분류되는데하나는어플리케이션레벨의후킹과커널후킹이있다. 간단히분류하자면어플리케이션레벨의후킹 ( 이하유저모드후킹 ) 은윈도우와응용프로그램사이에메시지나특정함수를수정하여원하는기능을실행하는방법이고, 커널후킹은유저모드후킹과달리로우레벨에서동작하여커널을직접수정하거나부트타임에로드되어그어떤프로그램보다먼저특정프로그램을실행하는방법등이있다. 유저모드후킹 IAT(Import Address Table) 후킹 - 일반적인 API를호출할때 IAT를사용한다. 이 IAT의필드값을수정함으로써원하는프로그램을실행가능하다. Inline 후킹 - 후킹의대상이되는함수바이너리의처음 5바이트를 jump를수행하는 5바이트명령으로교체하며교체이전원본 5바이트는따로저장해놓은뒤함수가실행시 jump문에의해원하는후킹프로그램을실행한후따로저장해놓은원본을복구해후킹이전의상태로만들고그함수를다시호출한다. 프로그램에의해호출된함수가모든작업을마치고리턴하면후킹프로그램이실행제어권을가지게된다. 커널후킹 SSDT(System Service Dispatch Table) 후킹 - 시스템서비스디스크립터테이블후킹이라고도불림 - KeServiceDescriptorTable구조체의첫번째멤버인 KiServiceTable(=SSDT) 에는 Nt* 함수의주소들이나열되어있다. 그중 SSDT안의 Zw* 함수와대응되는 Nt* 함수의주소를직접만든후킹함수로교체하는방법 7
SYSENTER 후킹 - 인터럽트디스크립터테이블 (Interrupt Descriptor Table : IDT) 후킹이라고도불림 - SYSENTER는어플리케이션레벨에서커널레벨로진입하기위한명령이며 Zw* 함수를호출시 KiFastSystemCall함수를호출하는데그함수내부에 SYSENTER가있고실행시 msr레지스터의 176번째레지스터내부의있는값의주소로커널이실행되어진다. 이때 msr레지스터의 176번째레지스터의값을원하는프로그램으로바꾸면후킹이가능해진다. 2.3.3 DLL Injection 이란? Dll이란동적연결라이브러리 (Dynamic Link Library) 의약어로여러함수들이정의되어진독립적인실행파일입니다. 동적링크를사용하여해당프로세스의실행코드에포함되지않는함수를 Dll에서호출하여사용할수있습니다. Dll안에함수의실행코드가있으며, Dll에는이것을사용하는프로세스와는별도로컴파일, 링크및저장되는하나이상의함수가포함되어있다. Dll을사용하여데이터와리소스를쉽게공유할수있는데이것은여러개의응용프로그램이메모리에있는 Dll의내용을동시에액세스를할수있기때문이다. 이것을이용하여후킹이가능한데개인이작성한 Dll 파일을다른프로세스에강제로삽입하여개인이만든 Dll이동작하게하는방법이다. Dll Injection이란위설명과같이 Dll을다른프로세스에삽입하여개인이만든 Dll을동작하게하는것이다. 이는외부에서다른프로세스로하여금 LoadLibrary() API 함수를호출하도록만드는것이기때문에강제로삽입된 Dll의 DllMain() 함수가실행된다. 또한삽입된 Dll은해당프로세스의메모리에대한접근권한을갖기때문에사용자가원하는다양한동작을수행할수있다. 예를들어기능개선및패치, 유해프로그램및사이트차단프로그램등선의적인용도와악성코드, API Hooking 등악의적인용도로사용되어진다. Dll Injection에는다양한방법이존재한다. 첫째, 레지스트리를조작하여전역후킹하는방법. AppInit_DLLs 안에개인이작성한 Dll을등록하는방법이있다. 이는탐지가쉽고재부팅을해야정상동작한다는단점이있다. 둘째, 원격쓰레드를생성하여후킹하는방법. 이는원격쓰레드를생성하는함수인 CreateRemoteThread() 함수를이용하여다른프로세스에쓰레드를생성하면서 LoadLibrary() 함수를호출하여개인이작성한 Dll을불러오는것으로 Dll Injection이수행된다. 셋째, 윈도우에서제공하는후킹함수를이용하여후킹하는방법. 이는 SetWindowsHookEx() API 후킹함수를이용하여직접프로세스에 Dll Injection을수행하는방법. 이는유저모드후킹에서가장광범위하게사용되는함수로다양한윈도우메시지를후킹할수있다. 8
3. 연구내용 3.1 주간활동보고 주차 내용 주간활동사항 1 주차 졸업작품주제토의및자료수집 2 주차 키로거제작시작및관련자료수집 3 주차 ~ 6 주차 MFC를이용 API 함수인 SetWindowsHookEx() 함수사용 기본적인키로거제작 7 주차 서버로파일을전송할방법에대한자료수집 8 주차 ~ 9 주차 FTP 를이용한파일전송및키로거와연동테스트 10 주차 레지스트리를이용한자동실행코 드구현 11 주차 ~ 12 주차 개발한프로그램디자인변경 로고및아이콘추가 13 주차 ~ 15 주차 개발프로그램종합연동테스트및오류수정 9
3.2 개발프로그램의개요 본조가제작한키로거 (KeyLogger) 를실행시자동실행레지스트리에프로그램을등록하 고타겟프로그램인메모장을실행하면키로거가메모장에 Dll Injection 을수행, 키보드에 서발생한메시지들을후킹하여텍스트파일로저장하여 FTP 서버로전송한다. < 그림 6> 개발프로그램구조도 3.3 개발프로그램의기능 후킹을시작할타겟프로세스를지정 레지스트리에등록하여부팅시자동시작 타겟프로세스에 Dll Injection 수행 Win API 함수인 SetWindowsHookEx 함수를사용 입력장치후킹 (KeyLogger) 탈취한정보를파일로생성 FTP서버를이용한파일전송 백그라운드에서동작 10
3.4 레지스트리등록 < 그림 7> 키로거메인화면 < 그림 8> 레지스트리에등록된화면 위그림 4 와같이프로그램이실행되면그림 5 와같이자동실행레지스트리에프로그램이 등록이된다. 아래그림은프로그램이실행될때레지스트리에프로그램을등록하는함수 이다. < 그림 9> 레지스트리에프로그램을등록하는함수 11
3.5 Dll Injection 수행 < 그림 10> 메모장실행시키로거메인화면 위그림은키로거가실행중일때타겟프로그램인메모장이실행중인지지속적으로확인 하다메모장실행이감지되면키로거는메모장에 SetWindowsHookEx() 함수를이용하여 Dll Injection 을수행한다. 아래함수는상기기능을수행하는부분이다. < 그림 11> Dll Injection 을수행하는함수 12
3.6 타겟프로그램후킹 < 그림 12> 메모장입력시키로거메인화면 위그림은 Dll Injection 이성공적으로수행된후메모장에무작위단어들을입력하였을 때키보드메시지를가로채키로거에서보여주는상황이다. 아래소스는메모장에삽입된 Dll 에작성되어있는키보드메시지를가로채처리하는 Callback 함수의일부이다. < 그림 13> 메시지처리함수의일부 13
3.7 후킹내용 FTP 서버전송 < 그림 14> 후킹내역서버로전송및후킹내역파일 위그림은메모장이종료되고키로거가읽어온내용을메모장에저장하여 FTP 서버에전송 된것을확인한상황이다. 아래함수는저장된파일을 FTP 를이용하여서버에전송하는부 분이다. < 그림 15> FTP 서버로파일을전송하는함수 14
4. 결론 본작품은악성코드의공격을방어위해직접악성코드를제작, 분석및실험을해봄으로써악성코드의감염경로및구동원리등을공부하는데목적이있다. 현재개발한프로그램은 MFC와 VC++ 을이용하여해킹이나기능개선등에사용되는 Dll Injection 기술을사용한다. 옵션을통해타겟프로세스를설정하고프로그램을실행하면해당프로세스가실행중인지를감시하다프로세스가실행시 Dll Injection을수행하고후킹을하여키보드메시지를파일로저장하여 FTP서버로전송하는프로그램을개발하였다. 작품활동을진행하다보니최초계획에있던탐지기능을제작하지못했다. Dll Injection의한기법인 SetWindowsHook Ex() 함수를사용한것인데이는탐지가쉽지않고탐지법에대한자료도충분치않아제작에어려움을겪어제외하게되었다. 이를통해윈도우프로그래밍의다양한기법, 기술들을알게되었다. 향후계획으로다른다양한해킹기법들을공부하여악성코드나루트킷등해킹툴을탐지하는프로그램을개발해보겠다. 5. 참고자료 루트킷 - 윈도우커널조작의미학 / 그렉호글런드, 제임스버틀러지음 / 에이콘윈도우즈 API 정복 VOLUME 1 개정판 / 김상형지음 / 한빛미디어윈도우즈 API 정복 VOLUME 2 개정판 / 김상형지음 / 한빛미디어엔지니어링바이블 / 강병탁지음 / 위키북스 http://blog.naver.com/b5m5see?redirect=log&logno=90020741840 ( 짱보의블로그 ) http://memoryfilm.tistory.com/4 ( 린월의 Memory Film) http://blog.naver.com/postview.nhn?blogid=ikariksj&logno=140056467421&redirect=dlog&w idgettypecall=true ( 쿠마의블로그 ) http://ezbeat.tistory.com/276 (Ezbeat의도서관 ) http://msdn.microsoft.com/ (MSDN) http://hmkuj1224.blog.me/80186792585 ( 마터테의블로그 ) http://www.reversecore.com/38 ( 리버스코어 ) http://www.terms.co.kr/ftp.htm (terms) 15