CodeEngn Logo

Book


국내 리버스엔지니어링 관련 서적을 쉬어가기, 초급, 중급, 고급으로 분류 하였습니다.

추가 및 변경 신청은 Contact 메뉴에서 요청 해주세요.



리버싱 핵심 원리 : 악성 코드 분석가의 리버싱 이야기


정보

저자 : 이승원
출판사 : 인사이트
출간일 : 2012년 09월 30일
페이지 : 1064
ISBN-13 : 9788966260522
ISBN-10 : 8966260527
정가 : 48,000원


책소개

리버서라면 꼭 알아야 할 핵심 원리를 모두 담았다 리버싱이란 프로그램의 내부를 깊이 들여다보고 조작할 수 있는 기법이다. 이는 우리가 흔히 사용하는 상용 프로그램 등에도 가능하기 때문에 해킹의 방법으로 응용될 수 있다. 동시에 리버싱은 일명 ‘리버서’라 불리는 악성 코드 분석가들의 특기이며, 리버싱을 잘 활용하면 개발/테스트 단계에서 미처 발견하지 못한 버그나 취약점도 파악할 수 있고, 파일이나 메모리에 직접 접근하여 문제를 해결할 수 있다. 이 책은 이런 마법 같은 일들이 가능한 ‘리버싱’에 필요한 핵심 원리를 50여개 장을 통해 꼼꼼하게 설명한다. 무엇보다 저자가 오랫동안 안철수 연구소에서 경험을 토대로 직접 작성한 다양한 코드는 물론 리버서라면 꼭 알아야 할 다양한 리버싱 기법을 상세하게 소개하기 때문에 리버서를 꿈꾸는 개발자는 물론 실무를 경험해본 모두에게 도움을 준다.


저자소개

이승원

AhnLab에서 악성 코드를 분석하고, 리버싱 전문 블로그를 운영합니다. 리버스 엔지니어링을 접한 순간부터 그 황홀한 매력에 빠져들었습니다. 이 멋진 기술을 널리 전파시키고 다양한 분야에 활용하는 것에 관심이 많습니다. 독서와 공상을 좋아하고, 늘 새로운 도전을 꿈꾸고 있습니다.


목차

1부 기초 리버싱 

1장 Reversing Story 
1.1. Reverse Engineering(RE)
1.2. Reverse Code Engineering(RCE) 
1.2.1. 리버싱(분석) 방법 
1.2.2. Source Code, Hex Code, Assembly Code
1.2.3. 패치와 크랙
1.3. 리버싱 준비물
1.3.1. 목표 
1.3.2. 열정
1.3.3. 구글 
1.4. 리버싱 방해물
1.4.1. 과욕
1.4.2. 조급함
1.5. 리버싱의 묘미

2장 Hello World! 리버싱
2.1. Hello World! 프로그램 
2.1.1. 디버거와 어셈블리 언어 
2.2. HelloWorld.exe 디버깅 
2.2.1. 디버깅 목표 
2.2.2. 디버깅 시작 
2.2.3. EP 
2.2.4. 40270C 함수 따라가기 
2.2.5. 40104F 점프문 따라가기 
2.2.6. main( ) 함수 찾기 
2.3. 디버거 좀 더 능숙하게 다루기 
2.3.1. 디버거 명령어 
2.3.2. 베이스 캠프 
2.3.3. 베이스 캠프를 설치하는 4가지 방법 
2.4. 원하는 코드를 빨리 찾아내는 4가지 방법 
2.4.1. 코드 실행 방법 
2.4.2. 문자열 검색 방법 
2.4.3. API 검색 방법 (1) - 호출 코드에 BP 
2.4.4. API 검색 방법 (2) - API 코드에 직접 BP 
2.5. “Hello World!” 문자열 패치 
2.5.1. 패치 
2.5.2. 문자열을 패치하는 두 가지 방법 
2.6. 마무리 

3장 Little Endian 표기법 
3.1. 바이트 오더링 49
3.1.1. 리틀 엔디안 & 빅 엔디안 
3.1.2. OllyDbg에서 리틀 엔디안 확인 

4장 IA-32 Register 기본 설명 
4.1. CPU 레지스터란? 
4.1.1. 레지스터에 대해서 알아야 하는 이유 
4.2. IA-32의 레지스터 
4.2.1. Basic program execution registers 
4.3. 마무리 

5장 Stack 
5.1. 스택 
5.1.1. 스택의 특징 
5.1.2. 스택 동작 예제 

6장 abex crackme #1 분석 
6.1. abex’ crackme #1 
6.1.1. Start debugging 
6.1.2. 코드 분석 
6.2. 크랙 
6.3. 스택에 파라미터를 전달하는 방법 
6.4. 마무리 

