목차 목차 1 장. Bugs : Where They Come From and how You Solve Them? 2 장. Getting Started Debugging 3 장. Debugging During Coding 4 장. How Do Debuggers Work?

Similar documents
hlogin2

Deok9_Exploit Technique

INTRO Basic architecture of modern computers Basic and most used assembly instructions on x86 Installing an assembly compiler and RE tools Practice co

No Slide Title

=

Microsoft PowerPoint - hy2-12.pptx

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

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

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

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

C++ Programming

제목

Microsoft PowerPoint - e pptx

Microsoft PowerPoint - CSharp-10-예외처리

강의10

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

<4D F736F F F696E74202D204B FC7C1B7CEB1D7B7A55F F6E48616E646C6572B8A6C5EBC7D1BFA1B7AFB0CBC3E2B9D7BCF6C1A

Microsoft Word - FunctionCall

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

Microsoft PowerPoint - o8.pptx

Visual Basic 반복문

슬라이드 1

Microsoft PowerPoint - chap06-2pointer.ppt

<4D F736F F F696E74202D C61645FB3EDB8AEC7D5BCBA20B9D720C5F8BBE7BFEBB9FD2E BC8A3C8AF20B8F0B5E55D>

IDA 5.x Manual hwp

The_IDA_Pro_Book

<BEEEBCC0BAEDB8AEBEEEC1A4B8AE2E687770>

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

PowerPoint 프레젠테이션

C# Programming Guide - Types

Microsoft PowerPoint - System Programming Lab Week1.ppt [호환 모드]

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

슬라이드 1

vi 사용법

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

슬라이드 1

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

ISP and CodeVisionAVR C Compiler.hwp

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


Microsoft PowerPoint - 15-MARS

PowerPoint 프레젠테이션

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

chap 5: Trees

PowerPoint 프레젠테이션

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

Microsoft Word - Reverse Engineering Code with IDA Pro-2-1.doc

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

JVM 메모리구조

Microsoft Word - ExecutionStack

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

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

PRO1_09E [읽기 전용]

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

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

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

(1) 주소지정방식 Address Mode 메모리접근 분기주소 명령어 직접번지 Reg. 지정 Reg. 간접 Base Index 간접 Immediate 상대번지 절대번지 Long 주소 Reg. 간접 Byte Access Bit Access 내부 Data M

PowerPoint 프레젠테이션

02 C h a p t e r Java

MPLAB C18 C

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

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

JAVA PROGRAMMING 실습 09. 예외처리

Microsoft Word - Reversing Engineering Code with IDA Pro-4-1.doc

Deok9_PE Structure

Microsoft Word - building the win32 shellcode 01.doc

Microsoft PowerPoint - chap05-제어문.pptx

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

슬라이드 1

Computer Architecture

Chapter ...

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

untitled

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

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

example code are examined in this stage The low pressure pressurizer reactor trip module of the Plant Protection System was programmed as subject for

API 매뉴얼

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

Chapter #01 Subject

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

11장 포인터

1

02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C

PowerPoint Presentation

PowerPoint Template

JUNIT 실습및발표

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

17장 클래스와 메소드

PowerPoint 프레젠테이션

T100MD+

슬라이드 1

Microsoft Word - 1. ARM Assembly 실습_xp2.doc

슬라이드 1

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

PowerPoint 프레젠테이션

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

hlogin7

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Transcription:

Debugging Applications By John Robbins Part II 최상호 http://blog.naver.com/tonkex

목차 목차 1 장. Bugs : Where They Come From and how You Solve Them? 2 장. Getting Started Debugging 3 장. Debugging During Coding 4 장. How Do Debuggers Work? 5 장. Power Debugging with the Visual C++ Debugger 6 장. Power Debugging with x86 Assembly Language and the visual C++ Disassembly Window 7 장. Power Debugging with Visual Basic Debugger 8 장. Finding Source and Line Information with Just a Crash Address. 2

목차 목차 9 장. Crash Handlers 10 장. Debugging Windows2000 Services and DLLs That Load into Services. 11 장. Multi-Machine, Multi-process Tracing 12 장. Multi-Threaded Deadlocks 13 장. Automated Testing 14 장. Limited OutputDebugString Calls 15 장. The Debug C Run-Time Library 3

목차 목차 1 장. 버그 : 어디서발생하고어떻게해결할것인가? 2 장. 디버깅시작하기 3 장. 코딩과디버깅병행하기 4 장. 디버거의동작원리 5 장. Visual C++ 디버거를이용한강력한디버깅 6 장. 어셈블리어와 Visual C++ Disassembly 창을이용한강력한디버깅 7 장. Visual Basic 디버거를이용한효과적인디버깅 8 장. Crash 주소만으로소스위치찾아내기 4

목차 목차 9 장. Crash 핸들러 10 장. Windows 2000 서비스와서비스안에서동작하는 dll 디버깅하기. 11 장. Multi-Machine, Multi-process Tracing 12 장. 다중스레드의병목현상 13 장. 테스트자동화 14 장. OutputDebugString 제한하여사용하기 15 장. The Debug C Run-Time Library 5

6 장. 어셈블리어와 Visual C++ Disassembly 창을이용한강력한디버깅 목차 잘돌던프로그램이갑자기죽어버리면서어셈블리어가잔뜩표시된 Visual C++ 디버거가화면에나타나면속수무책이다. 어셈블리어를모르는데디버깅은어림도없다. 그렇다고계속손가락만빨고있어야하나? MSAM 을다루어보자. 필요한내용정도만어셈블리코드를 읽을수있고이해할수있으면된다. 생각보다어렵진않 다. 할수있다, 하면된다, 해보자! 6

6 장. 어셈블리어와 Visual C++ Disassembly 창을이용한강력한디버깅 목차 1. The Basics of the CPU 2. A Word About the Visual C++ Inline Assembler 3. Instructions You Need to Know 4. Calling Conventions 5. More Instructions You Need to Know 6. Common Assembly-Language Constructs 7. A complete Example 8. The Disassembly Window 9. Tips and Tricks 10. Summary 7

