일반적인 의미에서 리버스 엔지니어링(Reverse Engineering; 역공학)이라고 하면 물건이나 기계장치 혹은 시스템 등의 구조, 기능, 동작 등을 분석하여 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업이라고 할 수 있습니다.
리버스 코드 엔지니어링(Reverse Code Engineering)이란 소프트웨어 분야에서의 리버스 엔지니어링이라 생각하면 된다. 아직 용어정립이 안되어 RCE, RE, 리버싱, 역공학 등을 막 섞어 사용하고 있으며 이 책에서도 리버싱, 분석, 상세분석 등으로 리버스 엔지니어링을 표현한다.
분석 방법은 크게 두가지로 나눌 수 있다. 정적분석, 동적분석.
파일의 겉모습을 보고서 분석하는 방법이다. 정적 분석 단계에서는 프로그램을 실행하지 않음.
파일의 종류(EXE, DLL, DOC, ZIP 등), 크기, 헤더 정보, Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등의 다양한 내용을 확인한다. 또, 디스어셈블러(Disassembler)를 활용하여 내부 코드를 확인하는 것도 정적분석에 범주에 들어갈 수 있다.
정적분석 방법으로 얻은 정보는 추후 동적분석을 할 때 유용하게 쓰임
파일을 직접 실행시켜서 그 동작과 행위를 분석하고, 디버깅을 통하여 코드 흐름과 메모리 상태 등을 자세히 살펴보는 방법이다. 파일, 레지스트리(Registry), 네트워크 등을 관찰하면서 프로그램 행위를 분석한다. 또, 디버거(Debugger)를 이용하여 프로그램 내부 구조와 동작원리를 분석할 수 있다.
정적분석으로 정보 수집 → 프로그램 구조와 동작원리 예측 → 동적 분석하며 프로그램 행위 분석.
※ 리버싱 ≠ 디버깅
분석하는 파일은 보통 실행파일
분석할 때는 소스코드 없이 바이너리 자체를 분석.
⇒ 소스코드와 바이너리 코드의 관계를 알면 리버싱에 도움됨.