Introduce

Similar documents
Deok9_PE Structure

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

슬라이드 1

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

BMP 파일 처리

DLL(Dynamic Linked Library)

Content 1. DLL? 그게뭐야?

untitled

Adobe Flash 취약점 분석 (CVE )

제목

Microsoft Word - FunctionCall

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

PowerPoint 프레젠테이션

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

목 차 1. 개요 2. PE(Portable Executable) 이란? 3. IMAGE_DOS_HEADER 4. IMAGE_NT_HEADER 1) IMAGE_FILE_HEADER 2) IMAGE_OPTIONAL_HEADER 3) IMAGE_DATA_DIRECTORY

Microsoft PowerPoint - chap06-2pointer.ppt

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

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

슬라이드 1

11장 포인터

C++ Programming

JVM 메모리구조

C# Programming Guide - Types

API 매뉴얼

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

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

View Licenses and Services (customer)

Chapter #01 Subject

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

11장 포인터

Microsoft PowerPoint - additional01.ppt [호환 모드]

<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

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

C언어 및 실습 C Language and Practice

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

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P

No Slide Title

Deok9_Exploit Technique

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

슬라이드 1

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

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4>

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


지난시간에... 우리는 kernel compile을위하여 cross compile 환경을구축했음. UBUNTU 12.04에서 arm-2009q3를사용하여 간단한 c source를빌드함. 한번은 intel CPU를위한 gcc로, 한번은 ARM CPU를위한 gcc로. AR

IS119_Message.Hooking_이성재.hwp

슬라이드 1

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

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

MFC 프로그래밍

ISP and CodeVisionAVR C Compiler.hwp

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

Microsoft Word - [Windows Hook] 6.HideProcess.doc

슬라이드 1

<C6F7C6AEB6F5B1B3C0E72E687770>

17장 클래스와 메소드

유니티 변수-함수.key

Microsoft PowerPoint - ch07 - 포인터 pm0415

설계란 무엇인가?

PCServerMgmt7

Microsoft PowerPoint - o8.pptx

Secure Programming Lecture1 : Introduction

Microsoft PowerPoint - chap-02.pptx

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

Scalable Network-based Buffer Overflow Attack Detection

PowerPoint 프레젠테이션

윤성우의 열혈 TCP/IP 소켓 프로그래밍

SMB_ICMP_UDP(huichang).PDF

KNK_C_05_Pointers_Arrays_structures_summary_v02

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

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

OCW_C언어 기초

Microsoft PowerPoint - 02_Linux_Fedora_Core_8_Vmware_Installation [호환 모드]

슬라이드 1

윈도우시스템프로그래밍

PowerPoint 프레젠테이션

IP 심화 라우팅프로토콜적용시 라우팅테이블에서 이니셜이있는네트워크를설정하는것 : onnected 직접연결된네트워크를의미한다. 그러므로라우팅은 나는이런네트워크와연결되어있다. 를직접연결된라우터들에게알려주는것 1>en 1#conf t 1(config)#router rip 1

Microsoft PowerPoint - 04windows.ppt

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

슬라이드 1

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

Frama-C/JESSIS 사용법 소개

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

Sharing Memory Between Drivers and Applications

Microsoft PowerPoint - chap12-고급기능.pptx

PowerPoint 프레젠테이션

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

PowerPoint Presentation

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

Microsoft Word - PE Infection ? How to Inject a dll.doc

Microsoft Word - Armjtag_문서1.doc

슬라이드 1

Dialog Box 실행파일을 Web에 포함시키는 방법

DLL INJECTION AND CODE INJECTION OVERVIEW

The Pocket Guide to TCP/IP Sockets: C Version

Install stm32cubemx and st-link utility

PowerPoint 프레젠테이션

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

Figure 5.01

Transcription:

Windows Hook Jerald Lee Contact Me : lucid7@paran.com 본문서는저자가 Windows Hook을공부하면서알게된것들을정리할목적으로작성되었습니다. 본인이 Windows System에대해아는것의거의없기때문에기존에존재하는문서들을짜집기한형태의문서로밖에만들수가없었습니다. 문서를만들면서참고한책, 관련문서등이너무많아일일이다기술하지못한점에대해원문저자들에게매우죄송스럽게생각합니다. 본문서의대상은운영체제와 Win32 API를어느정도알고있다는가정하에쓰여졌습니다. 본문서에기술된일부기법에대한자세한설명은책을참조하시길바랍니다. 제시된코드들은 Windows XP Service Pack2, Visual Studio.net 2003에서테스트되었습니다. 문서의내용중틀린곳이나수정해야할부분이있으면연락해주시기바랍니다. - 1 / 23 -