6 장. 어셈블리어와 Visual C++ Disassembly 창을이용한강력한디버깅 목차 1. CPU 기초지식 2. Visual C++ 인라인어셈블러 3. 중요명령어 (Instructions) 4. 호출규약 (Calling Conventions) 5. 더알아야할명령어들 8

6-1. CPU 기본지식 배경 Intel이 1978년에발표한 8086 CPU를근간으로지금까지계속어셈블리명령어를사용한다. MS-DOS와 16비트 MS Windows 시절에는세그먼트라고불리는 64KB의메모리블록에접근하는방법이매우까다로웠다. 다행히도 Windows 98이후부터는 CPU가모든번지에직접접근이가능해졌고이는어셈블리어를보다쉽게구현할수있다는것을의미한다. 이장의범위 오직 Intel 과 AMD 모두에공통적인어셈블리명령어만을다룬다. Intel 펜티엄의 MMX 기능들과부동소수점연산명령들은다루지않는다. 참고 Intel, IA-32 Intel Architecture S/W Developer s Manuals 9

6-1. CPU 기본지식 1. Registers 2. Instruction Format and Memory Addressing 10

6-1. CPU 기본지식 1. Registers X86 계열에서의레지스터 (1) 8개의범용레지스터 : EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP (2) 6개의세그먼트레지스터 : CS, DS, ES, SS, FS, GS (3) 1개의플래그레지스터 : EFLAGS (4) 기타특수레지스터 ( 디버그와 machine control을위한 ) General-Purpose Registers 11

6-1. CPU 기본지식 1. Registers ( 보충설명 ) 32bit registers eax : Accumulator ebx : Base register ecx : Count register edx : Double-precision register esi : Source index register edi : Destination index register ebp : Base pointer register esp : Stack pointer Non integer registers eip : instruction pointer flags : flags 12

6-1. CPU 기본지식 1. Registers ( 계속 ) 마우스오른버튼메뉴를이용해서부동소수점관련레지스터를화면에보이게할수있다. 레지스터창에는 Visual C++ 이 Intel과는독자적으로사용하는플래그값들이표시된다. 원래는플래그값이변경되면글자색도변경되는데제대로동작하지않음. 해결책 : 빈문서를열고서레지스터창의내용을복사한후현재의레지스터값들과비교. (-.-) 레지스터의값을직접변경할수있다! 등호연산자오른쪽의숫자의첫머리부분에마우스커서를놓고수정. EFLAGS 레지스터 Visual C++ Registers Window 13

6-1. CPU 기본지식 1. Registers ( 계속 ) Registers Window Flag Values 14

6-1. CPU 기본지식 2. Instruction Format and Memory Addressing 명령어 ( Single Instruction) 명령어 ( Two-Instruction) Source Destination, Source Source 오퍼랜드에는레지스터, 참조메모리, 값등이올수있다. Destination 오퍼랜드에는레지스터, 참조메모리가올수있다. 그러나, Source 와 Destination 오퍼랜드모두에참조메모리가올수는없다. 참조할메모리의크기를지정한다. byte ptr, word ptr, dword ptr 등의크기로지정할수있다. 기본값은 dword ptr 이다. 메모리참조는 [] 을이용한다. Ex1) [0040129Ah] - hex 값으로 004010129 인메모리번지의값을읽는다. Ex2) [EAX] EAX 가가리키는메모리번지의값을읽는다. Ex3) [EAX + 0Ch] EAX 가가리키는메모리번지에 0C 의옵셋을적용한후그위치의값을읽는다. 15

6-1. CPU 기본지식 2. Instruction Format and Memory Addressing ( 계속 ) 레지스터값이참조메모리를가리키는경우 : Memory창에해당레지스터이름을직접입력하여바로그메모리의값을읽을수있다. 메모리를참조방법이잘못된경우 GPF(General Protection Fault) 발생 : 해당메모리영역에대한접근권한이없을때 Page fault : 존재하지않는메모리영역에접근하고자할때. 16

6-2. Visual C++ 인라인어셈블러 배경 인라인어셈블리코드는코드의이식성을떨어뜨리기때문에권장되지않지만특정태스크를수행하기위한유일한방법이되기도한다. 12,14장에 import한함수를후킹하는방법을구현한예제가있다. 인라인어셈블러는프로그램전체를 MASM으로작성하는것과는다르다. 큰붓으로대강그리고그림을확대해서세밀하게마무리하듯이, C++ 로대강의프로그램을작성한후인라인어셈블러로세밀한부분을작성한다. 인라인어셈블러사용예 17

6-2. Visual C++ 인라인어셈블러 인라인어셈블러사용하기 ( 계속 ) asm 키워드를이용한다. 여러개의어셈블러를사용할때에는 { 와 } 로묶어준다. 어셈블러명령어 : NOP (No Operation) Void FunctionOne(void) { asm NOP asm NOP } Void FunctionTwo(void) { asm { NOP NOP } } 두개의함수는동일하다. 18

6-3. 주요명령어 (Instructions) 1. Stack Manipulation 2. Very Common Simple Instructions 3. Common Sequence : Function Entry and Exit 4. Variable Access : Global Variables, Parameters, and Local Variables 5. Calling Procedures and Returning 19

6-3. 주요명령어 (Instructions) 1. 스택 (Stack) 다루기 Intel 이외의 CPU들은여러레지스터에입력파라미터값을전달하지만 Intel CPU는거의대부분의경우스택을사용하여처리한다. 스택은메모리의높은번지에서부터시작하고아래번지로향한다. 스택은 LIFO(Last In, First Out) 구조를갖는다. 즉, 세개의값을차례대로 PUSH 했으면 POP할때에는그반대순서대로꺼내야한다. 20

6-3. 주요명령어 (Instructions) 1. 스택 (Stack) 다루기 ( 계속 ) 스택관련명령어 Instruction Description PUSH word 나 double word 사이즈의값을스택에집어넣는다. POP 스택에서값을꺼내온다. PUSHAD 모든범용레지스터의값들을스택에차례로저장한다. POPAD 스택에서값들을차례로꺼내어모든범용레지스터에저장한다. PUSH 와 POP 명령은현재스택의위치를가리키는 ESP( 스택포인터 ) 를변경시킨다. 즉, PUSH 를하고나면 ESP 값이감소하고, POP 을하면 ESP 값이증가한다. 21

