GONII
2019. 2. 23. 21:46
1부. 준비하기
1장. 에러 핸들링
- 자신만의 에러 코드를 정의하는 방법
- ErrorShow 예제 애플리케이션
2장 문자와 문자열로 작업하기
- 문자 인코딩
- ANSI 문자와 유니코드 문자 그리고 문자열 자료형
- 윈도우 내의 유니코드 함수와 ANSI 함수
- C 런타임 라이브러리 내의 유니코드 함수와 ANSI 함수
- C 런타임 라이브러리 내의 안전 문자열 함수
- 새로운 안전 문자열 함수에 대한 소개
- 문자열 조직을 수행하는 동안 좀 더 많은 제어를 수행할 수 있도록 하는 방법
- 윈도우의 문자열 함수
- 왜 유니코드를 사용하는 것이 좋은가?
- 문자와 문자열 작업에 대한 권고사항
- 유니코드 문자열과 ANSI 문자열 사이의 변경
- ANSI와 유니코드 DLL함수의 익스포트
- 텍스트가 ANSI인지 유니코드인지 여부를 확인하는 방법
3장 커널 오브젝트
- 커널 오브젝트란 무엇인가?
- 사용 카운트
- 보안
- 프로세스의 커널 오브젝트 핸들 테이블
- 커널 오브젝트 생성하기
- 커널 오브젝트 삭제하기
- 프로세스간 커널 오브젝트의 공유
- 오브젝트 핸들의 상속을 이용하는 방법
- 명명된 오브젝트를 사용하는 방법
- 오브젝트 핸들의 복사를 이용하는 방법
2부.목표 달성
4장 프로세스
- 첫 번째 윈도우 애플리케이션 작성
- 프로세스 인스턴스 핸들
- CreateProcess 함수
- pzApplicationName과 pszCommandLine
- 프로세스의 종료
- 주 스레드 진입점 함수의 반환
- ExitProcess 함수
- TerminateProcess 함수
- 프로세스 내의 모든 스레드가 종료되면
- 프로세스가 종료되면
- 차일드 프로세스
- 차일드 프로세스의 독립적인 수행
- 관리자가 표준 사용자로 수되는 경우
- 프로세스의 자동 권한 상승
- 프로세스의 수동 권한 상승
- 현재의 권한 정보는 무엇인가?
- 시스템에서 수행 중인 프로세스의 나열
5장 잡
- 잡 내의 프로세스에 대한 제한사항 설정
- 잡 내에 프로세스 배치하기
- 잡 내의 모든 프로세스 종료하기
- 잡의 통계 정보 조희
- 잡 통지
- 잡 실습 예제 애플리케이션
6장 스레드의 기본
- 스레드를 생성해야 하는 이유
- 스레드를 생성하지 말아야하는 이유
- 처음으로 작성하는 스레드 함수
- CreateThread 함수
- psa
- cbStackSize
- pfnStartAddr과 pvParam
- dwCreateFlags
- pdwThreadID
- 스레드르의 종료
- 스레드 함수 반환
- ExitThread 함수
- TerminateThread 함수
- 프로세스가 종료되면
- 스레드가 종료되면
- 스레드의 내부
- C/C++ 런타임 라이브러리에 대한 고찰
- 이런! 실수로 _beginthreadex 대신 CreateThread를 호출했다.
- 절대 호출하지 말아야 하는 C/C++ 런타임 라이브러리 함수
- 자신의 구분자 얻기
- 허위 핸들을 실제 핸들로 변경하기
7장 스레드 스케줄링, 우선순위, 그리고 선호도
- 스레드의 정지와 계속 수행
- 프로세스의 정지와 계속 수행
- 슬리핑
- 다른 스레드로의 전환
- 하이퍼스레드 CPU 상에서 다른 스레드로의 전환
- 스레드 수행 시간
- 컨텍스트 내의 CONTEX 구조체
- 스레드 우선순위
- 우선순위의 추상적인 의미
- 우선순위 프로그래밍
- 동적인 우선순위 레벨 상승
- 포그라운드 프로세스를 위한 스케줄러 변경
- I/O 요청 우선순위 스케줄링
- 스케줄링 실습 예제 애플리케이션
- 선호도
8장 유저 모드에서의 스레드 동기화
- 원자적 접근 : Interlocked 함수들
- 캐시 라인
- 고급 스레드 동기화 기법
- 회피 기술
- 크리티컬 섹션
- 크리티컬 섹션 : 세부사항
- 크리티컬 섹션과 스핀락
- 크리티컬 섹션과 에러 처리
- 슬림 리더 - 라이터 락
- 조건 변수
- Queue 예제 애플리케이션
- 유용한 팁과 테크닉
9장 커널 오브젝트를 이용한 스레드 동기화
- 대기 함수들
- 성공적인 대기의 부가적인 영향
- 이벤트 커널 오브젝트
- 핸드셰이크 예제 애플리케이션
- 대기 타이머 커널 오브젝트
- 대기 타이머를 이용하여 APC 요청을 스레드의 APC 큐에 삽입하는 방법
- 타이머와 관련된 미결 문제
- 세마포어 커널 오브젝트
- 뮤텍스 커널 오브젝트
- 버림 문제(Abandonment issued)
- 뮤텍스와 크리티컬 섹션
- 큐 예제 애플리케이션
- 편리한 스레드 동기화 오브젝트 표
- 그 외의 스레드 동기화 함수들
- 비동기 장치 I/O
- WaitForInputIdle
- MsgWaitForMultipleObjects(Ex)
- WaitForDebugEvent
- SignalObjectAndWait
- 대기 목록 순회 API를 이용한 데드락 감지
10장 동기 및 비동기 장치 I/O
- 장치 열기와 닫기
- CreateFile에 대한 세부사항 검토
- 파일 장치 이용
- 파일 크기 얻기
- 파일 포인터 위치 지정
- 파일의 끝 설정
- 동기 장치 I/O 수행
- 장치로 데이터 플러시하기
- 동기 I/O의 취소
- 비동기 장치 I/O의 기본
- OVERLAPPED 구조체
- 비동기 장치 I/O 사용 시 주의점
- 요청된 장치 I/O의 취소
- I/O 요청에 대한 완료 통지의 수신
- 디바이스 커널 오브젝트의 시그널링
- 이벤트 커널 오브젝트의 시그널링
- 얼러터블 I/O
- I/O 컴플리션 포트
11장 윈도우 스레드 풀
- 시나리오 1 : 비동기 함수 호출
- 명시적 작업 항목 제어
- 배치 예제 애플리케이션
- 시나리오 2 : 시간 간격을 두고 함수 호출
- 자동 닫힘 메시지 박스 예제 애플리케이션
- 시나리오 3 : 커널 오브젝트가 시그널되면 함수 호출
- 시나리오 4 : 비동기 I/O 요청이 완료되면 함수 호출
- 콜백 종료 동작
- 스레드 풀 커스터마이징
- 스레드 풀을 우아하게 삭제하는 방법 : 삭제 그룹
12장 파이버
- 파이버 사용하기
- 카운터 예제 애플리케이션
3부.메모리 관리
13장 윈도우 메모리의 구조
- 프로세스의 가상 주소 공간
- 가상 주소 공간의 분할
- 널 포인터 할당 파티션
- 유저 모드 파티션
- 커널 모드 파티션
- 주소 공간 내의 영역
- 물리적 저장소를 영역으로 커밋하기
- 물리적 저장소와 페이징 파일
- 페이지 파일 내에 유지되지 않는 물리적 저장소
- 보호 특성
- 카피 온 라이트 접근
- 특수 접근 보호 특성 플래그
- 모두 함께 모아
- 영역의 내부
- 데이터 정렬의 중요성
14장 가상 메모리 살펴보기
- 시스템 정보
- 시스템 정보 예제 애플리케이션
- 가상 메모리 상태
- NUMA 머신에서의 메모리 관리
- 가상 메모리 상태 예제 애플리케이션
- 주소 공간의 상태 확인하기
- VMQuery 함수
- 가상 메모리 맵 예제 애플리케이션
15장 애플리케이션에서 가상 메모리 사용 방법
- 주소 공간 내에 영역 예약하기
- 예약 영역에 저장소 커밋하기
- 영역에 대한 예약과 저장소 커밋을 동시에 수행하는 방법
- 언제 물리적 저장소를 커밋하는가
- 물리적 저장소의 디커밋과 영역 해제하기
- 언제 물리적 저장소를 디커밋하는가
- 가상 메모리 할당 예제 애플리케이션
- 보호 특성 변경하기
- 물리적 저장소의 내용 리셋하기
- MemReset 예제 애플리케이션
- 주소 윈도우 확장
- AWE 예제 애플리케이션
16장 스레드 스택
- C/C++ 런타임 라이브러리의 스택 확인 함수
- Summation 예제 애플리케이션
17장 메모리 맵 파일
- 실행 파일과 DLL 파일에 대한 메모리 맵
- 정적 데이터는 실행 파일과 DLL의 여러 인스턴스들 사이에 공유되지 않는다
- 메모리 맵 데이터 파일
- 방법 1 : 한 개의 파일, 한 개의 버퍼
- 방법 2 : 두 개의 파일, 한 개의 버퍼
- 방법 3 : 한 개의 파일, 두 개의 버퍼
- 방법 4 : 한 개의 파일, 버퍼는 사용하지 않음
- 메모리 맵 파일 사용하기
- 1단계 : 파일 커널 오브젝트를 생성하거나 열기
- 2단계 : 파일 매핑 커널 오브젝트 생성
- 3단계 : 파일의 데이터를 프로세스의 주소 공간에 매핑하기
- 4단계 : 프로세스의 주소 공간으로부터 파일 데이터에 대한 매핑 해체하기
- 5, 6단계 : 파일 매핑 오브젝트와 파일 오브젝트 닫기
- 파일 뒤집기 예제 애플리케이션
- 메모리 맵 파일을 이용하여 큰 파일 처리하기
- 메모리 맵 파일과 일관성
- 메모리 맵 파일의 시작 주소 지정하기
- 메모리 맵 파일의 세부 구현사항
- 프로세스간 데이터 공유를 위해 메모리 맵 파일 사용하기
- 페이징 파일을 이용하는 메모리 맵 파일
- 메모리 맵 파일 공유 예제 애플리케이션
- 스파스 메모리 맵 파일
- 스파스 메모리 맵 파일 예제 애플리케이션
18장 힙
- 프로세스 기본 힙
- 추가적으로 힙을 생성하는 이유
- 컴포넌트 보호
- 더욱더 효율적인 메모리 관리
- 지역적인 접근
- 스레드 동기화 비용 회피
- 빠른 해제
- 추가적으로 힙을 생성하는 방법
- 힙으로부터 메모리 블록 할당
- 블록 크기 변경
- 블록 크기 획득
- 블록 해제
- 힙 파괴
- C++ 에서의 힙 사용
- 기타 힙 관련 함수들
4부. 다이내믹 링크 라이브러리(DLL)
19장 DLL의 기본
- DLL과 프로세스 주소 공간
- 전반적인 모습
- DLL모듈 생성
- 실행 모듈 생성
- 실행 모듈의 수행
20장 DLL의 고급 기법
- 명시적인 DLL 모듈 로딩과 심벌 링킹
- 명시적인 DLL 모듈 로딩
- 명시적인 DLL 모듈 언로딩
- 익스포트된 심벌을 명시적으로 링킹하기
- DLL의 진입점 함수
- DLL_PROCESS_ATTACH 통지
- DLL_PROCESS_DETACH 통지
- DLL_THREAD_ATTACH 통지
- DLL_THREAD_DETACH 통지
- 순차적인 DllMain 호출
- DLL의 지연 로딩
- DelayLoadApp 예제 애플리케이션
- 함수 전달자
- 알려진 DLL
- DLL 리다이렉션
- 모듈의 시작 위치 변경
- 모듈 바인딩
21장 스레드 지역 저장소(TLS)
- 동적 TLS
- 동적 TLS 사용하기
- 정적 TLS
22장 DLL 인젝션과 API 후킹
- DLL 인젝션 : 예제
- 레지스트리를 이용하여 DLL 인젝션하기
- 윈도우 훅을 이용하여 DLL 인젝션하기
- 바탕 화면 항목 위치 저장(DIPS) 도구
- 원격 스레드를 이용하여 DLL 인젝션하기
- 인젝션 라이브러리 예제 애플리케이션
- 이미지 살펴보기 DLL
- 트로얀 DLL을 이용하여 DLL 인젝션하기
- 디버거를 이용하여 DLL 인젝션하기
- API 후킹 : 예제
- 코드 덮어쓰기를 통해 API 후킹하기
- 모듈의 임포트 섹션을 변경하여 API 후킹하기
- "마지막 메시지 박스 정보" 예제 애플리케이션
5부. 구조적 예외 처리
23장 종료 처리기
- 예제를 통한 종료 처리기의 이해
- Funcenstein1
- Funcenstein2
- Funcenstein3
- Funcfurter1
- 돌발 퀴즈 시간 : FuncaDoodleDoo
- Funcenstein4
- Funcarama1
- Funcarama2
- Funcarama3
- Funcarama4 : 최종의 개선안
- finally 블록에서 주의할 점
- Funcfuter2
- SEH 종료 예제 애플리케이션
24장 예외 처리기와 소프트웨어 예외
- 예제를 통해 예외 필터와 예외 처리기 이해하기
- Funcmeister1
- Funcmeister2
- EXCEPTION_EXCUTE_HANDLER
- 몇 가지 유용한 예
- 글로벌 언와인드
- 글로벌 언와인드 중단시키기
- EXCEPTION_CONTINUE_EXECUTION
- EXCEPTION_CONTINUE_EXECUTION은 주의하여 사용하라
- EXCEPTION_CONTINUE_SEARCH
- GetExceptionCode
- 메모리 관련 예외
- 예외 관련 예외
- 디버깅 관련 예외
- 부동소수점 관련 예외
- GetExceptionInformation
- 소프트웨어 예외
25장 처리되지 않은 예외, 벡터화된 예외 처리, 그리고 C++ 예외
- UnhandledExceptionFilter 함수의 내부
- 작업 1 : 리소스에 대한 쓰기 허용과 수행 재개
- 작업 2 : 처리되지 않은 예외를 디버거에게 통지
- 작업 3 : 전역적으로 설치된 필터함수에게 통지
- 작업 4 : 처리되지 않은 예외를 디버거에게 통지(반복)
- 작업 5 : 프로세스를 조용히 종료
- UnhandledExceptionFilter와 WER 간의 상호작용
- 저스트-인-타임(JIT) 디버깅
- 표계산 예제 애플리케이션
- 벡터화된 예외와 컨티뉴 처리기
- C++ 예외와 구조적 예외
- 예외와 디버거
26장 에러 보고와 애플리케이션 복구
- 윈도우 에러 보고 콘솔
- 프로그램적으로 윈도우 에러 보고하기
- 보고서 생성과 전송 금지하기
- 프로세스 내에서 사용자 정의 문제 보고서 생성하기
- 사용자 정의 문제 보고서 생성과 변경
- 사용자 정의 문제 보고서 생성하기 : WerReportCreate
- 문제 보고서에 내부 정보 설정하기 : WerReportSetParameter
- 문제 보고서에 미니 덤프 추가하기 : WerReportAddDump
- 문제 보고서에 임의의 파일 추가하기 : WerReportAddFile
- 다이얼로그 박스의 문자열 수정 : WerReportSetUIOption
- 문제 보고서 전송하기 : WerReportSubmit
- 문제 보고서 닫기 : WerReportCloseHandle
- 사용자 정의 WER 예제 애플리케이션
- 자동 애플리케이션 재시작과 복구
- 자동 애플리케이션 재시작
- 애플리케이션 복구 지원
6부 부록
A 빌드 환경
- CmnHdr.h 헤더 파일
- 마이크로소프트 윈도우 버전 빌드 옵션
- 유니코드 빌드 옵션
- 윈도우 정의와 4 경고 수준
- pragma message 헬퍼 매크로
- chlNRANGE 매크로
- chBEGINTHREADEX 매크로
- x86 플랫폼을 위한 DebugBreak 개선
- 소프트웨어 예외 코드 생성
- chMB 매크로
- chASSERT와 chVERIFY 매크로
- chHANDLE_DLGMSG 매크로
- chSETDLGICONS 매크로
- 링커가 (w)WinMain 진입점 함수를 찾도록 설정
- pragma를 이용하여 사용자 인터페이스 XP테마 지원하기
B 메시지 크래커, 차일드 컨트롤 매크로, 그리고 API 매크로
- 메시지 크래커
- 차일드 컨트롤 매크로
- API 매크로
반응형