목차 1. WINDOWS HOOK 개요... 3 1.1. WINDOWS HOOK... 3 1.2. WIDOWS 메모리관리... 4 1.3. PE FORMAT... 9 1.3.1. RVA(Relative Virtual Address)... 10 1.3.2. Section... 10 1.3.3. PE Format의구조...11 1.3.4. PE Format 분석을위한도구들... 15 1.4. DLL... 17 1.4.1. Introduce Dll... 17 1.4.2. Dll의종류... 18 1.4.3. 명시적로딩과암시적로딩... 18 1.4.4. 익스포트시주의할점... 20 1.4.5. 참고문서... 23-2 / 23 -

1. Windows Hook 개요 1.1. Windows Hook 훅 (Hook) 이라는단어는 갈고리, 낚싯바늘 또는 ~ 을낚싯바늘로낚다 라는사전적의미를가지고있다. 그러므로 Windows Hook이라고하면 Windows 라는운영체제안에서무언가를낚아챈다 라는뜻으로이해할수있을것이다. MSDN 은 Hook 을다음과같이정의해놓고있다. A hook is a point in the system message-handling mechanism where an application can install a subroutine to monitor the message traffic in the system and process certain types of messages before they reach the target window procedure. 훅이란메시지핸들링매커니즘을가지고있는시스템에메시지가타켓윈도우프로시저에도착하기전에이들을모니터링하기위한어플리케이션을서브루틴으로써설치할수있는시점이다. ( 의역이라상당히다른뜻일수도있으니각자해석하시기바랍니다. - -;) 이러한 Hook을하기위한방법은여러가지가있는데일반적으로 Win32 API에서제공되는 SetWindowsHookEx(), UnhookWindowsEx() 함수를이용한메시지후킹을많이사용한다.( 전역훅에속하고시스템의성능이저하된다는단점이있지만많이애용되는방법중의하나다.) 국내보안업계에서는 2005년인터넷뱅킹서비스와관련하여비슷한작동을하는초보적인형태의프로그램을이용해 해킹이가능하다. 고객의아이디 / 패스워드를빼낼수있다 등의과장된형태로써보도가되어한때사회적이슈가된적이있었다. (Windows System Programming을해본사람이면누구나다가능한일이다. 언론기사의쓸데없는과잉보도로인해업무량이급증하면서신경이많이날카로워진적이있다. - -) Code Project 의 Three Ways to Inject Your Code into Another Process 문서에서는 Windows Hook을다음과같이세가지의형태로구분해놓았다. Local hooks 자신의프로세스에구성된스레드들의메시지트래픽을감시 Remote hooks 다른프로세스에속해진스레드들의메시지트래픽을감시 Remote hooks 현재시스템에서동작하는모든스레드들의메시지트래픽을감시 - 3 / 23 -

Local hooks의경우를제외하고는 Windows Hook을하기위해서는 Hook을수행하는코드가 Dll로작성되어타겟프로세스에로드되는형태라야만가능하다. 이를 Dll Injection이라고하며가장대중적으로이루어지는형태의훅이아닐까한다.(IAT를이용한훅도있으며제프리아저씨의책에서소개된바있다. 그외에도다양한방법의훅이있으며본문서에서다루어볼것이다.) 이 Dll Injection을하는방법역시많은문서에여러가지형태로발표되었으며, 일단 Dll이성공적으로로드되면그이후에할수있는작업들은매우다양한형태가될것이다. 일반적으로 API Hooking, Message Hooking 등의제목으로많은문서가존재하고있으며구글님께물어보면풍부한양의관련문서들을찾을수있다. 1.2. Widows 메모리관리본격적인 Dll Injection에들어가기전에알아야할많은주제들중먼저 Windows 메모리관리에대해간단하게정리해본다. Windows는메모리관리를위해크게다음과같은관리기법을사용하고있다. 가상메모리 (Virtual Memory) 메모리맵 (Memory-mapped) 힙 (Heap) 이중에서가상메모리에대해서만알아본다. [Win32 의메모리관리구조 ] 프로그램이실행되기위해서는먼저메모리에적재되어야만한다. 즉, 큰프로그램을실행시 - 4 / 23 -