6-3. 주요명령어 (Instructions) 1. 스택 (Stack) 다루기 ( 계속 ) 주로레지스터값, 메모리위치, 값등을 PUSH한다. POP을통해꺼낸데이터는레지스터로들어간다. PUSH와 POP은레지스터의값들을교환할때사용하기도한다. 스택에서꺼내어 EAX 에보관 스택에서꺼내어 EBX 에보관 교환효과 22

6-3. 주요명령어 (Instructions) 2. 기본명령어들 Instruction Description MOV (Move) 값을다른위치로옮기는보편적인방법. SUB ADD INT 3 LEAVE (Subtract) destination 오퍼랜드에서 source 오퍼랜드의값을뺀후 destination 오퍼랜드에저장한다. (Add) source와 destination 오퍼랜드의값을서로더해서 destination 오퍼랜드에저장한다. (Breakpoint) 디버그중단점 (High-level Procedure Call) 함수실행을마치고빠져나오는순간 CPU의상태값들을복원한다. PUSH/POP 대신 MOV 를이용한값교환. 23

6-3. 주요명령어 (Instructions) 3. 일반적인시퀀스 : 함수진입과탈출 함수진입을준비하는 set up과정을 prolog라고하고, 함수를빠져나오는것을 epilog라고하는데이러한과정은컴파일러가자동으로수행한다. Prolog 과정중에는함수의지역변수와파라미터들을스택프레임 (stack frame) 에따로보관하고, EBP 레지스터로하여금스택프레임의위치를가리키도록한다. 스택프레임을사용하는간단한어셈블러예제 24

6-3. 주요명령어 (Instructions) 3. 일반적인시퀀스 : 함수진입과탈출 Prolog과정은디버그 / 릴리즈버전모두동일하게수행된다. 릴리즈빌드에서는가끔 PUSH와 MOV 사이에여러명령어들이흩어져있는것을볼수있는데이는다중파이프라인을구현하는펜티엄계열의 CPU가명령어들을한꺼번에처리하는과정에서임의로변경시키기때문이다. 최적화옵션에따라 EBP를프레임포인터로사용하지않는함수가있다. 그러한함수들은 Frame Pointer Omission (FPO) 데이터를갖는다. Epilog 과정은디버그빌드에서는 MOV/POP을차례로수행하지만릴리즈빌드에서는 LEAVE 명령어 (MOV/POP 명령과동일함 ) 를직접사용한다. x*86 CPU는 prolog에해당하는 ENTER 명령어가있지만 PUSH/MOV/ADD 명령보다느려서컴파일러는이를사용하지않는다. 최적화옵션에따라어셈블러코드가많이달라진다. 크기최적화를수행하면표준적인스택프레임을많이사용하게되고, 속도최적화를수행하면서로얽혀있는 FPO 를생성하게된다. 25

6-3. 주요명령어 (Instructions) 4. 변수 : 전역및지역변수, 파라미터 전역변수의경우고정된메모리번지에대한참조이므로쉽게사용할수있다. 심볼의로드여부에따라어셈블러코드가좀달라진다. Accessing Global Variable 26 The Disassembly Window

6-3. 주요명령어 (Instructions) 4. 변수 : 전역및지역변수, 파라미터 ( 계속 ) 함수가표준스택프레임을갖고있다면 ( 즉, 입력파라미터나지역변수를사용한다면 ) 파라미터는 EBP 레지스터로부터양의옵셋값만큼의위치에있다. 최적화된코드를디버깅할때 ESP 스택포인터로부터양의값만큼떨어진주소번지를참조하고있다면이함수는 FPO 데이터를갖고있는것이다. ESP는함수가실행되는동안계속변하게된다. 따라서파라미터값을잘확인해보아야한다. 반면에, 지역변수는 EBP 레지스터로부터음의값만큼의위치에있다. 27

6-3. 주요명령어 (Instructions) 4. 변수 : 전역및지역변수, 파라미터 ( 계속 ) Accessing Parameter Accessing Local Variable 28

6-3. 주요명령어 (Instructions) 4. 변수 : 전역및지역변수, 파라미터 ( 계속 ) 지역변수와파라미터를다루는함수예제 Prolog SUB 명령은내부지역변수를위한공간을확보한다. 예제의경우 2 개의 int 를위한 8 바이트공간확보. 여기에 double 형지역변수를선언하면 0x10h 공간확보, char a 지역변수를선언하면 4 바이트공간추가. ( 최소공간이 4byte 임 ) Epilog 29

6-3. 주요명령어 (Instructions) 4. 변수 : 전역및지역변수, 파라미터 ( 계속 ) 지역변수와파라미터를다루는함수예제 함수 AccessLocalsAndParamsExample 함수의번지 : 0x00401097 레지스터스택주소스택설명 Prolog 수행이전의레지스터상태 2 개의스택에입력파라미터들이위치하고있다. EBP 는초기화가되지않은상태. 30

6-3. 주요명령어 (Instructions) 4. 변수 : 전역및지역변수, 파라미터 ( 계속 ) 지역변수와파라미터를다루는함수예제 : Prolog 실행중의레지스터상태 31

6-3. 주요명령어 (Instructions) 4. 변수 : 전역및지역변수, 파라미터 ( 계속 ) 지역변수와파라미터를다루는함수예제 : Prolog 실행중의레지스터상태 EBP 를중심으로지역변수는음의값만큼옵셋을, 파라미터는양의값만큼옵셋을갖는다. 32

6-3. 주요명령어 (Instructions) 5. 호출과복귀 (Calling Procedures and Returning) Instruction Description CALL 프로시저를호출한다. RET 프로시저로부터복귀한다. CALL 명령은자신이복귀할메모리주소를스택에저장한다. CALL 명령에대한오퍼랜드는레지스터, 메모리참조, 파라미터, 전역옵셋값등어느것이나상관없다. CALL 명령에프로그램내부의함수를호출할경우에는그함수의메모리주소를바로오퍼랜드로사용한다. 그러나, 외부에서임포트된함수를호출할경우 IAT (Import Address Table) 을통해 imp 라는키워드와함께외부함수를호출한다. RET 명령은스택가장꼭대기에담겨있는메모리주소를이용해함수호출자에게로복귀한다. RET 명령수행시스택의값을체크하지않으므로스택이손상당한경우에는오동작할수도있다. 33

