리버싱 핵심원리

고객평점
저자이승원
출판사항인사이트, 발행일:2018/01/17
형태사항p.1030 B5판:24
매장위치컴퓨터부(B2) , 재고문의 : 051-816-9500
ISBN9788966260522 [소득공제]
판매가격 48,000원   43,200원  (인터넷할인가:10%)
포인트 2,160점
배송비결제주문시 결제
  • 주문수량 

총 금액 : 0원

책 소개

▣ 출판사서평

리버서라면 꼭 알아야 할 핵심 원리를 모두 담았다!

리버싱이란 프로그램의 내부를 깊이 들여다보고 조작할 수 있는 기법이다. 이는 우리가 흔히 사용하는 상용 프로그램 등에도 가능하기 때문에 해킹의 방법으로 응용될 수 있다. 하지만 역시 리버싱은 일명 ‘리버서’라 불리는 악성 코드 분석가들의 특기이기도 하다. 무엇보다 리버싱 기법은 해커와 보안 전문가의 대결로만 이용되는 것은 아니다. 리버싱을 잘 활용하면 개발/테스트 단계에서 미처 발견하지 못한 버그나 취약점도 파악할 수 있고, 파일이나 메모리에 직접 접근하여 문제를 해결할 수 있다. 또한 전혀 새로운 기능을 추가해 프로그램의 기능을 향상시킬 수도 있어 매우 유용하다.

이 책은 이런 마법 같은 일들이 가능한 ‘리버싱’에 필요한 핵심 원리를 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. 독자님들께…

작가 소개

목 차

역자 소개

01. 반품기한
  • 단순 변심인 경우 : 상품 수령 후 7일 이내 신청
  • 상품 불량/오배송인 경우 : 상품 수령 후 3개월 이내, 혹은 그 사실을 알게 된 이후 30일 이내 반품 신청 가능
02. 반품 배송비
반품 배송비
반품사유 반품 배송비 부담자
단순변심 고객 부담이며, 최초 배송비를 포함해 왕복 배송비가 발생합니다. 또한, 도서/산간지역이거나 설치 상품을 반품하는 경우에는 배송비가 추가될 수 있습니다.
상품의 불량 또는 오배송 고객 부담이 아닙니다.
03. 배송상태에 따른 환불안내
환불안내
진행 상태 결제완료 상품준비중 배송지시/배송중/배송완료
어떤 상태 주문 내역 확인 전 상품 발송 준비 중 상품이 택배사로 이미 발송 됨
환불 즉시환불 구매취소 의사전달 → 발송중지 → 환불 반품회수 → 반품상품 확인 → 환불
04. 취소방법
  • 결제완료 또는 배송상품은 1:1 문의에 취소신청해 주셔야 합니다.
  • 특정 상품의 경우 취소 수수료가 부과될 수 있습니다.
05. 환불시점
환불시점
결제수단 환불시점 환불방법
신용카드 취소완료 후, 3~5일 내 카드사 승인취소(영업일 기준) 신용카드 승인취소
계좌이체 실시간 계좌이체 또는 무통장입금
취소완료 후, 입력하신 환불계좌로 1~2일 내 환불금액 입금(영업일 기준)
계좌입금
휴대폰 결제 당일 구매내역 취소시 취소 완료 후, 6시간 이내 승인취소
전월 구매내역 취소시 취소 완료 후, 1~2일 내 환불계좌로 입금(영업일 기준)
당일취소 : 휴대폰 결제 승인취소
익월취소 : 계좌입금
포인트 취소 완료 후, 당일 포인트 적립 환불 포인트 적립
06. 취소반품 불가 사유
  • 단순변심으로 인한 반품 시, 배송 완료 후 7일이 지나면 취소/반품 신청이 접수되지 않습니다.
  • 주문/제작 상품의 경우, 상품의 제작이 이미 진행된 경우에는 취소가 불가합니다.
  • 구성품을 분실하였거나 취급 부주의로 인한 파손/고장/오염된 경우에는 취소/반품이 제한됩니다.
  • 제조사의 사정 (신모델 출시 등) 및 부품 가격변동 등에 의해 가격이 변동될 수 있으며, 이로 인한 반품 및 가격보상은 불가합니다.
  • 뷰티 상품 이용 시 트러블(알러지, 붉은 반점, 가려움, 따가움)이 발생하는 경우 진료 확인서 및 소견서 등을 증빙하면 환불이 가능하지만 이 경우, 제반 비용은 고객님께서 부담하셔야 합니다.
  • 각 상품별로 아래와 같은 사유로 취소/반품이 제한 될 수 있습니다.

환불불가
상품군 취소/반품 불가사유
의류/잡화/수입명품 상품의 택(TAG) 제거/라벨 및 상품 훼손으로 상품의 가치가 현저히 감소된 경우
계절상품/식품/화장품 고객님의 사용, 시간경과, 일부 소비에 의하여 상품의 가치가 현저히 감소한 경우
가전/설치상품 전자제품 특성 상, 정품 스티커가 제거되었거나 설치 또는 사용 이후에 단순변심인 경우, 액정화면이 부착된 상품의 전원을 켠 경우 (상품불량으로 인한 교환/반품은 AS센터의 불량 판정을 받아야 합니다.)
자동차용품 상품을 개봉하여 장착한 이후 단순변심의 경우
CD/DVD/GAME/BOOK등 복제가 가능한 상품의 포장 등을 훼손한 경우
내비게이션, OS시리얼이 적힌 PMP 상품의 시리얼 넘버 유출로 내장된 소프트웨어의 가치가 감소한 경우
노트북, 테스크탑 PC 등 홀로그램 등을 분리, 분실, 훼손하여 상품의 가치가 현저히 감소하여 재판매가 불가할 경우