키기위해서는그만큼의메모리가더필요하다. 하지만주기억장치의용량에도한계가있기때문에보조기억장치를이용한가상메모리기법이등장하게된다. 즉, 가상메모리란하드디스크와같은스토리지시스템을병합하여시스템에한개이상의 RAM이설치된것처럼운영체제를속이는것이라고할수있으며 32비트컴퓨터의경우최대인식가능한가상의주소공간의크기는 4GB(2 32 ) 이다. 운영체제가하드디스크와같은스토리지시스템을가상메모리로서활용하기위해쓰는기법이 Swapping이며 Unix 및 Windows 모두사용되고있다. Swapping에대한자세한내용은운영체제책 ( 공룡책이라불리는책이가장쉽다 ) 을참고하기바란다. 일반적으로하나의프로그램이실행되기위해서프로그램전체가적재되어야할필요는없으며그대상은아래와같다. 쓰이지않는코드 ( 예외처리와같은 ) 행렬, 리스트, 테이블등과같은자료구조 같은시간에동시에쓰이지않은구조 위와같은것들은실행중인프로그램에서사용되지않을때메모리에적재되어있을필요가없으므로 Swapping을통해하드디스크에저장되어있다가프로그램이요구할때다시메모리로적재하게된다. 이와같은가상메모리를구현하기위해 Windows는 Demand Paging 기법을사용한다. 아래는가상메모리의구조이다.(Windows 2000 기준 ) - 5 / 23 -

[Windows 2000 가상메모리구조 ] Null 포인터할당파티션이파티션은프로그래머가널포인터할당을쉽게알아차리도록도와주는파티션이다. 만일프로세스의어떤스레드가이파티션의메모리를읽거나쓰려고한다면 CPU는접근위반을발생시키게된다. 사용자모드파티션프로세스의독립된주소공간이위치하는곳이며프로세스는다른프로세스의이파티션에위치하는데이터를읽거나쓸수없다. 2000 계열에서는모든 exe, Dll, 메모리맵파일들이이파티션에로드된다. 64KB 출입금지파티션 2000 계열에만존재하는이파티션은어떤파티션에대한접근도 Access Violation을발생하도록한다. 이는 Microsoft에서 Windows를구현할때커널모드의메모리파티션을쉽게보호하기위해만들어놓은일종의완충지대라고할수있는파티션이다. 커널모드파티션이파티션은운영체제자체의코드가존재하는곳이다. 스레드, 메모리, 파일시스템, 네 - 6 / 23 -

트워크, 모든디바이스드라이버등이여기에로드된다. 2000 계열에서이파티션은완전히보호되어있다. 페이징이란프로그램중자주사용되지않는부분의작업메모리를주기억장치인메모리로부터보조기억장치인하드디스크로옮기는방식을통해, 활용가능한메모리공간을증가시키기위한기법중의하나이며한번에옮겨지는메모리용량단위를페이지라고한다. 페이지의크기는프로세서의구조에따라틀리지만펜티엄이후 x86 프로세서는 4KB로고정되어있다. 페이지테이블을이용한주소매핑은아래와같다. [ 페이지테이블을이용한주소매핑과정 ] x86 의경우 2 단계페이지테이블을사용하며각페이지의크기는 10 바이트이다. 메모리관리장치는메모리접근요청들을감시하고, 또한각주소를페이지번호와페이지내의오프셋 ( 그림에서는변위로표시되어있음 ) 으로분할한다. 메모리관리장치는페이지표에있는페이지번호를확인하는데, 페이지표에는해당페이지가메모리에서디스크로옮겨졌는지또는메모리에아직존재하는지에관한정보들이표시되어있다. 만약메모리에존재하는페이지에대해접근하려는시도가있는경우라면, 가상의주소가실제주소로번역된후접근 - 7 / 23 -

