1.1. 리버스 엔지니어링
- 일반적인 의미의 리버스 엔지니어링(Reverse Engineering, RE: 역공학): 물건이나 기계장치 혹은 시스템 등의 구조, 기능, 동작 등을 분석하여 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업
1.2. 리버스 코드 엔지니어링
- 리버스 코드 엔지니어링(Reverse Code Engineering, RCE)은 소프트웨어 분야의 리버스 엔지니어링
- RCE, RE, 역공학, 리버싱 등의 용어 사용
- 소프트웨어를 리버싱 관점에서 상세하게 분석한다는 뜻
1.2.1. 리버싱(분석) 방법
- 필자의 경우, 정적 분석으로 정보 수집하면서 해당 프로그램의 구조와 동작 원리에 대해 예측
- 아래 두 가지 방법 잘 활용하면 리버싱 시간 단축 & 효과적인 분석
- 리버싱 =/= 디버깅, 디버깅은 리버싱의 하위 개념
1) 정적 분석
- 파일의 겉모습 관찰하여 분석
- 파일 실행하지 않음
- 파일의 종류(EXE, DLL, DOC, ZIP 등), 크기, 헤더(PE) 정보, Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등의 다양한 내용 확인
- 디스어셈블러를 이용해서 내부 코드와 그 구조 확인
2) 동적 분석
- 파일을 직접 실행시켜서 행위 분석하고 디버깅 통해 코드 흐름과 메모리 상태 등을 자세히 살펴보는 방법
- 파일, 레지스트리, 네트워크 등을 관찰하면서 프로그램 행위 분석
- 디버거 이용해서 프로그램 내부 구조와 동작 원리 분석
1.2.2. Source Code, Hex Code, Assembly Code
Source Code
- 개발 도구(Visual C++ 등)에서 소스코드(.cpp)를 빌드하면 실행 파일(.exe)이 생성됨
Hex Code
- 실행 파일은 컴퓨터가 이해할 수 있는 2진수(Binary) 형식으로 되어 있음
- 해석하기 위해 2진수를 16진수(Hex) 형식으로 변환
- Hex Editor가 binary 형식의 파일을 hex 형식으로 보여주는 유틸리티
Assembly Code
- Hex Code 보다 더 직관적인 형태를 위해 어셈블리 코드 형태로 변환
- 실행 파일을 디버거를 이용해 열면 디스어셈블(Disassemble) 과정을 거쳐 어셈블리 코드로 변환됨
- 일반적인 리버싱 과정에서는 어셈블리 코드 분석
1.2.3. 패치와 크랙
-
패치(patch)
- 프로그램의 파일 혹은 실행 중인 프로세스 메모리의 내용을 변경하는 작업
- 예) Microsoft의 Windows 업데이트
- 목적: 프로그램의 취약점 수저오가 기능 개선 등
-
크랙(crack)
- 패치와 같은 개념이지만 특별히 그 의도가 비합법적이고 비도덕적인 경우
- 목적: 저작권을 침해하는 행위(불법 복제/사용 등)
1.3. 리버싱 준비물
- 리버싱을 왜 배워야 하는지에 대한 스스로의 목표
- 목표를 향해 끈기 있게 나아갈 수 있게 해주는 힘(에너지)인 열정
- 설명이 필요 없는 세계 최고의 검색엔진 구글
1.4. 리버싱 방해물
- 처음부터 모든 것들을 완벽하게 익히겠다는 과욕
- 왜 아직도 못하지 라는 생각을 가지게 하는 조급함
1.5. 리버싱의 묘미
- 소스코드 없이 실행 파일만으로 내부 구조 알 수 있음