6-3. 주요명령어 (Instructions) 5. 호출과복귀 (Calling Procedures and Returning) 34

6-4. 호출규약 (Calling Conventions) 호출규약이란함수에파라미터를전달하는방법과함수실행후복귀시의스택정리에대한방법을의미한다. 5가지호출규약. 표준호출 ( stdcall) : 호출받은측에서 ( 즉, 함수내에서 ) 스택을정리한다. 따라서 파라미터에대한정확한정보를필요로하므로 printf 함수와같은가변파라미터기반의함수에는적절하지않다. Win32 에서의시스템함수들과 Visual Basic에서의기본함수호출방식이다. C선언호출 ( cdecl) : 호출한측에서스택정리를한다. 가변파라미터처리에적절하다. C/C++ 컴파일러의기본값이다. this 호출 : C++ 코드작성시 this 포인터를쓰게되면자동으로컴파일러가호출한다. fastcall 호출 : CPU와의이식성문제때문에 Win32 유저모드에서는잘쓰이지않는다. naked 호출 : 가상디바이스드라이버 (VxD) 프로그래밍시 prolog와 epilog를직접다루고자할때사용한다. < 참고 > pascal 호출 : stdcall 과같지만왼쪽부터스택에 push하는점이다르다. WIN32 API에서는더이상쓰이지않는다. 35

6-4. 호출규약 (Calling Conventions) 1 36

6-4. 호출규약 (Calling Conventions) Calling 예제 : 함수선언및정의 함수선언 함수정의 37

6-4. 호출규약 (Calling Conventions) Calling 예제 : Main 문에서의함수호출 Caller 가스택을정리한다. 38

6-4. 호출규약 (Calling Conventions) Calling 예제 : 함수실행 RET 명령실행하면서해당스택을바로정리한다. 39

6-4. 호출규약 (Calling Conventions) Calling 예제 : 함수실행 ( 계속 ) 40

6-5. 더알아야할명령어 1. Data Manipulation 2. Pointer Manipulation 3. Comparing and Testing 4. Jump and Branch Instructions 5. Looping 6. String Manipulation 41

6-5. 더알아야할명령어 1. Data Manipulation Instruction Description Instruction Description AND 논리곱비트연산 OR 논리합비트연산 NOT 1의보수, 비트의반전 NEG 2의보수, 0에서오퍼랜드값을뺀것과같다. XOR 논리배타합, 각비트가서로같으면 0 이되는성질을이용하여 XOR EAX,EAX 을실행하면 MOV EAX,0 보다빠르게수행한다. MS 의컴파일러는레지스터를 0 으로초기화하는데이명령어를사용. INC 1을증가, 증가연산자에대응됨. DEC 1을감소, 감소연산자에대응됨. SHL 왼쪽으로이동, 2를곱한것과같다. SHR 오른쪽으로이동, 2를나눈것과같다. DIV 부호없는나눗셈 MUL 부호없는곱셈 IDIV 부호있는나눗셈 IMUL 부호있는나눗셈 LOCK 내용보충필요 MOVSX Move with sign-extend MOVZX Move with zero-extend 42

6-5. 더알아야할명령어 1. Data Manipulation ( 계속 ) DIV,MUL 계산은 EAX 레지스터에서수행하고그결과는 EDX 레지스터를사용한다. DIV 명령은나머지값을 EDX 레지스터에, 몫을 EAX 레지스터에보관한다. IDIV, IMUL 부호있는숫자를다루는것외에는 DIV, MUL 명령과동일하게처리한다. IMUL 명령은세개의오퍼랜드를갖기도하는데첫번째는 destination, 나머지두개의오퍼랜드는 source 로사용한다. X86 CPU 에서세개의오퍼랜드로동작하는유일한명령어. LOCK 실제명령어는아니고다른명령어를실행하기위한준비를한다. LOCK 명령은다음에오는명령어가메모리를 atomic operation 할것임을알려준다. 따라서, CPU 는메모리버스에 lock 을걸어다른곳에서접근못하도록막는다. MOVSX, MOVZX 이명령어들은작은숫자들을큰공간에복사할때비어있는상위비트들을어떻게채우는가에따라구분된다. MOVSX 명령어는빈공간들을부호값으로채우고, MOVZX 는 0 으로채운다. 43

6-5. 더알아야할명령어 1. Data Manipulation ( 계속 ) NOT, NEG 명령어 초기화시킨 EAX 와 EBX 레지스터 NOT 명령을실행시킨이후의레지스터 NET 명령을실행시킨이후의레지스터 44

6-5. 더알아야할명령어 2. 포인터조작 Instruction Description LEA Load effective address 45

6-5. 더알아야할명령어 2. 포인터조작 ( 계속 ) 예제 ival 변수의번지값을 EAX 레지스터에담는다. 결국, pint = &ival 과같은구문이된다. 46

6-5. 더알아야할명령어 3. Comparing and Testing Instruction Description CMP 두개의오퍼랜드를비교한다. TEST Logical compare CMP 명령어 첫번째오퍼랜드로부터두번째오퍼랜드값을뺀결과값에따라 EFLAGS 레지스터내의플래그값들을설정한다. 주로 C 언어의 if 문의조건분기시에사용된다. 결과에따른플래그설정은다음의표와같다. TEST 명령어 오퍼랜드에대한논리비트연산 AND 를수행하여그결과를가지고서 PL,ZR, PE 플래그들을설정한다. 주로비트값이설정되었는지확인할때사용된다. 47

6-5. 더알아야할명령어 4. 점프, 분기명령어 (Jump and Branch Instructions) Instruction Description Instruction Description JMP 절대번지위치로점프 JE 만약같으면점프 JNE 만약같지않으면점프 JL 만약작으면점프 JG 만약크면점프 JLE 만약작거나같으면점프 JGE 만약크거나같으면점프 JA Jump if Above JBE Jump if below or equal JC Jump if carry JNC Jump if Not carry JNZ Jump if not 0 JZ Jump if 0 48