7장 Stack Frame 
7.1. 스택 프레임 
7.2. 실습 예제 - stackframe.exe 
7.2.1. StackFrame.cpp 
7.2.2. main( ) 함수 시작 & 스택 프레임 생성 
7.2.3. 로컬 변수 셋팅 
7.2.4. add( ) 함수 파라미터 입력 및 add( ) 함수 호출 
7.2.5. add( ) 함수 시작 & 스택 프레임 생성 
7.2.6. add( ) 함수의 로컬 변수(x, y) 셋팅 
7.2.7. ADD 연산 
7.2.8. add( ) 함수의 스택 프레임 해제 & 함수 종료(리턴) 
7.2.9. add( ) 함수 파라미터 제거(스택 정리) 
7.2.10. printf( ) 함수 호출 
7.2.11. 리턴 값 셋팅 
7.2.12. 스택 프레임 해제 & main( ) 함수 종료 
7.3. OllyDbg 옵션 변경 
7.3.1. Disasm 옵션 
7.3.2. Analysis1 옵션
7.4. 마무리 

8장 abex crackme #2 
8.1. abex’ crackme #2 실행 
8.2. Visual Basic 파일 특징 
8.2.1. VB 전용 엔진 
8.2.2. N(Native) code, P(Pseudo) code 
8.2.3. Event Handler 
8.2.4. undocumented 구조체 
8.3. Start debugging 
8.3.1. 간접호출 
8.3.2. RT_MainStruct 구조체 
8.3.3. ThunRTMain( ) 함수 
8.4. crackme 분석 
8.4.1. 문자열 검색 
8.4.2. 문자열 주소 찾기 
8.4.3. Serial 생성 알고리즘 
8.4.4. 코드 예측하기 
8.4.5. Name 문자열 읽는 코드 
8.4.6. 암호화 루프 
8.4.7. 암호화 방법 
8.5. 마무리 

9장 Process Explorer - 최고의 작업 관리자 
9.1. Process Explorer 
9.2. 구체적으로 뭐가 좋은 거죠? 
9.3. sysinternals 

10장 Calling Convention 
10.1. Calling Convention 
10.1.1. cdecl 
10.1.2. stdcall 
10.1.3. fastcall 

11장 Lena’s Reversing for Newbies 
11.1. 실행 
11.2. 분석 
11.2.1. 목표(1) - 메시지 박스 제거! 
11.2.2. 패치(1) - 메시지 박스 제거 
11.2.3. 목표(2) - Registration Code 찾기 
11.3. 마무리 

12장 도대체 리버싱을 어떻게 공부해야 하나요? 
12.1. Reverse Engineering(RE) 
12.1.1. 모든 공부에는 ‘목표’가 있어야 합니다. 
12.1.2. ‘긍정적인 마인드’를 가지세요. 
12.1.3. ‘재미’를 느껴야 합니다. 
12.1.4. ‘검색’을 생활화해야 합니다. 
12.1.5. 제일 중요한 건 ‘실천’입니다. 
12.1.6. ‘느긋한 마음’을 가지세요. 

2부 PE File Format 

13장 PE File Format 
13.1. Introduction 
13.2. PE File Format 
13.2.1. 기본 구조 
13.2.2. VA & RVA 
13.3. PE 헤더 
13.3.1. DOS Header 
13.3.2. DOS Stub 
13.3.3. NT Header 
13.3.4. IMAGE_NT_HEADERS - IMAGE_FILE_HEADER 
13.3.5. IMAGE_NT_HEADERS - IMAGE_OPTIONAL_HEADER32 
13.3.6. 
13.4. RVA to RAW 
13.5. IAT 
13.5.1. DLL 
13.5.2. IMAGE_IMPORT_DESCRIPTOR 
13.5.3. notepad.exe를 이용한 실습 
13.6. EAT 
13.6.1. IMAGE_EXPORT_DIRECTORY
13.6.2. kernel32.dll을 이용한 실습 
13.7. Advanced PE(Portable Executable) 
13.7.1. PEView.exe 
13.7.2. Patched PE 
13.8. 마무리 

14장 실행 압축 
14.1. 데이터 압축 
14.1.1. 비손실 압축 
14.1.2. 손실 압축 
14.2. 실행 압축 
14.2.1. 패커 
14.2.2. 프로텍터 
14.3. 실행 압축 테스트 
14.3.1. notepad.exe와 notepad_upx.exe 파일 비교

15장 UPX 실행 압축된 notepad 디버깅
15.1. notepad.exe의 EP Code 
15.2. notepad_upx.exe의 EP Code 
15.3. UPX 파일 트레이싱 
15.3.1. OllyDbg의 트레이스 명령어
15.3.2. 루프 #1 
15.3.3. 루프 #2 
15.3.4. 루프 #3
15.3.5. 루프 #4
15.4. UPX의 OEP를 빨리 찾는 방법
15.4.1. POPAD 명령어 이후의 JMP 명령어에 BP 설치 
15.4.2. 스택에 하드웨어 브레이크 포인트(Hardware Break Point) 설치
15.5. 마무리 

