목차

1부 리버싱 101

1장 기초
    리버스 엔지니어링
    소프트웨어 리버스 엔지니어링: 리버싱
    리버싱 적용
        보안 관련 리버싱
            악성코드 소프트웨어
            암호 알고리즘 리버싱
            디지털 저작권 관리
            프로그램 바이너리 감사
        소프트웨어 개발에서의 리버싱
            소프트웨어 간의 상호 운용
            경쟁 제품 분석
            소프트웨어의 품질과 안정성 측정
    로우레벨 소프트웨어
        어셈블리 언어
        컴파일러
        가상 머신과 바이트 코드
        운영체제
    리버싱 절차
        시스템 레벨 리버싱
        코드 레벨 리버싱
    사용 툴
        시스템 모니터링 툴
        디스어셈블러
        디버거
        디컴파일러
    리버싱은 합법적인 작업인가
        상호 운용성
        경쟁
        저작권법
        영업 비밀과 특허권
        디지털 밀레니엄 저작권법
        DMCA 사례
        사용권 계약
    예제 코드와 툴
    정리

2장 로우레벨 소프트웨어
    하이레벨 관점
        프로그램 구조
            모듈
            공통 구성 요소
        데이터 처리
            변수
            사용자 정의 데이터 구조체
            리스트
        제어 흐름
        하이레벨 언어
            C
            C++
            자바
            C#
    로우레벨 관점
        로우레벨 데이터 처리
            레지스터
            스택
            힙
            실행 데이터 섹션
        제어 흐름
    어셈블리 언어 입문
        레지스터
        플래그
        명령 포맷
        기본 명령
            데이터 이동
            산술 연산
            비교 연산
            조건 분기
            함수 호출
        코드 예
    컴파일러 기초
        컴파일러란
        컴파일러 아키텍처
            프런트엔드
            중간 표현
            최적화기
            백엔드
        리스팅 파일
        사용 컴파일러
    실행 환경
        소프트웨어 실행 환경(가상 머신)
            바이트 코드
            인터프리터
            Just-in-Time 컴파일러
            리버싱 전략
        최신 프로세서에서의 하드웨어 실행 환경
            Intel NetBurst
            μops(Micro-Ops)
            파이프라인
            분기 예측
    정리

3장 윈도우 기초
    컴포넌트와 기본 아키텍처
        간략한 역사
        특징
        지원 하드웨어
    메모리 관리
        가상 메모리와 페이징
            페이징
            페이지 폴트
        워킹 셋
        커널 메모리와 유저 메모리
        커널 모드 공간
        섹션 객체
        VAD 트리
        유저 모드 메모리 할당
        메모리 관리 API
    객체와 핸들
        네임드 객체
    프로세스와 스레드
        프로세스
        스레드
        컨텍스트 스위칭
        동기화 객체
        프로세스 초기화 과정
    애플리케이션 프로그래밍 인터페이스
        Win32 API
        네이티브 API
        시스템 콜 메커니즘
    실행 포맷
        기본 개념
        이미지 섹션
        섹션 정렬
        동적 링크 라이브러리
        헤더
        임포트와 익스포트
        디렉터리
    입력과 출력
        I/O 시스템
        Win32 서브시스템
            객체 관리자
    구조화된 예외 처리
    정리

4장 리버싱 툴
    다양한 리버싱 방법
        오프라인 코드 분석(Dead-Listing)
        라이브 코드 분석
    디스어셈블러
            IDA Pro
        ILDasm
    디버거
        유저 모드 디버거
            OllyDbg
            WinDbg를 이용한 유저 모드 디버깅
            IDA Pro
            PEBrowse Professional Interactive
        커널 모드 디버거
            WinDbg를 이용한 커널 모드 디버깅
            Numega SoftICE
            가상 머신에서의 커널 디버깅
    디컴파일러
    시스템 모니터링 툴
    패치 툴
        Hex Workshop
    기타 리버싱 툴
        실행 이미지 덤프 툴
            DUMPBIN
            PEView
            PEBrowse Professional
    정리

2부 리버싱 응용

5장 리버싱 실전
    리버싱과 상호운용성
    기본 원칙
    문서화되지 않은 API를 찾는 방법
        찾고자 하는 것
    사례 연구: NTDLL.DLL의 Generic Table API
        RtlInitializeGenericTable
        RtlNumberGenericTableElements
        RtlIsGenericTableEmpty
        RtlGetElementGenericTable
            셋업과 초기화
            로직과 구조
            검색 루프 1
            검색 루프 2
            검색 루프 3
            검색 루프 4
            소스코드 추출
        RtlInsertElementGenericTable
            RtlLocateNodeGenericTable
            RtlRealInsertElementWorker
            Splay 트리
        RtlLookupElementGenericTable
        RtlDeleteElementGenericTable
        분석한 내용 종합
    정리

6장 파일 포맷 분석
    Cryptex
    Cryptex 사용
    Cryptex 리버싱
    패스워드 검증 과정
        “Bad Password” 메시지 잡아내기
        패스워드 변환 알고리즘
        패스워드 해싱
    디렉터리 구조
        디렉터리 처리 코드 분석
        파일 엔트리 분석
    디렉터리 구조 덤프
    파일 추출 과정
        파일 목록 검색
        파일 복호화
        부동소수점 연산
        복호화 루프
        해시 값 검증
    정리
    좀 더 자세히
    결론