6-5. 더알아야할명령어 4. 점프, 분기명령어 ( 계속 ) 예제 49

6-5. 더알아야할명령어 5. Looping Instruction Description LOOP ECX 레지스터값만큼루프를실행한다. LOOP 명령어 ECX 레지스터에루프횟수를지정하고, 실행하면지정된코드블록이계속실행된다. 루프를실행할때마다 ECX 값이하나씩감소한다. 50

6-5. 더알아야할명령어 5. Looping ( 계속 ) 51

6-5. 더알아야할명령어 6. 문자열조작 (String Manipulation) Instruction Description Instruction Description MOVS 문자열에서문자열로데이터를이동 SCAS Scan string STOS 문자열을저장 CMPS 문자열들을비교 REP ECX 값만큼반복 REPE Repeat while equal or ECX count isn t 0 REPNE Repeat while not equal or ECX count isn t 0 Intel CPU 는문자열조작에능하다. 이는 CPU 가단일명령어로커다란메모리덩어리를잘조 작한다는것을의미한다. MOVS 명령어 ESI 가가리키는번지의값을 EDI 의번지로이동시킨다. C 언어의 memcpy 와같다. ESI 에서 EDI 로의이동이끝나면 ESI,EDI 레지스터는 EFLAGS 레지스터의 UP 플래그의값이 0 이면증가하고, 1 이면감소한다. 증감량은옮기는데이터가바이트단위이면 1 만큼, 워드단위이면 2 만큼, 더블워드이면 4 만큼변화한다. 52

6-5. 더알아야할명령어 6. 문자열조작 ( 계속 ) SCAS 명령어 EDI가가리키는번지의값과 AL,AX 또는 EAX의번지값을비교한다. NULL문자에대해서실행하면 C언어의 strlen 과유사한기능을수행한다. 명령수행후자동으로 EDI 레지스터값을증가 / 감소시킨다. STOS 명령어 AL,AX 또는 EAX의번지값을 EDI의번지에저장한다. C 언어의 memset 과유사하다. 명령수행후자동으로 EDI 레지스터값을증가 / 감소시킨다. CMPS 명령어 두개의문자열을비교하고 EFLAGS 레지스터의값을설정한다. SCAS 명령이문자열을하나의문자와비교하는것에비하여 CMPS 명령은두개의문자열에대하여수행한다. C 언어의 memcmp 와유사하다. 두개의문자열의길이가다르더라도자동으로길이를조정하여수행한다. 53

6-5. 더알아야할명령어 6. 문자열조작 ( 계속 ) 구현예 : SCAS 54

6-5. 더알아야할명령어 6. 문자열조작 ( 계속 ) 구현예 : CMPS 55

6-5. 더알아야할명령어 6. 문자열조작 ( 계속 ) 구현예 : REP 56

6-6. Common Assembly-Language Constructs 1. FS Register Access 2. Structure and Class References 57

6-6. Common Assembly-Language Constructs 1. FS Register Access 설명 WIN32 OS 에서 FS 레지스터는 TIB (Thread Information Block) 라고불리는 Thread Environment Block (TEB) 의포인터정보를담고있는특별한레지스터이다. TIB 에는 SEH (Structured Exception Handling) chain 정보들과 TLS (Thread Local Storage) 및기타정보들이담겨있다. TIB 는특정메모리영역에위치하는데 OS 는 FS 레지스터에선형번지수의옵셋만큼을더하여 TIB 에접근한다. 디스어셈블창에서 FS 레지스터를조작하는명령어를만났다면 SHE 프레임을생성 / 소멸하거나 TIB 에접근하거나 TLS 에접근하는동작이진행중인것이다. (1) Creating or Destroying an SHE frame (2) Accessing TIB (3) Accessing Thread Local Storage 내용추가필요 58

6-6. Common Assembly-Language Constructs 2. Structure and Class References Structure 나 class 는고수준언어에서사용자가만들어서사용하는 ADT (Abstract Data Type) 이지만어셈블리어에서는이러한개념이없다. 컴파일러는 structure나 class에서선언한대로메모리영역을확보하고단지메모리영역에서옵셋값만으로내부데이터에접근한다. X86 CPU에서는 4 또는 8 바이트씩증가시켜메모리의크기를일정하게유지하기도한다. Structure와 class에대한참조는레지스터와메모리옵셋으로표현된다. 59

6-6. Common Assembly-Language Constructs 2. Structure and Class References ( 계속 ) 예제 60

6-7. A complete Example WIN32 lstrcpya API 함수의어셈블리코드 파일참조 61

6-8. The Disassembly Window 1. Navigating 2. Viewing Parameters on the Stack 3. The Set Next Statement Command 4. The Memory Window and the Disassembly Window 62

6-8. The Disassembly Window 1. 둘러보기 Ctrl + G 단축키를이용해 Go To 대화상자를띄운다. 번지나함수이름을입력하면바로그위치로이동한다. 그러나, 심볼이름의경우이름장식의규칙을준수해서표현해야한다. Ex) LoadLibrary 함수 : {,,kernel32}_loadlibrarya@4 로입력한다. Disassemby 창에서현재진행위치를놓치게되면마우스오른버튼을눌러 Show Next Statement 명령을실행한다. 63

6-8. The Disassembly Window 2. 스택내의파라미터값보기 메모리창에스택포인터레지스터인 ESP 라고입력한다. 메모리창내에서마우스오른버튼을눌러 Long Hex Format 메뉴를선택한다. 스택의가장위에는함수복귀주소가있고그다음에는함수의파라미터들이들어있다. ( 함수입력파라미터들은오른쪽위치에서부터스택에저장되고스택은계속감소하는것을기억하자 ) 메모리창의번지값을드래그하여 Watch 창에서값을확인해볼수있다. 특히스트링의경우 (char *)0x10203f 의형식으로입력하면더쉽게확인이가능하다. 함수실행중간에파라미터를보고자할경우에는 EBP에양의값의옵셋을적용하는등의좀번거로운과정을거친다. 64