16장 Base Relocation Table 
16.1. PE 재배치 
16.1.1. DLL/SYS 
16.1.2. EXE 
16.2. PE 재배치 발생시 수행되는 작업 
16.3. PE 재배치 동작 원리 
16.3.1. Base Relocation Table
16.3.2. IMAGE_BASE_RELOCATION 구조체 
16.3.3. Base Relocation Table의 해석 방법 
16.3.4. 실습 

17장 실행 파일에서 .reloc 섹션 제거하기 
17.1. .reloc 섹션
17.2. reloc.exe 
17.2.1. .reloc Section Header 정리 
17.2.2. .reloc 섹션 제거
17.2.3. IMAGE_FILE_HEADER 수정 
17.2.4. IMAGE_OPTIONAL_HEADER 수정 
17.3. 마무리 

18장 UPack PE 헤더 상세 분석 
18.1. UPack 설명 
18.2. UPack으로 notepad.exe 실행 압축하기 
18.3. Stud_PE 이용
18.4. PE 헤더 비교 
18.4.1. notepad.exe(원본)의 PE 헤더
18.4.2. notepad_upack.exe(실행 압축)의 PE 헤더 
18.5. UPack의 PE 헤더 분석
18.5.1. 헤더 겹쳐쓰기
18.5.2. IMAGE_FILE_HEADER.SizeOfOptionalHeader 
18.5.3. IMAGE_OPTIONAL_HEADER.NumberOfRvaAndSizes 
18.5.4. IMAGE_SECTION_HEADER
18.5.5. 섹션 겹쳐쓰기 
18.5.6. RVA to RAW 
18.5.7. Import Table(IMAGE_IMPORT_DESCRIPTOR array) 
18.5.8. IAT(Import Address Table) 
18.6. 마무리

19장 UPack 디버깅 - OEP 찾기 
19.1. OllyDbg 실행 에러 
19.2. 디코딩 루프 
19.3. IAT 셋팅 
19.4. 마무리 

20장 인라인 패치 실습
20.1. 인라인 패치 
20.2. 실습 - Patchme
20.3. 디버깅 - 코드 흐름 살펴보기
20.4. 코드 구조 
20.5. 인라인 패치 실습 
20.5.1. 패치 코드를 어디에 설치할까?
20.5.2. 패치 코드 만들기 
20.5.3. 패치 코드 실행하기 
20.5.4. 결과 확인 

3부 DLL Injection 

21장 Windows 메시지 후킹
21.1. 훅 
21.2. 메시지 훅
21.3. SetWindowsHookEx ( ) 
21.4. 키보드 메시지 후킹 실습 
21.4.1. 실습 예제 HookMain.exe
21.4.2. 소스코드 분석 
21.5. 디버깅 실습 
21.5.1. HookMain.exe 디버깅 
21.5.2. Notepad.exe 프로세스내의 KeyHook.dll 디버깅 
21.6. 마무리

22장 악의적인 목적으로 사용되는 키로거 
22.1. 악성 키로거의 목표
22.1.1. 온라인 게임 
22.1.2. 인터넷 뱅킹
22.1.3. 기업 정보 유출 
22.2. 키로거의 종류와 향후 발전 방향 
22.3. 키로거에 대처하는 우리의 자세 
22.4. 개인정보

23장 DLL Injection 
23.1. DLL 인젝션 
23.2. DLL 인젝션 활용 예 
23.2.1. 기능 개선 및 버그 패치 
23.2.2. 메시지 후킹
23.2.3. API 후킹
23.2.4. 기타 응용 프로그램 
23.2.5. 악성 코드 
23.3. DLL 인젝션 구현 방법
23.4. CreateRemoteThread ( )
23.4.1. 실습 예제 myhack.dll 
23.4.2. 예제 소스코드 분석 
23.4.3. 디버깅 방법 
23.5. AppInit_DLLs 
23.5.1. 예제 소스코드 분석 
23.5.2. 실습 예제 myhack2.dll 
23.6. SetWindowsHookEx ( ) 
23.7. 마무리 

24장 DLL Ejection
24.1. DLL 이젝션 동작 원리 
24.2. DLL 이젝션 구현
24.2.1. 프로세스에 로딩된 DLL 정보 구하기
24.2.2. 대상 프로세스 핸들 구하기 
24.2.3. FreeLibrary( ) API 주소 구하기 
24.2.4. 대상 프로세스에 스레드를 실행시킴 
24.3. DLL 이젝션 간단 실습
24.3.1. 파일 복사 및 notepad.exe 실행 
24.3.2. 인젝션 
24.3.3. 이젝션

