Windows Debugging
도서명:Windows Debugging
저자/출판사:최바울,이태화,김희준,김성현/에이콘출판
쪽수:1096쪽
출판일:2019-01-02
ISBN:9791161752228
목차
1장. WinDbg에 대해
__1.1 WinDbg란
____1.1.1 WinDbg의 주요 기능
____1.1.2 WinDbg의 용도
____1.1.3 WinDbg와 SoftICE
__1.2 WinDbg 디버깅의 종류
____1.2.1 유저모드 디버깅과 커널모드 디버깅
________1.2.1.1 유저모드 디버깅
________1.2.1.2 커널모드 디버깅
____1.2.2 라이브 디버깅과 덤프 디버깅
________1.2.2.1 라이브 디버깅
________1.2.2.2 덤프 디버깅
____1.2.3 유저 덤프와 커널 덤프
________1.2.3.1 유저 덤프
________1.2.3.2 커널 덤프
__1.3 WinDbg 디버깅 용어
____1.3.1 디버거와 디버기
____1.3.2 블루스크린
____1.3.3 버그체크
____1.3.4 디버그 심볼 파일
________1.3.4.1 비주얼 스튜디오 2017에서 MyApp 속성 설정
________1.3.4.2 비주얼 스튜디오 2017에서 MyDrv 속성 설정
________1.3.4.3 비주얼 스튜디오 2015에서 MyApp 속성 설정
__1.4 WinDbg 지원 범위
____1.4.1 윈도우 NT 계열 운영체제
____1.4.2 64비트 지원
__1.5 WinDbg 명령
____1.5.1 WinDbg 명령이란
________1.5.1.1 일반 명령
________1.5.1.2 메타 명령
________1.5.1.3 확장 명령
____1.5.2 명령줄 구분
____1.5.3 명령별 사용 조건
__1.6 실습 환경 구성
____1.6.1 WinDbg 다운로드
____1.6.2 비주얼 스튜디오 2017과 WDK 설치
____1.6.3 Windows SDK로 WinDbg만 설치
____1.6.4 WinDbg 버전
____1.6.5 예제 구성
__1.7 정리
2장. WinDbg 시작하기
__2.1 유저모드 라이브 디버깅
____2.1.1 WinDbg 실행
____2.1.2 디버거 연결
________2.1.2.1 WinDbg에서 MyApp.exe 실행하기(디버거에서 디버기 실행하기)
________2.1.2.2 실행 중인 MyApp.exe에 WinDbg 붙이기(디버거를 디버기에 붙이기)
________2.1.2.3 MyApp.exe 실행 중 문제가 발생했을 때 자동으로 WinDbg 실행하기
____2.1.3 심볼 파일 로드
________2.1.3.1 운영체제 심볼 경로 설정과 로드
________2.1.3.2 MyApp.exe 심볼 경로 설정과 로드
____2.1.4 실행 및 정지
____2.1.5 브레이크 포인트 설정과 해제
________2.1.5.1 브레이크 포인트 설정
________2.1.5.2 브레이크 포인트 해제
____2.1.6 콜 스택 확인
____2.1.7 소스 연결해서 소스 창 열기
____2.1.8 Trace, Step으로 진행
____2.1.9 지역변수 확인
____2.1.10 와치 창으로 전역변수 확인
__2.2 커널모드 라이브 디버깅
____2.2.1 디버거 시스템을 디버기 시스템에 붙이기
________2.2.1.1 가상머신 연결
________2.2.1.2 VirtualKD로 연결
________2.2.1.3 네트워크로 연결
________2.2.1.4 시리얼 케이블로 연결
________2.2.1.5 IEEE 1394(firewire) 케이블로 연결하기
________2.2.1.6 운영체제별 디버기 설정
____2.2.2 MyDrv.sys 드라이버 실행
____2.2.3 정지 및 실행
____2.2.4 심볼 파일 로드
____2.2.5 브레이크 포인트 설정과 해제
____2.2.6 콜 스택 확인.
____2.2.7 소스 연결해서 소스 창 열기
____2.2.8 Trace, Step으로 진행
____2.2.9 지역변수 확인
____2.2.10 전역변수 확인
__2.3 정리
3장. WinDbg로 디버깅하기
__3.1 유저모드 덤프 디버깅
____3.1.1 덤프 파일 수집
________3.1.1.1 윈도우 10에서 덤프 파일 수집
________3.1.1.2 윈도우 XP에서 덤프 파일 수집
____3.1.2 덤프 파일 열기
____3.1.3 모듈 정보 보기
____3.1.4 심볼 맞추기
____3.1.5 콜 스택 보기
________3.1.5.1 콜 스택 창에서 마지막 함수 살펴보기
________3.1.5.2 문제가 발생한 이유 추측하기
____3.1.6 로컬 창으로 변수 보기
________3.1.6.1 죽은 함수를 호출한 함수 살펴보기
________3.1.6.2 문제가 발생한 이유 분석하기
________3.1.6.3 수정 방법 찾기
____3.1.7 와치 창으로 메모리 보기
____3.1.8 메모리 창으로 메모리 보기
____3.1.9 프로세스와 스레드 보기
__3.2 커널모드 덤프 디버깅
____3.2.1 덤프 파일 수집
____3.2.2 덤프 파일 열기
____3.2.3 !analyze -v 메시지 보기
____3.2.4 모듈 정보 보기
____3.2.5 심볼 맞추기
____3.2.6 콜 스택 보기
________3.2.6.1 콜 스택 창에서 마지막 함수 살펴보기
________3.2.6.2 죽은 이유 추측하기
____3.2.7 로컬 창으로 변수 보기
________3.2.7.1 죽은 함수를 호출한 함수 살펴보기
________3.2.7.2 문제가 발생한 이유 분석하기
________3.2.7.3 수정 방법 찾기
____3.2.8 와치 창으로 메모리 보기
____3.2.9 메모리 창으로 메모리 보기
__3.3 정리
4장. 유저모드 디버깅 케이스 스터디
__4.1 기본 케이스 스터디
____4.1.1 잘못된 메모리 사용
____4.1.2 프로세스의 CPU 사용률이 100%를 기록할 때
________4.1.2.1 프로세스 익스플로러를 이용한 방법
________4.1.2.2 성능 모니터를 이용한 방법
________4.1.2.3 WinDBG를 이용한 방법
____4.1.3 데드락이 발생해 멈춘 경우
________4.1.3.1 이벤트 찾기
________4.1.3.2 크리티컬 섹션 찾기
____4.1.4 핸들 누수
________4.1.4.1 작업 관리자로 누수 확인
________4.1.4.2 성능 모니터로 누수 확인
________4.1.4.3 성능 로그를 통해 누수 확인
________4.1.4.4 프로세스 익스플로러를 이용한 핸들 누수 찾기
________4.1.4.5 WinDbg로 핸들 누수 찾기
____4.1.5 메모리 누수
________4.1.5.1 작업 관리자로 누수 확인
________4.1.5.2 성능 모니터로 누수 확인
________4.1.5.3 UMDH로 확인
____4.1.6 버퍼 오버플로우
__4.2 어셈블리와 스택의 이해
____4.2.1 어셈블리 기초
____4.2.2 스택의 이해
____4.2.3 호출 규칙
____4.2.4 64비트 스택의 이해
________4.2.4.1 64비트 콜 스택 추적
________4.2.4.2 64비트 콜 스택에서 파라미터 찾기
__4.3 고급 케이스 스터디
____4.3.1 예제 1: 잘못된 파라미터 전달
____4.3.2 예제 2: Drwtsn32 로그 파일 분석
____4.3.3 예제 3: MAP 파일을 이용한 분석
____4.3.4 윈도우 에러 리포트
__4.4 WinDbg Preview
____4.4.1 WinDbg Preview 설치
____4.4.2 WinDbg Preview Time Travel Debugging
__4.5 정리
5장. 커널모드 디버깅 케이스 스터디
__5.1 기본 케이스 스터디
____5.1.1 BugCheck 0x50
____5.1.2 BugCheck 0xD6
____5.1.3 BugCheck 0xC1
____5.1.4 BugCheck 0xC4-60
____5.1.5 BugCheck 0xCE
____5.1.6 BugCheck 0x7F
____5.1.7 BugCheck 0xD1
____5.1.8 BugCheck 0xF7
____5.1.9 커널모드 행 디버깅
____5.1.10 커널모드 데드락 디버깅
__5.2 고급 케이스 스터디
____5.2.1 BugCheck 0xA(분석 가능한 예제)
________5.2.1.1 윈도우 XP에서 분석
________5.2.1.2 윈도우 10에서 분석
____5.2.2 BugCheck 0xA(분석 불가능한 예제)
____5.2.3 BugCheck 0x19(분석 가능한 예제)
____5.2.4 BugCheck 0x19(분석 불가능한 예제)
____5.2.5 BugCheck 0x8E
__5.3 실전 케이스 스터디
____5.3.1 BugCheck 0x50: UNICODE_STRING
____5.3.2 BugCheck 0x50: 숨겨진 콜 스택
____5.3.3 BugCheck 0x50: 해제된 핸들
____5.3.4 BugCheck 0x1A: 페이지 손상
____5.3.5 BugCheck 0xC5: 풀 헤더 손상
____5.3.6 BugCheck 0xC5: 해제 리스트 손상
____5.3.7 BugCheck 0x133: DPC_WATCHDOG_VIOLATION
____5.3.8 Hang: CPU 과점유
____5.3.9 Hang: 좀비 프로세스
____5.3.10 Hang: 완료되지 않는 IRP
____5.3.11 Hang: 위험한 락 사용
__5.4 커널 리버싱 스터디
____5.4.1 핸들 테이블 탐험 I
____5.4.2 핸들 테이블 탐험 II
____5.4.3 프로세스 경로 획득
____5.4.4 섹션 오브젝트에서 파일 경로 획득
__5.5 드라이버 확인 프로그램
____5.5.1 드라이버 확인 프로그램 실행
____5.5.2 명령 프롬프트에서 설정
__5.6 정리
6장. 고급 디버깅
__6.1 WinDbg 사용 팁
____6.1.1 조건 브레이크 포인트
____6.1.2 심볼 스토어 생성
____6.1.3 유저모드 원격 디버깅
________6.1.3.1 문제의 응용 프로그램(notepad.exe)이 실행 중인 PC1
________6.1.3.2 WinDbg를 실행해 실제로 디버깅을 하려는 PC2
____6.1.4 커널모드 원격 디버깅
____6.1.5 커널모드 디버깅으로 유저모드 디버깅하기 1
____6.1.6 커널모드 디버깅으로 유저모드 디버깅하기 2
____6.1.7 Event ID 2019 비페이징 풀 부족 원인 찾기
__6.2 WinDbg Tools
____6.2.1 breakin.exe
____6.2.2 logger.exe, logviewer.exe
____6.2.3 ADPlus.exe(vbs)
________6.2.3.1 크래시 모드
________6.2.3.2 행 모드
__6.3 WinDbg 스크립트
____6.3.1 첫 번째 스크립트
____6.3.2 두 번째 스크립트
____6.3.3 세 번째 스크립트
__6.4 WinDbg 확장 DLL
____6.4.1 확장 DLL 예제
____6.4.2 확장 DLL 만들기
__6.5 정리
7장. WinDbg 명령어
__7.1 일반 명령
____7.1.1 dt(Display Type)
____7.1.2 S(Search Memory)
____7.1.3 ds, dS(Display String)
____7.1.4 da, du(Display Memory: ASCII, Unicode)
____7.1.5 dl(Display Linked List)
____7.1.6 dds(Display Words and Symbols)
____7.1.7 x(Examine Symbols)
____7.1.8 uf(Unassemble Function)
____7.1.9 ub(Unassemble ? b parameter)
____7.1.10 ?(Evaluate Expression)
__7.2 메타 명령
____7.2.1 .kdfiles(Set Driver Replacement Map)
____7.2.2 .reboot(Reboot Target Computer)
____7.2.3 .crash(Force System Crash)
____7.2.4 .dump(Create Dump File)
____7.2.5 .hh(Open HTML Help File)
____7.2.6 .symfix(Set Symbol Store Path)
____7.2.7 .reload(Reload Module)
____7.2.8 .enable_unicode(Enable Unicode Display)
____7.2.9 .enable_long_status(Enable Long Integer Display)
____7.2.10 .formats(Show Number Formats)
__7.3 확장 명령
____7.3.1 !object
____7.3.2 !handle
____7.3.3 !process
____7.3.4 !stacks
____7.3.5 !drvobj
____7.3.6 !devobj
____7.3.7 !devstack
____7.3.8 !fileobj
____7.3.9 !for_each_module
____7.3.10 !vm
____7.3.11 !sym
____7.3.12 !poolfind
____7.3.13 !dml_proc
____7.3.14 !fltkd
__7.4 MEX 디버그 익스텐션 명령
____7.4.1 !mex.help
____7.4.2 !mex.mheap
____7.4.3 !mex.p
____7.4.4 !mex.addr
____7.4.5 !mex.eresource(eres)
____7.4.6 !mex.deviceobject(devo)
____7.4.7 !mex.driverobject(drvo)
____7.4.8 !mex.dtpool(dtp)
____7.4.9 !mex.evt
____7.4.10 !mex.fileobject(fo)
____7.4.11 !mex.foreachcpu(fec)
____7.4.12 !mex.foreachprocess(fep)
____7.4.13 !mex.listticks(lticks)
____7.4.14 !mex.mirp
____7.4.15 !mex.mirpfind
____7.4.16 !mex.mreg
____7.4.17 !mex.obj
____7.4.18 !mex.parsemem
____7.4.19 !mex.tag
____7.4.20 !mex.tasklist(tl)
____7.4.21 !mex.vadmodules(vadm)
____7.4.22 !mex.vss
____7.4.23 !mex.wq
____7.4.24 !mex.count
____7.4.25 !mex.cut
____7.4.26 !mex.ddt
____7.4.27 !mex.dumpinfo
____7.4.28 !mex.grep
____7.4.29 !mex.t
____7.4.30 !mex.dumpstackstrings(dss)
____7.4.31 !mex.executive
____7.4.32 !mex.listthreads(lt)
____7.4.33 !mex.ready
____7.4.34 !mex.running(cpu)
____7.4.35 !mex.searchthreadstacks(sts)
____7.4.36 !mex.standby(sby)
____7.4.37 !mex.suspended
____7.4.38 !mex.uniquestacks(us)
____7.4.39 !mex.userrequest
____7.4.40 !mex.wrlpcreceive(lpcs)
____7.4.41 !mex.wrresource
____7.4.42 !mex.imports
____7.4.43 !mex.mods
__7.5 정리