이즉시허용된다. 그러나요청된페이지가이미디스크로옮겨진상태라면, 먼저메모리에현존하는다른페이지를디스크로옮겨서빈공간을만들어야만한다. 그다음디스크의스왑공간상에있던해당페이지가주기억장치인메모리로읽혀들여진다. 이때그페이지가이제는주기억장치내에존재한다는표시와함께메모리상의물리적인주소등페이지표의정보도함께갱신된다. 메모리관리장치는주기억장치로불려들어온이후에내용이수정된페이지가어떤페이지인지에관한정보기록도유지한다. 만약수정이된적이없고디스크로복사할필요가없는페이지는즉시재사용될수있다. 아래의그림을보면페이징테이블을이용한주소의매핑이좀더명확하게이해될것이다. [ 페이지테이블을이용한주소매핑예 ] 어떤새로운프로세스가생성되고주소공간이생성될때모든사용가능한주소공간은해제된상태로존재하며이주소공간을사용하기위해 Win32 API VritualAlloc() 함수로필요한공간을예약 (reserve) 하게된다. 이후확보된영역을사용하기위해실제메모리에매핑하는작업이필요하며이를커밋 (commit) 이라고한다. 이후매핑이끝난커밋된페이지는접근가능한상태가된다. Windows는페이징을이용해모든프로세스마다물리적인주소가겹치지않도록독립적인주소공간을제공하며각프로세스는서로의메모리영역에접근할수없다. 그렇기때문에 DOS나 16비트 Windows에서있었던, 하나의프로그램이 Crash 되었을때다른프로그램도영향을받는일이없어지게되었다.( 블루스크린 ) - 8 / 23 -

본문서에서말하고자하는 Dll Injection은이러한독립된프로세스의주소공간으로접근하여해당프로세스를조절하는것이목적이며좁은의미의 Windows Hook이라고할수있을것이다. 1.3. PE Format IAT Table을이용한 Hook을이해하기위해반드시알아야만하는것이바로이 PE Format이다. 사실 IAT Table 변조는어떻게보면 Reverse Engineering 분야에속하기때문에다루지않으려고했지만 Windows Hook에대해소개된대부분의방법을정리해보자는취지로포함시키게되었다. PE 파일포맷에관한내용은매우방대하고잘정리된양질의문서또한매우많기때문에본문에서는모든것을세세하게설명하지않고필요하다고생각되는것만살펴보도록한다. ( 어디에무엇이있더라 ~ 정도는알아두어야만한다.) PE는 Portable Executable의약자로써이식가능한실행프로그램을뜻하며 Win32 플랫폼하에서공통으로사용할수있음을뜻한다. 또한 PE는 Microsoft Windows에서 EXE, Dll, OCX 등과같은확장자를가진파일에사용되는포맷으로써가장기본적인파일형식이라고할수있다. PE Format은 Unix System V 계열에서사용되는 COFF를변형시킨형태로써발전했으며 PE가 COFF의변형인관계로두파일포맷의구조는매우비슷하다. ( 최초의 Unix System에서는 a.out, System V 초기버전에서는 COFF, Windows NT는 PE, IBM은 IBM 360, Linux와 Solaris는 ELF 파일포맷을사용한다.) 먼저 PE Format 에사용되는용어들을살펴보자. 이름 Image File Object File RVA Virtual 설명 exe, Dll과같은확장자를가지는실행파일. 실행파일자체가가상주소공간에매핑되기때문에 Image( 그림자 ) 라는단어를쓰게되었으며이미지파일이라고하면보통 exe 확장자를가지는실행파일을지칭하기도한다. Object File은 Linker에입력되는파일이다. Linker는 Object File에서 Image File을생성하게되고생성된 Image File은 Loader에의해메모리로적재된다. Relative Virtual Address의약자로서상대적가상주소라고한다. 이미지가메모리에로드되었을때의그시작주소에대한상대적번지를의미하며메모리상에서의 PE의시작주소에대한오프셋으로생각하면된다. 이미지파일의시작주소를빼지않는것을제외하고는위에서살펴본 - 9 / 23 -

Address(VA) Section RVA와동일하다. 이주소는가상주소라고불리는데, Windows NT는각프로세스를위해물리적인메모리와는독립적인별개의가상주소공간을만들기때문이다. 가상주소는단지주소를고려하기위한것이며 RVA처럼예측가능하지않다. PE가가상주소공간에로드된뒤의실제내용을담고있는블록들이며일반적으로코드와데이터라고생각할수있다. 그리고프로그램실행에관련된여러정보들이이섹션안에배치된다. 1.3.1. RVA(Relative Virtual Address) 위에서살펴본대로 RVA는상대적가상주소를뜻한다. 일반적으로파일상태로 2차메모리인하드디스크에존재하는 PE는가상메모리의어떤위치로로드될지미리알수없지만사실 NT의경우 Default로 0x04000000 번지에이미지의시작부로부터로드되며이런이미지로딩시작번지의정보는 PE 파일내에존재한다. 따라서로드된후의가상번지값을기준으로하고그기준에대한상대적오프셋으로 PE 상에해당번지를기입하는것이며 RVA를계산하는법은아래와같다. [Real Address 계산 ] 실제주소번지 ( 가상주소 ) = 이미지로드시작번지 + RVA 1.3.2. Section - 10 / 23 -