25장 PE Patch를 이용한 DLL 로딩
25.1. 실습 파일 
25.1.1. TextView.exe 
25.1.2. TextView_patched.exe
25.2. 소스코드 - myhack3.cpp
25.2.1. DllMain( ) 
25.2.2. DownloadURL( ) 
25.2.3. DropFile( ) 
25.2.4. dummy( )
25.3. TextView.exe 파일 패치 준비 작업
25.3.1. 패치 아이디어 
25.3.2. 패치 사전 조사 
25.3.3. IDT 이동 
25.4. TextView.exe 패치 작업 
25.4.1. IMPORT Table의 RVA 값 변경 
25.4.2. BOUND IMPORT TABLE 제거 
25.4.3. 새로운 IDT 생성 
25.4.4. Name, INT, IAT 셋팅 
25.4.5. IAT 섹션의 Characteristics 변경 
25.5. 검증 (Test) 
25.6. 마무리 

26장 PE Tools 
26.1. PE Tools 
26.1.1. 프로세스 메모리 덤프 
26.1.2. PE Editor 
26.2. 마무리 
쉬어가기 - 리버싱의 참맛 

27장 Code Injection 
27.1. Code 인젝션 
27.2. DLL 인젝션 vs Code 인젝션 
27.2.1. 코드 인젝션을 사용하는 이유 
27.3. 실습 예제 
27.3.1. notepad.exe 실행 
27.3.2. CodeInjection.exe 실행 
27.3.3. 메시지 박스 확인 
27.4. CodeInjection.cpp
27.4.1. main( ) 
27.4.2. ThreadProc( ) 
27.4.3. InjectCode( ) 
27.5. Code 인젝션 디버깅 실습 
27.5.1. notepad.exe 디버깅 
27.5.2. OllyDbg 옵션 변경 
27.5.3. CodeInjection.exe 실행 
27.5.4. 스레드 시작 코드 
27.6. 마무리 

28장 어셈블리 언어를 이용한 Code Injection 
28.1. 목표 
28.2. 어셈블리 프로그래밍 
28.3. OllyDbg의 Assemble 명령 
28.3.1. ThreadProc( ) 작성 
28.3.2. Save File 
28.4. 인젝터 제작 
28.4.1. ThreadProc( ) 함수의 바이너리 코드 얻기 
28.4.2. CodeInjection2.cpp 
28.5. 디버깅 실습 
28.5.1. notepad.exe 디버깅 
28.5.2. OllyDbg 옵션 변경 
28.5.3. CodeInjection2.exe 실행 
28.5.4. 스레드 시작 코드 
28.6. 상세 분석 
28.6.1. 스택 프레임 
28.6.2. THREAD_PARAM 구조체 포인터 
28.6.3. “user32.dll” 문자열 
28.6.4. “user32.dll” 문자열 파라미터 입력 
28.6.5. LoadLibraryA(“user32.dll”) 호출 
28.6.6. “MessageBoxA” 문자열 
28.6.7. GetProcAddress(hMod, “MessageBoxA”) 호출 
28.6.8. MessageBoxA( ) 파라미터 입력 1 - MB_OK 
28.6.9. MessageBoxA( ) 파라미터 입력 2 - “ReverseCore” 
28.6.10. MessageBoxA( ) 파라미터 입력 3 - “www.reversecore.com” 
28.6.11. MessageBoxA( ) 파라미터 입력 4 - NULL 
28.6.12. MessageBoxA 호출 
28.6.13. ThreadProc( ) 리턴 값 셋팅 
28.6.14. 스택 프레임 해제 및 함수 리턴 
28.7. 마무리 

4부 API Hooking 

29장 API Hooking: 리버싱의 ‘꽃’ 
29.1. 후킹 
29.2. API 
29.3. API 후킹 
29.3.1. 정상 API 호출 
29.3.2. 후킹 API 호출 
29.4. 테크 맵 
29.4.1. Method Object(what) 
29.4.2. Location(where) 
29.4.3. Technique(How)
29.5. API 

30장 메모장 WriteFile ( ) 후킹 
30.1. 테크 맵 - 디버그 테크닉 
30.2. 디버거 설명 
30.2.1. 용어 
30.2.2. 디버거 기능 
30.2.3. 디버거 동작 원리 
30.2.4. 디버그 이벤트 
30.3. 작업 순서 
30.4. 실습
30.5. 동작 원리 
30.5.1. 스택 
30.5.2. 실행 흐름 
30.5.3. 언훅 & 훅
30.6. 소스코드 설명 
30.6.1. main( ) 
30.6.2. DebugLoop( ) 
30.6.3. EXIT_PROCESS_DEBUG_EVENT 
30.6.4. CREATE_PROCESS_DEBUG_EVENT - OnCreateProcessDebug Event( ) 
30.6.5. EXCEPTION_DEBUG_EVENT - OnExceptionDebugEvent( ) 

