리버스 엔지니어링에서는 소프트웨어를 분석하기 위해 사용하는 분석 방법들을 크게 정적 분석(Static Analysis)과 동적 분석(Dynamic Analysis)으로 구분한다.
프로그램을 실행시키지 않고 분석하는 방법.
프로그램의 전체 구조를 파악하기 쉽다.
프로그램이 어떤 함수로 구성됐고 함수들은 서로 어떤 호출 관계를 갖는지, 어떤 API를 사용하고 어떤 문자열을 포함하는지 등을 종합적으로 볼 수 있다.
분석 환경의 제약에서 비교적 자유롭다.
실행을 전제로 하는 동적 분석을 윈도우 환경에서 apk를 대상으로 하기는 다소 번거롭다. 그러나 정적 분석은 적절한 도구만 갖춘다면 시도할 수 있다.
바이러스와 같은 악성 프로그램의 위협으로부터 안전하다.
동적 분석의 경우 바이러스를 실제로 실행해야 하므로 감염될 우려가 있지만 정적 분석은 프로그램을 실행하지 않고 분석하므로 이런 걱정을 하지 않아도 된다.
난독화(Obfuscation)가 적용되면 분석이 매우 어려워진다.
최근 많은 개발자가 자신의 소프트웨어를 리버싱으로부터 보호하기 위해 난독화 기법을 사용한다. 난독화가 적용되면 실행 흐름을 파악하기가 어려워진다.
다양한 동적 요소를 고려하기 어렵다.
프로그램은 실행 중 영향을 주고 받는 여러 함수로 구성되기 때문에 어떤 함수가 특정 시점에 정확히 어떤 인자와 어떤 전역 변수를 가지고 실행될지는 정적으로 알기 어렵다.
IDA를 이용하여 프로그램을 열면,,
프로그램의 어셈블리 코드를 살펴볼 수 있다.
IDA는 문자열이나 함수를 어디에서 사용하는지를 보여주는 상호 참조(Cross Reference)기능이나 함수의 실행 흐름을 보기 쉽게 해주는 제어 흐름 그래프(Control Flow Graph) 등을 통해 분석가가 프로그램을 쉽게 이해할 수 있도록 돕는다.
프로그램을 실행시키면서 분석하는 방법.
if (is_debugging()) // 디버깅인지 확인
exit(-1); // 프로그램 종료
Func();
대표적인 동적 분석 도구로는 디버거 중 하나인 x64dbg가 있다.
디버거는 프로그램의 버그를 찾아내고 제거하기 위해 사용되는 도구인데, 이를 이용하면 실행 중인 어셈블리 코드, CPU의 레지스터(Register) 상태, 메모리(Memory)와 스택(Stack)의 값을 확인하며 분석을 진행할 수 있다.