Section은같은역할을하는데이터를정리한블록이며 PE 파일이메모리에로드된후코드와데이터, 임포트 / 익스포트된 API들, 리소스, 재배치정보등과같이 PE 파일의실제정보는 section이라불리우는블록으로나뉘어지게된다. Windows에서는 Section을발견하면그것을배치할가상주소영역을확보해서 Section 데이터를통째로복사하며해당 Section에대한정보는 Section Table이나 Header에서얻는다. 1.3.3. PE Format 의구조 PE 파일포맷의전체구조는아래그림과같다. [PE 파일포맷구조 1] - 11 / 23 -

[PE 파일포맷구조 2] PE 파일포맷을구성하는요소들을조금더자세히알아보도록하자. 아래의내용은 WinNT.h 헤더파일에기술되어있다. IMAGE_DOS_HEADER MZ 문자열로시작하는처음부터 40바이트까지의공간과 ( 그림 1에서는 Dos MZ Header, 그림 2에서는 DOS Header) DOS Stub를합친공간이다. 실행파일을바이너리에디터로열어보면처음시작부분이 MZ 문자열로시작하는것을알수있다. [IMAGE_DOS_HEADER] IMAGE_NT_HEADER 실질적인 PE 포맷이시작되는곳이며 PE 0 0 (0x00004550) 라는 4바이트문자의시그 - 12 / 23 -

너쳐를시작으로 IMAGE_FILE_HEADER(20byte), IMAGE_OPTIONAL_HEADER(96byte), Data Directory 배열 (128byte) 로구성되어있다. 그림에서는단순하게 PE HEADER로표현되어있다. 우리가관심을가져야할부분은바로이 Data Directory 배열부분이다. Data Directory 배열은 IMAGE_DATA_DIRECTORY 구조체의배열로구성되어있으며구조는아래와같다. [Data Directory 배열 ] 위의파란색으로표시된부분이보이는가? 이지겹고도어려운 PE Format의설명을들어온목적이바로 12번 Import Address Table 때문이다. IAT에관한사항은뒤에서더자세히살펴보도록한다. IMAGE_FILE_HEADER CPU 타입, 생성시간과같은기본적인정보를담고있다. IMAGE_OPTIONAL_HEADER ImageBase, AddressOfEntryPoint와같은정보를담고있다. - 13 / 23 -

Section Table 여기는 IMAGE_SECTION_HEADER들의배열로이루어져있으며 IMAGE_SECTION_HEADER에는.text,.data,.idata,.reloc 등의시작주소, 사이즈와같은정보를포함하고있다. Section PE 포맷이가상주소공간에로드된뒤의실제데이터를담고있는영역이며아래의표와같은것을포함하고있다. 종류 이름 설명 코드.text 프로그램을실행하기위한코드를담고있는섹션. CPU 레지스터의명령포인터인 ip는이섹션내에존재하는번지값을담게된다..data 초기화된전역변수가저장된다..rdata 읽기전용데이터섹션으로서문자열표현이나 c++/com 가상함수테이블등이.rdata에배치되는항목중의하나이다. 데이터 초기화되지않은전역변수가저장된다. VC++ 7에서는.textbss.bss 로나타난다. 실제 PE 파일내에서는존재하지만가상주소공간에매핑될때에는보통.data 섹션에병합되기때문에메모리상에서는따로존재하지않는다. 임포트 API.idata 정보익스포트 API 정보 임포트할 Dll과그 API에대한정보를담고있다. IAT가여기에존재한다..didat 지연로딩임포트데이터를위한섹션이다. 익스포트할 API에대한정보를담고있다. 이섹션역시.rdata.edata 나.text 섹션에병합되기때문에메모리상에서는따로존재하지않는다. 리소스.rsrc 다이얼로그, 아이콘과같은리소스관련데이터들이포함된다. 재배치정보.reloc 실행파일에대한기본재배치정보를담고있다. TLS.tls declspec(thread) 지시어와함께선언되는스레드지역저장소를위한섹션이다. C++ 런타임.crt 생략 Short.sdata.srdata 예외정보.pdata 디버깅.debug$S.debug$T - 14 / 23 -