6-8. The Disassembly Window 3. 다음구문으로설정하기 (Set Next Statement) 명령 이명령을실행하면 EIP 레지스터값을변경하여특정위치에서실행토록한다. 소스윈도우에서사용하는것은손쉬운일이지만 Disassembly 창에서실행할때에는스택의상태에주의해야한다. 65

6-8. The Disassembly Window 4. 메모리창과역어셈블리창 어셈블리명령은메모리상에서수행되고, 메모리는어셈블리명령에영향을미치미로메모리창과역어셈블리창은늘두개를함께관찰하도록한다. 이진파일실행시 Crash가발생하면모듈목록창을띄운후번지수를확인한다. 스택에나열된번지의목록들과이값과비교하면서정확한위치를찾는다. 메모리창에서 ESP 를입력하여스택포인터의값을확인한다. 모듈목록에표시된번지와유사한값이있으면역어셈블리창으로드래그하여정확한실행함수를찾는다. 메모리창은 255자이상의스트링을확인할수있는유일한창이지만한번에조금씩밖에확인할수없다. 메모리창에서마우스오른버튼을이용해보기형식을변경하면창의첫번지가변경된다. 66

6-9. 팁과꼼수 1. Endians 2. Garbage Code 3. Registers and the Watch Window 4. Learn from ASM Files 67

6-9. 팁과꼼수 1. Endians CPU 내부에서바이트배열순서에따라다른이름으로불리운다. 인텔 CPU는뒷자리바이트가메모리에먼저배치되는 Little Endian 방식을사용한다. 즉, 0x1234 값은메모리에 0x34 0x12 의순서대로저장된다. 그러므로, 메모리창을이용한디버깅시에는 리틀인디언 저장방식을늘유념해야한다. 68

6-9. 팁과꼼수 2. 쓰레기코드 Crash 가발생해서역어셈블리창으로디버깅작업을시작하기전에진짜수행코드부분의메모리를보고있는지먼저확인해야한다. 다음의팁을이용하자. (1) 역어셈블리창에서마우스오른버튼으로 Code Bytes 메뉴를선택해서보는것이 OP코드를찾는데더도움이된다. (2) 계속적으로 ADD BYTE PTR[EAX] 명령을보게되면아마도 0의값이있는엉뚱한곳을보고있을수있다. (3) 심볼이있고그심볼에 0x1000 을넘는매우큰값의옵셋이더해졌다면아마도코드섹션을벗어난곳을보고있는것이다. 하지만매우큰옵셋값은심볼이없는모듈을디버깅하고있다는것을나타내기도한다. (4) 이장에서다루지않았던여러어셈블리명령어가계속나온다면아마도데이터영역을보고있는것이다. (5) Visual C++ 디버거가심볼을역어셈블하지못하는경우에는??? 라고화면에표시한다. 69

6-9. 팁과꼼수 3. 레지스터와 Watch 창 Watch 창에레지스터이름을직접입력하여값을확인해볼수있다. 예를들어스트링관련조작명령코드를보고있다면 Watch 창에 (char *)@EDI 라고입력하면훨씬손쉽게데이터를확인할수있다. 70

6-9. 팁과꼼수 4. ASM 파일생성 Project 옵션의 C++ 탭에 /FAs 라고입력하면확장자가 asm 인파일이생성된다. 이파일은 MASM에의해바로컴파일될수있는형태로존재한다. 71

6-10. 요약 1. 72

7 장. Visual Basic 디버거를이용한강력한디버깅 목차 1. Visual Basic P-Code 2. Error Trapping : Break In or Break Out Option 3. Visual Basic Debugger Window 4. Tip and Tricks 5. Summary 73

7-1. Visual Basic P- 코드 1. A P-code History Lesson 2. Ramification of P-Code 74

7-2. Error Trapping : Break In or Break On Option 1. Break On All Errors 2. Break On Unhandled Errors 3. Break In Class Modules 4. A Final Plea for Decent Error Trapping 75

7-3. Visual Basic Debugger Windows 1. The Local Window 2. The Immediate Window 3. The Watch Window 76

7-4. Tips and Tricks 1. Add the run To Cursor Button to the Debugger Toolbar 2. Avoid Compile On Demand 3. Group Projects Are the Way to Go for Debugging 4. Visual Basic Debugging and Reality Might Conflict 77

8 장. Crash 주소만으로소스위치정보찾아내기 목차 1. MAP 파일생성및읽기 2. CrashFinder 사용하기 3. CrashFinder 다음에는? 4. 요약 프로그램은비정상종료를하면서 Crash 주소만을남긴다. Dr. Watson 의로그를확인해도마찬가지이다. 결국 Crash주소를가지고서해당소스파일과위치를알아내야하는것이다. 여기에위치를찾는두가지방법을소개한다. 78

8-1. MAP 파일생성및읽기 1. 설명 2. MAP 파일의내용 3. 함수이름, 소스파일, 라인위치찾아내기 79

8-1. MAP 파일생성및읽기 1. 설명 MAP 정보파일만이전역심볼, 소스파일, 라인위치등의정보를담고있는유일한 텍스트형태로저장하고있다. Visual C++ 에서 MAP 정보파일만들기 (1) Project Setting 창의 Link 탭에 /MAPINFO:EXPORT 와 /MAPINFO:LINES 라고입력한다. (2) Debug 카테고리선택후 Generate Mapfile 옵션을선택한다. (3) 기본적으로 Map 정보파일은중간단계파일들이생성되는폴더에생기므로이를최종파일이생성되는폴더로변경하는것이좋다. 즉, $(OUTDIR)\<project>.MAP 이라고에디트박스에입력한다. 여기서 (OUTDIR) 이해당실행파일이위치할폴더이름이다. Visual Basic 에서 MAP 정보파일만들기 내용추가필요심볼테이블의변경을제대로추적하기위해늘 PDB 파일을저장하자. 80

8-1. MAP 파일생성및읽기 1. 설명 ( 계속 ) 81

8-1. MAP 파일생성및읽기 2. MAP 파일의내용 MapDll.map 파일 (1) 모듈이름 (2) 생성시간 (3) 로드될주소 (4) 섹션정보 함수이름 함수실행주소 (5) 공용함수정보 82