31장 디버거 이야기 
31.1. OllyDbg 
31.2. IDA Pro 
31.3. WinDbg 

32장 계산기, 한글을 배우다 
32.1. 테크 맵 
32.2. 대상 API 선정 
32.3. IAT 후킹 동작 원리 
32.4. 실습 
32.5. 소스코드 분석 
32.5.1. DllMain( ) 
32.5.2. MySetWindowTextW( ) 
32.5.3. hook_iat ( ) 
32.6. 인젝션된 DLL의 디버깅 
32.6.1. DllMain( ) 
32.6.2. hook_iat ( ) 
32.6.3. MySetWindowTextW( ) 
32.7. 마무리 

33장 ‘스텔스’ 프로세스 
33.1. 테크 맵 
33.2. API 코드 패치 동작 원리 
33.2.1. 후킹 전 
33.2.2. 후킹 후 
33.3. 프로세스 은폐 
33.3.1. 프로세스 은폐 동작 원리 
33.3.2. 관련 API 
33.3.3. 은폐 기법의 문제점 
33.4. 실습 #1 (HideProc.exe, stealth.dll) 
33.4.1. notepad.exe, procexp.exe, taskmgr.exe 실행 
33.4.2. HideProc.exe 실행 
33.4.3. stealth.dll 인젝션 확인 
33.4.4. notepad.exe 프로세스 은폐 확인 
33.4.5. notepad.exe 프로세스 은폐 해제 
33.5. 소스코드 분석 
33.5.1. HookProc.cpp 
33.5.2. stealth.cpp 
33.6. 글로벌 API 후킹 
33.6.1. Kernel32.CreateProcess ( ) API 
33.6.2. Ntdll.ZwResumeThread ( ) API 
33.7. 실습 #2(HideProc2.exe, stealth2.dll) 
33.7.1. stealth2.dll 파일을 %SYSTEM% 폴더에 복사 
33.7.2. HideProc2.exe -hide 실행 
33.7.3. ProcExp.exe & notepad.exe 실행 
33.7.4. HideProc2.exe -show 실행 
33.8. 소스코드 분석 
33.8.1. HideProc2.cpp 
33.8.2. stealth2.cpp 
33.9. 핫 패치 방식의 API 후킹 
33.9.1. 기존 API 코드 패치 방법의 문제점 
33.9.2. 핫 패치 (7바이트 코드 패치) 
33.10. 실습 #3 - stealth3.dll 
33.11. 소스코드 분석 
33.11.1. Stealth3.cpp 
33.12. 핫 패치 방식의 API 후킹에서 고려사항 
33.12. 마무리 

34.1. 후킹 대상 API 
34.1.1. 검증 ? IE 프로세스 디버깅 
34.2. IE 프로세스 구조 
34.3. 글로벌 API 후킹 개념 정리 
34.3.1. 일반적인 API 후킹 
34.3.2. 글로벌 API 후킹 
34.4. ntdll!ZwResumeThread ( ) API 
34.5. 실습 예제 ? IE 접속 제어 
34.5.1. IE 실행 
34.5.2. DLL 인젝션 
34.5.3. 새로운 탭 생성 
34.5.4. 포털 사이트 접속 
34.5.5. DLL 이젝션
34.5.6. 추가 실습
34.6. 예제 소스코드 
34.6.1. DllMain( ) 
34.6.2. NewInternetConnectW( ) 
34.6.3. NewZwResumeThread( ) 
34.7. 마무리 

35장 좋은 분석 도구를 선택하는 5가지 기준 
35.1. 도구 
35.2. Reverse Code Engineer 
35.3. 좋은 분석 도구 선택의 5가지 기준 
35.3.1. 도구 개수를 최소화한다. 
35.3.2. 도구는 기능이 단순하고 사용방법이 편리한 것이 좋다. 
35.3.3. 기능을 철저히 익힌다. 
35.3.4. 꾸준히 업데이트한다. 
35.3.5. 도구의 핵심 동작 원리를 이해한다. 
35.4. 숙련도의 중요성 
5부 64비트 & Windows Kernel 6 

36장 64bit Computing 
36.1. 64비트 컴퓨팅 환경
36.1.1. 64비트 CPU 
36.1.2. 64비트 OS 
36.1.3. Win32 API 
36.1.4. WOW64 
36.1.5. 실습 - WOW64Test 
36.2. 64비트 빌드 
36.2.1. Microsoft Windows SDK(Software Development Kit) 
36.2.2. Visual C++ 2010 Express 환경 설정 