.debug$p Directives.drectve 1.3.4. PE Format 분석을위한도구들 지금까지살펴본 PE 파일포맷의구조를분석하기위한유용한도구들이많이있으며아래와같다. Dumpbin Visual Studio를설치시같이제공되는툴로서명령프롬프트상에서동작한다. [Dumpbin.exe 실행모습 ] PE Browser Smidgeonsoft(http://www.smidgeonsoft.com) 에서제공하는 Visual 도구 - 15 / 23 -

LordPE PE Explorer - 16 / 23 -

그외 PE identifier, pe-scan 등이있으며입맛에따라골라쓰면된다. 1.4. Dll 이번에는 Dll에대해살펴보도록한다. 거듭말하지만본인이 Windows System을잘모르는지라정확하고완전한설명이아니라는것을강조하고싶으며일단아는선에서책과문서를참고하여정리를해보자한다. 1.4.1. Introduce Dll Dll은 Dynamic Link Library의약자이며 동적링크라이브러리 라고부른다. 일반적으로소스코드가컴파일된후링크될때라이브러리파일에서특정함수들의기능이구현된부분이실행파일에같이덧붙여지는정적링크라이브러리와는달리 Windows System은프로그램이실행될때 Dll 파일로부터특정함수들의기능이구현된부분을동적으로링크하는동적링크라이브러리를이용한다. 일단읽어온 Dll의함수는프로그램내부함수처럼호출할수있으며 Dll은필요한시점에메모리로읽어오고불필요하면메모리에서없앨수도있다. - 17 / 23 -

이러한 Dll 을사용시얻을수있는이점은다음과같다. 메모리와하드디스크를절약할수있다정적링크라이브러리를사용하는경우공통되는기능이여러프로그램에중복된형태로존재하게되어실행파일의크기가커지게된다. Dll 사용시여러프로그램이하나의 Dll을공유하는형태로실행되기때문에메모리와하드디스크를절약할수있다. 유지보수가간편하다. 실행파일과독립된형태로존재하기때문에보안버그와같이패치가필요할때 Dll 파일만패치한후배포함으로써간단히이루어진다. 1.4.2. Dll 의종류 작성가능한 Dll 의종류에는두가지가있는데아래와같다. 일반 Dll 다른언어로작성된프로그램에서도쓸수있는범용적인 Dll. 단외부에서사용되기위해만들어지는함수는모두 C의형태로만만들어져야하며오버로딩, 클래스와같은기능은다른프로그램에서호출할수없다. 확장 Dll 일반 Dll의단점인오버로딩, 클래스와같은 C++ 의특징을이용할수있도록설계되었지만 C++ 에서만이용할수있다. 1.4.3. 명시적로딩과암시적로딩일반적으로 Dll은변수와함수들을외부어플리케이션이사용할수있도록제공하는역할만을하게되는데이렇게 Dll이변수나함수를외부로제공하는것을 export라하고 Dll이 export하는변수나함수를가져오는것을 import라고한다. 이 Dll을가져오는방법에따라명시적로딩과암시적로딩으로나뉘게된다. 암시적로딩암시적로딩방법은프로그램시작시해당 Dll을바로로드하는방법이며 MSDN에는아래와같이기술되어있다. DLL에암시적으로링크하려면실행파일에서 DLL 공급자로부터다음과같은항목을가져와야합니다. - 18 / 23 -

1. 내보내기함수및 / 또는 C++ 클래스의선언이들어있는헤더파일 (.H 파일 ) 2. 링크할가져오기라이브러리 (.LIB 파일 ). 링커는 DLL이빌드될때가져오기라이브러리를만듭니다. 3. 실제 DLL(.DLL 파일 ) DLL을사용하는실행파일에는내보내기함수를호출하는각소스파일마다내보내기함수또는 C++ 클래스가들어있는헤더파일이포함되어야합니다. 코딩관점에서볼때내보내기함수를호출하는것은다른함수호출과비슷합니다. 호출실행파일을빌드하려면가져오기라이브러리와링크해야합니다. 외부메이크파일을사용하는경우에는링크할다른개체파일 (.OBJ) 또는라이브러리가나열된가져오기라이브러리의파일이름을지정합니다. 운영체제에서호출실행파일을로드할때.DLL 파일을찾을수있어야합니다. 명시적로딩 프로그램실행중에 Dll을로드하여익스포트된함수를사용하는방법이며 MSDN에는아래와같이기술되어있다. 명시적링크의경우에는응용프로그램이런타임에함수를호출하여 DLL을명시적으로로드해야합니다. DLL에명시적으로링크하려면응용프로그램은다음과같은작업을수행해야합니다. LoadLibrary 또는이와유사한함수를호출하여 DLL을로드하고모듈핸들을가져와야합니다. GetProcAddress를호출하여응용프로그램이호출하려는각각의내보내기함수에대한함수포인터를가져와야합니다. 응용프로그램에서는포인터를통해 DLL의함수를호출하기때문에컴파일러는외부참조를생성하지않습니다. 따라서가져오기라이브러리와링크할필요도없습니다. DLL을사용할필요가없으면 FreeLibrary를호출해야합니다. 다음코드에서는이러한예를보여줍니다. typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);... HINSTANCE hdll; LPFNDLLFUNC1 lpfndllfunc1; DWORD dwparam1; UINT uparam2, ureturnval; // Handle to DLL // Function pointer - 19 / 23 -