8-1. MAP 파일생성및읽기 2. MAP 파일의내용 ( 계속 ) MapDll.map 파일 ( 계속 ) (1) 소스라인정보 소스라인번호 코드섹션의시작위치 에서의옵셋 (5) 외부노출함수 83

8-1. MAP 파일생성및읽기 3. 함수이름, 소스파일, 라인위치찾아내기 예제 : MapEXE.exe, Crash 발생주소 : 0x03901099 84

8-1. MAP 파일생성및읽기 3. 함수이름, 소스파일, 라인위치찾아내기 ( 계속 ) (1) Crash 주소가로드될주소 (0x3900000) 과공용함수섹션의마지막번지 (0x03905098) 안에있으면 map 파일을제대로선택한것이다. (2) Crash 발생한함수를알기위해 Crash 주소보다작은첫번째함수를찾는다. (0x03901076 번지의?MapDLLHappyFunc@@YAPADPAD@Z 함수 ) 85

8-1. MAP 파일생성및읽기 3. 함수이름, 소스파일, 라인위치찾아내기 ( 계속 ) (3) 함수의정확한이름을알기위해 UNDNAME.EXE 를이용한다. ( 함수이름앞의? 는 C++ 형식의이름장식을쓴것이다.) 실행후문제의함수가 MapDLLHappyFunc 인것을알았다. 86

8-1. MAP 파일생성및읽기 3. 함수이름, 소스파일, 라인위치찾아내기 ( 계속 ) (4) 정확한 Crash 주소를알기위해다음의식으로계산해낸다. (Crash 주소 ) ( 로드될주소 ) 0x1000 모든번지는항상코드섹션의시작위치에서의옵셋값인것을기억하자. 코드섹션의시작위치가곧이진파일의시작위치는아니다. 실제이진파일의시작위치는 PE (Portable Executable) 의헤더인 0x1000 이다. 그러므로, 0x3901099 0x3900000 0x1000 = 0x99 가실제 Crash 위치인것이다. (5) 라인정보섹션에서옵셋값을반영한 Crash 주소에가장가까운값을찾는다. 가장가까운 0001:00000096 인 38 번째라인이해당위치가된다! 87

8-2. CrashFinder 사용하기 1. 충돌주소찾아가기 매번 MAP파일을읽어라인위치찾기는어렵지는않으나귀찮은일이다. 또한, QA 팀이나기술지원팀, 관리자가 MAP파일을뒤진다는것은 적합하지않다. 이러한문제점을해결코자저자는 CrashFinder를제작함. CrashFinder 유틸리티는충돌 (Crash) 주소를함수이름, 소스파일, 라인번호로변환시켜서보여준다. CrashFinder를팀에서사용할때, 실행바이너리파일과 PDB파일을보관하는것이매우중요하다. (CrashFinder는실행파일의위치외에는어떠한정보도따로저장하지않는다 ) 88

8-2. CrashFinder 사용하기 2. CrashFinder 살펴보기 실행파일과관련 dll 관련심볼이제대로로드되었음. 선택된모듈에대한세부설명 89

8-2. CrashFinder 사용하기 3. CrashFinder 사용하기 실행파일등록하기 (1) File 메뉴 -> New (2) Edit 메뉴 -> Add Image CrashFinder 는프로젝트에대해서하나의실행파일만을지원한다. 따라서, 여러개 의실행파일로이루어진프로그램을실행할때에는각각의실행파일에대하여독립 적은 CrashFinder 프로젝트를만들어야한다. (CrashFinder 는 MDI 구조를갖는다.) dll 파일을프로젝트에추가시키면, CrashFinder 는먼저기존의다른 dll 파일들과의 load 될번지와의충돌여부를확인하고이를적절한번지로변경한다. 언제든지 Edit 메뉴 -> Image Properties 항목을통해 load 번지를변경할수있다. 90

8-2. CrashFinder 사용하기 3. CrashFinder 사용하기 ( 계속 ) 충돌주소를확보한후 Edit 메뉴-> Find Crash 대화상자를실행시켜충돌주소를입력한다. CrashFinder는관련정보를대화상자에표시한다. 91

8-2. CrashFinder 사용하기 4. 구현상의기술 (1) 심볼엔진 CrashFinder 는심볼엔진 DBGHELP.DLL 를사용한다. 심볼엔진으로하여금 SYMOPT_LOAD_LINES 플래그를설정하여강제적으로모든소스파일과라인정보를 load 하도록명시적으로명한다. (2) CrashFinder 내의어느부분에서일이진행되는가 내용추가필요 (3) 데이터아키텍처 내용추가필요 92

8-3. CrashFinder 다음에는? 4. 다음의기능들을더추가해보자. (1) 종속 dll들을자동으로추가하자. (2) 에디트컨트롤에좀더많은정보를보여주자. (3) Dll 목록을붙여넣기하면자동으로 dll 들을프로젝트에추가하자. 93

8-4. 요약 94

9 장. Crash Handlers 목차 1. Structured Exception Handling vs. C++ Exception Handling 2. The SetUnhandledExceptionFilter API Function 3. Using the CrashHandler API 4. Translating EXCEPTION_POINTERS Structures 5. Summary 프로그램이갑자가비정상종료를하며에러메시지박스를화면에띄우면사용자는열받는다. 무성의한에러메시지보다는개발자가받아볼수있도록여러가지관련정보를입력할수있는커스텀화한대화상자를띄울수있다면? Crash Handler는 Exception Handler와 Unhandled exception filter를이용하여이러한기능을구현한다. Exception Handler는 C++ 에의존적인기능이고 Unhandled Exception Filter는 Visual C++ 과 Visual Basic에모두사용가능하다. 95

9-1. 구조화된예외처리와 C++ 예외처리 1. 개요 2. 구조화된예외처리 (SEH) 3. C++ 예외처리 4. SHE와 C++ 예외처리를조합하여사용하기 96