37장 x64 프로세서 이야기 
37.1. x64에서 추가/변경된 사항 
37.1.1. 64비트 
37.1.2. 메모리 
37.1.3. 범용 레지스터 in x64 
37.1.4. CALL/JMP Instruction 
37.1.5. 함수 호출 규약 
37.1.6. 스택 & 스택 프레임 
37.2. 실습 - Stack64.exe & Stack32.exe 
37.2.1. Stack32.exe 
37.2.2. Stack64.exe 
37.2. 마무리 

38장 PE32+ 
38.1. PE32+ (PE+, PE64) 
38.1.1. IMAGE_NT_HEADERS 
38.1.2. IMAGE_FILE_HEADER 
38.1.3. IMAGE_OPTIONAL_HEADER 
38.1.4. IMAGE_THUNK_DATA 
38.1.5. IMAGE_TLS_DIRECTORY64 

39장 WinDbg 
39.1. WinDbg 
39.1.1. WinDbg 특징 
39.1.2. WinDbg 실행 
39.1.3. 커널 디버깅 
39.1.4. WinDbg 기본 명령어 

40장 64bit Debugging 
40.1. x64 환경에서의 디버거 선택 627
40.2. 64비트 디버깅 628
40.2.1. 실습 예제 ? WOW64Test 
40.3. PE32 : WOW64Test_x86.exe 
40.3.1. EP 코드 
40.3.2. Startup 코드 
40.3.3. main( ) 함수 
40.4. PE32+ : WOW64Test_x64.exe 
40.4.1. System Breakpoint 
40.4.2. EP 코드 
40.4.3. Startup 코드 
40.4.4. main( ) 함수 
40.5. 마무리 

41장 ASLR 
41.1. Windows Kernel Version 
41.2. ASLR 
41.3. Visual C++ 
41.4. ASLR.exe 
41.4.1. 섹션 정보 
41.4.2. IMAGE_FILE_HEADER \ Characteristics 
41.4.3. IMAGE_OPTIONAL_HEADER \ DLL Characteristics 
41.5. 실습 - ASLR 기능 제거 
41.5.1. ASLR 기능 제거 

42장 Session in Kernel 6 
42.1. 세션 
42.2. Session 0 Isolation 
42.3. 보안 강화 

43장 DLL Injection in Kernel 6 
43.1. DLL 인젝션 실패 재현
43.1.1. 소스코드 
43.1.2. 인젝션 테스트
43.2. 원인 분석 
43.2.1. 디버깅 #1 
43.2.2. 디버깅 #2 
43.3. 실습 - CreateRemoteThread ( ) 성공시키는 방법 
43.3.1. 방법 #1 - CreateSuspended 파라미터 변경 
43.3.2. 방법 #2 - 조건 분기 조작 
43.4. 간단 정리 
43.5. InjectDll_new.exe 
43.5.1. InjectDll_new.cpp 
43.5.2. 인젝션 실습 

44장 InjDll.exe - DLL Injection 전용 도구 
44.1. InjDll.exe 
44.1.1. 사용방법
44.1.2. 사용 예 
44.1.3. 주의사항 

6부 고급 리버싱 

45장 TLS Callback Function 
45.1. 실습 #1 - HelloTls.exe 
45.2. TLS
45.2.1. IMAGE_DATA_DIRECTORY[9] 
45.2.2. IMAGE_TLS_DIRECTORY 
45.2.3. 콜백 함수 주소 배열 
45.3. TLS 콜백 함수 
45.3.1. IMAGE_TLS_CALLBACK
45.4. 실습 #2 - TlsTest.exe 
45.4.1. DLL_PROCESS_ATTACH 
45.4.2. DLL_THREAD_ATTACH 
45.4.3. DLL_THREAD_DETACH 
45.4.4. DLL_PROCESS_DETACH 
45.5. TLS 콜백 디버깅 
45.6. 수작업으로 TLS 콜백 함수 추가하기 
45.6.1. 실습 재료
45.6.2. 설계 
45.6.3. PE 헤더 편집 
45.6.4. IMAGE_TLS_DIRECTORY 구성 
45.6.5. TLS 콜백 함수 프로그래밍 
45.6.6. 최종 완성 
45.7. 마무리 

46장 TEB
46.1. TEB 
46.1.1. TEB 구조체 정의 
46.1.2. TEB 구조체 내용
46.1.3. 중요 멤버 
46.2. TEB 접근 방법
46.2.1. Ntdll.NtCurrentTeb ( ) 
46.2.2. FS 세그먼트 레지스터
46.3. 마무리 