hdll = LoadLibrary("MyDLL"); if (hdll!= NULL) { lpfndllfunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "DLLFunc1"); if (!lpfndllfunc1) { // handle the error FreeLibrary(hDLL); return SOME_ERROR_CODE; } else { // call the function ureturnval = lpfndllfunc1(dwparam1, uparam2); } } 1.4.4. 익스포트시주의할점 함수를익스포트하는방법은다음의두가지가있다. 모듈정의파일을준비해 EXPORTS 문을기술한다. EXPORTS _GetFuncNumber 소스코드내의함수정의에 _declspec 키워드로정의한다. extern c _declspec(dllexport) int GetFuncNumber(HWND hwnd) { Do Something } 대부분의개발자들이 _declspec 를이용한방법을사용할것이다. 문제는 extern c 에있다. 몇몇 dll injection 을소개하는책, 문서중에는이 extern c 를없이작성된 Dll 내의함수를 - 20 / 23 -

GetProcAddress(handle, 함수이름 ) 와같이호출하는예제가있는데당연히동작하지않는다. extern c 로정의하지않은경우위의예제에서 GetFuncNumber는 c++ 컴파일러가링커로넘길때의이름은 @GetFuncNumber$ 어쩌구저쩌구가된다.(c++ 로작성된코드의이야기이다. 확장자가 c라면이야기는틀려진다.) extern c 로정의했을때의 GetFuncNumber의내부이름은 _GetFuncNumber이되어서정상적으로함수를호출할수있다. export된함수명은 dumpbin.exe 파일의 /exports 옵션으로알수있다. 아래의코드와그결과를비교하면명확히알수있을것이다. #include <windows.h> HINSTANCE hinst; BOOL WINAPI DllMain(HINSTANCE hinstdll, DWORD dwreason, LPVOID lpreserved) { if(dwreason == DLL_PROCESS_ATTACH) { hinst = hinstdll; } return TRUE; } declspec(dllexport) LRESULT CALLBACK NoExternC(INT ncode, WPARAM wp, LPARAM lp) { } extern C declspec(dllexport) LRESULT CALLBACK ExternC(INT ncode, WPARAM wp, LPARAM lp) { } - 21 / 23 -

[export 된함수이름 ] Visual Studio 2003 환경에서는위의그림에서도보다시피 _function@number 형식으로나 온다. 왜이런지알수는없지만 Visual Studio 6.0 환경에서는정상적인 _function의형태로익스포트된다. - 22 / 23 -

1.4.5. 참고문서 WebSite 1. Microsoft PE File Pormat http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx http://msdn.microsoft.com/msdnmag/issues/02/02/pe/default.aspx http://msdn.microsoft.com/msdnmag/issues/02/03/pe2/default.aspx 2. API Hooking Revealed (http://www.codeproject.com/system/hooksys.asp) Documents 1. Windows 시스템실행파일의구조와원리, 이호동저, 한빛미디어 2. Debugging Applications for.net and windows, 존로빈스저, Microsoft Press - 23 / 23 -