9-1. 구조화된예외처리와 C++ 예외처리 C++ 에서사용할수있는 2 가지예외처리방법 (1) OS 에서제공하는구조화된예외처리 (SEH) 기능 (2) C++ 언어에서제공하는예외처리기능 두가지기능을조합하여사용할수는있지만명확하게다른특징들을갖는다. 그럼, 두가지기능의유사점과차이점및조합하여사용할때의문제점들을살 펴보자. 97

9-1. 구조화된예외처리와 C++ 예외처리 1. 개요 2. 구조화된예외처리 (SEH) 3. C++ 예외처리 4. SHE와 C++ 예외처리를조합하여사용하기 98

9-1. 구조화된예외처리와 C++ 예외처리 ( 계속 ) 접근위반 (Access violation) 등과같은 Crash 상황에서 OS는 SEH 기능을제공한다. SEH는언어에비종속적이지만대부분 C++ 에서 try 와 except, try와 finally 로짝을이루어사용한다. try/ except 구문의사용 : 코드를 try 블록안에입력하고 exception handler에해당하는 except 블록에예외처리코드를입력한다. finally 구문의경우함수실행을종료할때항상그블록안의내용이실행된다. 예 : exception filter 99

9-1. 구조화된예외처리와 C++ 예외처리 ( 계속 ) Exception Filter EXCEPTION_EXECUTE_HANDLER : try 블록안에서예외가발생할때마다 except 블록으로진입하여코드를실행한다. EXCEPTION_CONTINUE_EXECUTION : 예외발생을무시한다. EXCEPTION_CONTINUE_SEARCH : 예외가발생하면상위블록의다음 except 블록으로진입한다. Unwinding the exception ( 예외발생시스택되감기 ) 함수의호출이계속될때마다예외핸들러가내부의스택에쌓이게된다. 일단예외상황이발생하면 OS는실제예외처리구문이나올때까지스택에서하나씩꺼내면서계속찾는다. 스택을모두되감아서 ( 하나씩모두꺼낸후 ) 최종예외처리코드수행하고나서 Application Error 대화상자를표시한다. 100

9-1. 구조화된예외처리와 C++ 예외처리 ( 계속 ) 101

9-1. 구조화된예외처리와 C++ 예외처리 ( 계속 ) GetExceptionCode 함수 예외발생시의예외값을알고자할때사용. Exception filter안에서만사용가능하다. 예. divide by zero (NaN) 오류이면 EXCEPTION_EXECUTE_HANDLER 를실행하고그렇지않으면 EXCEPTION_CONTINUE_SEARCH 를실행한다. 102

9-1. 구조화된예외처리와 C++ 예외처리 ( 계속 ) GetExceptionInformation 함수 적절히예외를처리하고그결과를예외필터값으로리턴하는고유의함수를만들어예외필터안에서사용할수도있다. 또, GetExceptionInformation 함수를예외필터안에서사용할수도있다. GetExceptionInformation 함수는 EXCEPTION_POINTER 구조체의포인터를리턴한다. EXCEPTION_POINTER 구조체에는예외가발생하여 Crash된이유와그당시의 CPU의상태들에대한모든정보가들어있다. RaiseException 함수 독자적으로예외를발생시킬수있으며다중으로내포된구문에서빨리빠져나올때사용하기도한다. RaiseException 함수를사용하여빠져나오는것이기존의 set_jmp 나 longjmp 함수를이용하는것보다명확하다. 103

9-1. 구조화된예외처리와 C++ 예외처리 ( 계속 ) SEH 사용상의제약 1. 사용자고유의에러코드를사용하더라도하나의 unsigned integer 형태만가능하다. 2. C++ 과혼용하여사용하기가까다롭고, C++ 과분별없이사용하게되면컴파일러가불평을하게된다. 특히, SEH 스택되감기중에는스택내의 C++ 객체의소멸자를호출하지않기때문에메모리 leak등여러문제가발생할수있다. 참고 A Crash Course on the Depths of Win32 Structured Exception Handling, MSJ January 1997. Book, Programming Applications for Microsoft Windows, by Jeffrey Richter, Microsoft Press, 1999. MSDN, SEH in x86 Environment. MSDN, Exception Handling Topics (SHE) 104

9-1. 구조화된예외처리와 C++ 예외처리 ( 계속 ) 1. 개요 2. 구조화된예외처리 (SEH) 3. C++ 예외처리 4. SHE와 C++ 예외처리를조합하여사용하기 105

9-1. 구조화된예외처리와 C++ 예외처리 ( 계속 ) C++ 예외처리는 C++ 언어에서지원하는 try, catch, throw 명령에의해구현된다. SEH 에러코드가부호없는정수형으로제한된반면에 C++ 예외처리에서는클래스를포함한다양한형을지원한다. MFC 라이브러리의 Cexception 기본클래스는상속개념을이용하도록한다. 그러나 C++ 예외처리는다음의단점을갖는다. 1. 사용자프로그램의 Crash를자동으로처리하지않는다. 2. try/catch 구문을구현하는데비용이많이들어성능상좋지않은영향을미친다. 106

9-1. 구조화된예외처리와 C++ 예외처리 ( 계속 ) 예. MFC 의 CFile 클래스의 read 부분 107

9-1. 구조화된예외처리와 C++ 예외처리 ( 계속 ) 1. 개요 2. 구조화된예외처리 (SEH) 3. C++ 예외처리 4. SEH와 C++ 예외처리를조합하여사용하기 108

9-1. 구조화된예외처리와 C++ 예외처리 ( 계속 ) SEH와 C++ 예외처리를함께사용하려면.. 사용자코드내에서는 C++ 예외처리를이용해야한다. C 런타임라이브러리함수중에 _set_se_translater 함수가구조적예외가발생했을때에 C++ 예외를 throw할수있도록 translator 함수를설정한다. 109

9-2. 구조화된예외처리 (SEH) GetExceptionCode 함수 예외발생시의예외값을알고자할때사용. Exception filter안에서만사용가능하다. 예. divide by zero (NaN) 오류이면 EXCEPTION_EXECUTE_HANDLER 를실행하고그렇지않으면 EXCEPTION_CONTINUE_SEARCH 를실행한다. 110

Th End! 감사합니다. 111 최상호 http://blog.naver.com/tonkex Sangho.0529@gmail.com