47장 PEB
47.1. PEB 
47.1.1. PEB 접근 방법 
47.1.2. PEB 구조체 정의 
47.1.3. PEB 구조체 내용 
47.2. PEB 중요 멤버 설명 
47.2.1. PEB.BeingDebugged 
47.2.2. PEB.ImageBaseAddress 
47.2.3. PEB.Ldr 
47.2.4. PEB.ProcessHeap & PEB.NtGlobalFlag 
47.3. 마무리

48장 SEH 
48.1. SEH 
48.1.1. 기본 설명 
48.2. SEH 예제 실습 #1
48.2.1. 일반 실행 
48.2.2. 디버거에서 실행 
48.3. OS의 예외 처리 방법 
48.3.1. 일반 실행의 경우 예외 처리 방법 
48.3.2. 디버깅 실행의 경우 예외 처리 방법 
48.4. 예외 
48.4.1. EXCEPTION_ACCESS_VIOLATION(C0000005) 
48.4.2. EXCEPTION_BREAKPOINT(80000003) 
48.4.3. EXCEPTION_ILLEGAL_INSTRUCTION(C000001D)
48.4.4. EXCEPTION_INT_DIVIDE_BY_ZERO(C0000094) 
48.4.5. EXCEPTION_SINGLE_STEP(80000004) 
48.5. SEH 상세 설명 
48.5.1. SEH Chain 
48.5.2. 함수 정의 
48.5.3. TEB.NtTib.ExceptionList 
48.5.4. SEH 설치 방법 
48.6. SEH 예제 실습 #2 (seh.exe) 
48.6.1. SEH 체인 확인 
48.6.2. SEH 추가 
48.6.3. 예외 발생 
48.6.4. 예외 처리기 파라미터 확인 
48.6.5. 예외 처리기 디버깅 
48.6.6. SEH 제거 
48.7. OllyDbg 옵션 설정 
48.7.1. KERNEL32 예외 무시 
48.7.2. 예외를 디버기에게 전달 
48.7.3. 기타 예외 처리 
48.7.4. 간단 실습 
48.8. 마무리 

49장 IA-32 Instruction 
49.1. IA-32 Instruction 
49.2. 용어 정리 
49.2.1. Disassembler 
49.2.2. Decompiler 
49.2.3. Decompile 간단 소개 
49.3. IA-32 Instruction Format 
49.3.1. Instruction Prefixes 
49.3.2. Opcode 
49.3.3. ModR/M 
49.3.4. SIB 
49.3.5. Displacement 
49.3.6. Immediate 
49.4. Instruction 해석 매뉴얼 
49.4.1. IA-32 Manuals 다운로드 
49.4.2. Instruction 해석 메뉴얼 출력 
49.5. Instruction 해석 실습 
49.5.1. Opcode Map 
49.5.2. Operand 
49.5.3. ModR/M 
49.5.4. Group 
49.5.5. Prefix 
49.5.6. 2바이트 Opcode 
49.5.7. Displacement & Immediate 
49.5.8. SIB 
49.6. Instruction 해석 추가 연습 
49.7. 마무리 

7부 Anti-Debugging 

50장 Anti-Debugging 
50.1. 안티 디버깅 기법 
50.1.1. 의존성 
50.1.2. 다양한 기법 
50.2. 안티 안티 디버깅 기법 
50.3. 안티 디버깅 분류 
50.3.1. Static Anti-Debugging 
50.3.2. Dynamic Anti-Debugging 

51장 Static Anti-Debugging 
51.1. Static Anti-Debugging의 목적 
51.2. PEB 
51.2.1. BeingDebugged(+0x2) 
51.2.2. Ldr (+0xC) 
51.2.3. Process Heap(+0x18) 
51.2.4. NtGlobalFlag(+0x68) 
51.2.5. 실습 - StaAD_PEB.exe 
51.2.6. 회피 방법 
51.3. NtQueryInformationProcess ( ) 
51.3.1. ProcessDebugPort(0x7) 
51.3.2. ProcessDebugObjectHandle(0x1E) 
51.3.3. ProcessDebugFlags(0x1F) 
51.3.4. 실습 - StaAD_NtQIP.exe 
51.3.5. 회피 방법 
51.4. NtQuerySystemInformation ( ) 
51.4.1. SystemKernelDebuggerInformation(0x23) 
51.4.2. 실습 - StaAD_NtQSI.exe 
51.4.3. 회피 방법 
51.5. NtQueryObject ( ) 
51.5.1. 실습 - StaAD_NtQO.exe 
51.6. ZwSetInformationThread ( ) 
51.6.1. 실습 - StaAD_ZwSIT.exe 
51.6.2. 회피 방법 
51.7. TLS Callback Function 
51.8. ETC 
51.8.1. 실습 - StaAD_FindWindow.exe 
51.8.2. 회피 방법 
51.9. 마무리 