7장 프로그램 바이너리 감사
    문제점 정의
    보안 취약점
        스택 오버플로우
            간단한 스택 보안 취약점
            내부 구현
            스택 검사
            비실행 가능 메모리
        힙 오버플로우
        문자열 필터
        정수 오버플로우
            사용자 입력 정수에 대한 산술 연산
        형 변환 에러
    사례: IIS 인덱싱 서비스 보안 취약점
        CVariableSet::AddExtensionControlBlock
        DecodeURLEscapes
    정리

8장 악성코드 리버싱
    악성코드의 종류
        바이러스
        웜
        트로이 목마
        백도어
        모바일 코드
        애드웨어/스파이웨어
    스틱키 소프트웨어
    미래의 악성코드
        정보 탈취 웜
        바이오스/펌웨어 악성코드 331
    악성코드의 목적
    악성코드 취약점
    다형성
    변종
    안전한 리버싱 환경 구축
    Backdoor.Hacarmy.D
        실행 파일 언패킹
        최초 실행
        설치
        네트워크 연결
        서버에 연결
        채널에 접속
        백도어와 통신
        SOCKS4 서버 실행
        자체 제거
    Backdoor.Hacarmy.D: 명령 레퍼런스
    정리

3부 크래킹

9장 저작권 침해와 불법 복사 방지
    저작권
    사회적 측면
    소프트웨어 저작권 침해
        문제 정의
        보안 결함
        필요 조건
        이론적으로 크랙이 불가능한 모델
    보호 유형
        매체 기반 보호
        시리얼 번호
        질의 응답과 온라인 인증
        하드웨어 기반의 보호
        서비스로서의 소프트웨어
    진보된 보호 개념
        크립토 프로세서
    디지털 저작권 관리
        DRM 모델
            윈도우 미디어 저작권 관리자
            시큐어 오디오 패스
    워터 마크
    신뢰 컴퓨팅
    복사 방지 기술 공격
    정리

10장 안티 리버싱 기술
    안티 리버싱이 필요한 이유
    기본적인 안티 리버싱 방법
    심볼 정보 제거
    코드 암호화
    안티 디버거 기술
        디버거 기본
        IsDebuggerPresent API
        SystemKernelDebuggerInformation
        싱글 스텝 인터럽트를 이용한 SoftICE 탐지
        트랩 플래그
        코드 체크섬
    안티 디스어셈블러
        선형 스윕 디스어셈블러
        Recursive Traversal 디스어셈블러
        적용
    코드 난독화
    제어 흐름 변환
        Opaque Predicates
        안티 디컴파일러
        Table Interpretation
        인라인닝과 아웃라이닝
        인터리빙 코드
        순서 변환
    데이터 변환
        변수 인코딩
        배열 재구성
    정리

11장 보호 기술 파괴
    패치
    Keygen
    키 생성 알고리즘 추출
    고급 크래킹: Defender
        Defender의 초기화 루틴 리버싱
        복호화된 코드 분석
        사라진 SoftICE
        스레드 리버싱
        “Killer” 스레드 무력화
        KERNEL32.DLL 로딩
        함수 재암호화
        엔트리 포인트로 다시 돌아가서
        프로그램 파라미터 파싱
        사용자 이름 처리
        사용자 정보 검증
        코드 복호화
        Defender에 대한 무작위 대입
    Defender의 보호 기술
        함수 레벨의 암호화
            상대적으로 강력한 암호 블록 체인
            재 암호화
        애플리케이션/운영체제와의 인터페이스 난독화
        프로세서 타임 스탬프 검증 스레드
        실행 시에 복호화 키 생성
            상호 의존 키
            사용자 입력 기반의 복호화 키
        인라이닝
    정리

4부 디스어셈블리 너머

12장 닷넷 리버싱
    기반 지식
    닷넷 기본
        매니지드 코드
        닷넷 프로그래밍 언어
        공통 타입 시스템
    중간 언어
        평가 스택
        활성화 레코드
        IL 명령
        IL 코드 샘플
            Counting Items
            링크드 리스트 샘플
    디컴파일러
    난독기
        심볼 이름 변경
        제어 흐름 변경
        디컴파일과 디스어셈블리 차단
    난독화된 코드 리버싱
        XenoCode
        Preemptive Solutions의 DotFuscator
        Remotesoft 난독기와 링커
        Remotesoft Protector
        어셈블리 프리컴파일
        어셈블리 암호화
    정리

13장 디컴파일
    네이티브 코드 디컴파일
    전형적인 디컴파일러의 구조
    중간 표현
        표현식과 표현식 트리
        제어 흐름 그래프
    프론트엔드
        의미 분석
        제어 흐름 그래프 생성
    코드 분석
        데이터 흐름 분석
            단일 정적 할당
            데이터 전달
            레지스터 변수 구별
            데이터 타입 전달
        타입 분석
            기본 데이터 타입
            복잡한 데이터 타입
        제어 흐름 분석
        라이브러리 함수의 구별
    백엔드
    실제 IA-32 디컴파일러
    정리

부록 A 코드 구조 해석
부록 B 컴파일된 연산의 이해
부록 C 프로그램 데이터 해석
부록 D 인용문