1.1 리버스 엔지니어링
리버스 엔지니어링이란?
물건이나 기게장치, 시스템의 구조,기능,동작등을 분석하여 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업.
1.2 리버스 코드 엔지니어링
리버스 코드 엔지니어링은 리버싱의 소프트웨어 분야를 일컫는다.
1.2.1 리버싱 방법
실행파일(바이너리) 분석 방법에는 두가지 방법이 있다.
동적 분석과 정적 분석이 있는데,
1) 정적 분석
파일의 겉모습을 관찰하여 분석하는 방법이다. 정적분석에서는 파일을 실행하지 않고, 파일의 종류(EXE,DLL,DOC,ZIP 등) 헤더(PE) 정보 Import/Export API 내부 문자열, 실행압축 여부, 등록정보, 디버깅 정보, 디지털 인증서 등의 다양한 내용을 확인하는 것이다. 또한 디스 어셈블러(Disassembler) 를 이용해서 내부 코드와 그 구조를 확인하는 것도 정적 분석의 범주에 들어간다.
2) 동적 분석
파일을 직접 실행시켜서 그 행위를 분석.
디버깅을 통해 코드의 흐름, 메모리 상태등을 확인하며 분석한다.
- 파일
- 레지스트리(Registry)
- 네트워크(Packet)
등을 관찰하면서 프로그램 내부 구조와 동작 원리를 분석할 수 있다.
1.2.2 Source Code, Hex Code, Assembly Code
리버싱에서 취급하는 대상은 보통 실행 파일이다. C++ 소스코드 빌드를 통해 어떤 식으로 변경되는지 살펴보자.
Source Code
helloworld.cpp
#include "windows.h"
#include "tchar.h"
int _tmain(int argc, TCHAR *argv[]) {
MessageBox(NULL,"Hello World!!","blog.kim82536.pe.kr",MB_OK);
return 0;
}
이 코드를 컴파일 하면 실행파일이 생성되는데, 컴퓨터가 이해할 수 있는 2진수(Binary) 형식으로 되어 있다. 하지만 0 과 1 로 이루어진 바이너리 파일을 보고 직접 보고 의미를 해석하는 것은 매우 힘든 일이다. 따라서 2진수를 16진수 (Hex) 형식으로 변환 시키곤 하는데, 자릿수가 줄어서 보기가 편해지기 때문이다.
(주로 Hex Editor 를 사용한다.)
Assembly Code
사실 Hex Code 는 사람에게 직관적인 형태가 아니다. 따라서 좀 더 이해하기 쉬운 어셈블리 (Assembly) 코드 형태로 보기 위해 디버거로 열어보자.