52장 Dynamic Anti-Debugging 
52.1. Dynamic Anti-Debugging 코드의 목적 
52.2. Exceptions 
52.2.1. SEH 
52.2.2. SetUnhandledExceptionFilter( ) 
52.3. Timing Check 
52.3.1. 시간 간격 측정 방법 
52.3.2. RDTSC 
52.4. Trap Flag 
52.4.1. Single Step 
52.4.2. INT 2D 
52.5. 0xCC Detection
52.5.1. API Break Point 
52.5.2. Checksum 비교 
52.6. 마무리 

53장 Advanced Anti-Debugging 
53.1. 고급 안티 디버깅 기법 
53.2. 가비지 코드 
53.3. Breaking Code Alignment 
53.4. Encryption/Decryption 
53.4.1. 간단한 디코딩 코드의 경우 
53.4.2. 복잡한 디코딩 코드의 경우 
53.4.3. 특수한 경우 - 코드 재조합 
53.5. Stolen Bytes(Remove OEP) 
53.6. API Redirection 
53.6.1. 원본 코드 
53.6.2. API Redirection 예제 #1 
53.6.3. API Redirection 예제 #2 
53.7. Debug Blocker(Self Debugging) 
53.8. 마무리 

8부 디버깅 실습 

54장 디버깅 실습1 - 서비스 
54.1. 서비스 프로세스 동작 원리 
54.1.1. 서비스 제어기 
54.1.2. 서비스 시작과정의 이해 
54.2. DebugMe1.exe 예제 설명 
54.2.1. 서비스 설치 
54.2.2. 서비스 시작 
54.2.3. 소스코드 
54.3. Service 프로세스의 디버깅 이슈 
54.3.1. 문제는 SCM 
54.3.2. 디버거로 안 되는 것은 없다 
54.3.3. 정석대로 해보자 
54.4. 서비스 디버깅 실습 
54.4.1. 그냥 디버깅 - EIP 강제 셋팅 
54.4.2. 서비스 디버깅의 정석 - Attach 방식 
54.5. 마무리 

55장 디버깅 실습2 - Self Creation 
55.1. Self-Creation 
55.2. 동작 원리 
55.2.1. Create Child Process(SUSPEND mode)
55.2.2. Change EIP 
55.2.3. Resume Main Thread 
55.3. 예제 소스코드 설명 
55.4. 디버깅 실습 
55.4.1. 고려 사항 
55.4.2. JIT(Just-In-Time) Debugging 
55.4.3. DebugMe2.exe 
55.5. 마무리 

56장 디버깅 실습3 - PE Image Switching 
56.1. PE Image 
56.2. PE Image Switching 
56.3. 예제 파일 - Fake.exe, Real.exe, DebugMe3.exe 
56.4. 디버깅 1 
56.4.1. Open - 실행 파라미터 입력 
56.4.2. main( ) 
56.4.3. SubFunc_1 ( ) 
56.4.4. CreateProcess(“fake.exe”, CREATE_SUSPENDED) 
56.4.5. SubFunc_2 ( ) 
56.4.6. SubFunc_3 ( ) 
56.5. 디버깅 2 
56.5.1. 아이디어 
56.5.2. EP에 무한루프 설치하기 
56.6. 마무리 

57장 디버깅 실습4 - Debug Blocker
57.1. Debug Blocker 
57.2. 안티 디버깅 특성 
57.2.1. 부모 - 자식 관계
57.2.2. 디버기 프로세스는 다른 디버거(예: OllyDbg)에서 디버깅을 할 수 없습니다. 
57.2.3. 디버거 프로세스를 종료하면 동시에 디버기 프로세스도 종료됩니다. 
57.2.4. 디버거에서 디버기의 코드를 조작합니다. 
57.2.5. 디버기의 예외(Exception)를 디버거에서 처리합니다. 
57.2. 디버깅 실습 - DebugMe4.exe 
57.3. 1차 시도 
57.3.1. 디버깅 시작 위치 선정 
57.3.2. main( ) 
57.4. 2차 시도 
57.5. 3차 시도 
57.6. 4차 시도 
57.7. 5차 시도 
57.7.1. System Break Point 
57.7.2. EXCEPTION_ILLEGAL_INSTRUCTION (1) 
57.7.3. EXCEPTION_ILLEGAL_INSTRUCTION (2) 
57.8. 6차 시도 
57.8.1. 40121D (첫 번째 예외) 
57.8.2. 401299 (두 번째 예외) 
57.9. 7차 시도 
57.9.1. Static 방법 
57.9.2. Dynamic 방법
57.10. 마무리 

책을 마치며
1. 창의성과 경험(바둑과 장기 - 프로그래밍과 리버싱)
바둑과 장기 
프로그래밍과 리버싱 
2. 독자님들께…

Linode is a privately owned virtual private server provider based in Galloway, New Jerse