역분석 – 디컴파일러(Dicompiler)

대다수의 디어셈블러들이 디컴파일(컴파일된 파일을 소스코드로 변환 하는 기능)과 디어셈블리(어셈블리로 변환하여 분석하는 기능)을 함께 지원한다. 이렇다 보니 디어셈블러와 디컴파일러의 구분이 애매할 수 있다. 그래서 이 책에서는 컴파일된 파일을 소스코드로 해석이 가능하지만, 분석(브레이크 포인트 같은 프로그램 상태 제어) 기능은 없는 도구들를 디컴파일러로 구분해 보았다. 디컴파일러는 앞서 얘기하였듯, 실행 파일을 개발단계인 소스코드로 변환해 주는 역할을 한다.

대부분의 디컴파일러는 실행 파일의 컴파일 언어에 종속적이기 때문에 컴파일 언어를 확인할 필요가 있다(언어별 디컴파일 가능 도구가 다르다).

아래 PEiD를 이용하여 컴파일된 언어를 확인할 수 있으니, 유용하게 이용하기 바란다.

http://www.peid.info/

[그림] PEiD: Visual C++ 5.0으로 컴파일 하였음을 알 수 있다

PEiD를 사용하는 이유는 프로그램에 사용된 언어를 사전에 확인하여, 언어별 코드의 차이점을 사전에 인지하여 해당 디컴파일러를 사용할 수 있고, 만약 패킹(Packing, 프로그램 코드 암호화로 4부에서 다룬다) 되어 있을 경우, 일반적으로 알려진 패킹 프로그램이라면, 해당 패킹 프로그램에 대한 정보도 얻을 수 있으며, 파일 구조 정보 등 유용한 정보들도 많이 얻을 수 있기 때문에 파일 분석 시에 적용하여 활용하도록 하자. 그럼 이러한 작업을 도와주는 도구로 어떠한 것들이 있는지 확인해 보자.

C/C++

그럼 C/C++로 컴파일된 프로그램을 디컴파일할 수 있는 프로그램을 먼저 알아보자. 해당 디컴파일러의 디컴파일을 확인하기 위해 앞서 컴파일한 Hello_vc.exe를 이용하자.

hello_vc.cpp
#include
<stdio.h>

int main(void)

{

printf(“Hello, world\n”);

return 0;

}

[예제] C/C++ 디컴파일 테스트 소스코드

IDA Hex-Rays

IDA의 플러그인 기능 중 Hex-Rays가 제공하는 Pseudocode 기능은 정말 막강하다고 할 수 있다. 대다수 IDA로 분석 가능한 코드를 C언어로 재해석하여 변환하여 준다.

이는 역분석가의 가독성을 높일 수 있기 때문에 역분석 진행 시에도 매우 유용하게 사용할 수 있다. 단 Hex-Rays 플러그인은 유료 버전으로, 사용하고자 한다면 구입해야 한다. 관련 정보는 아래 사이트에서 얻을 수 있으며, F5키는 현재 보고 있는 프로시저, Ctrl+F5키를 통해 프로그램 전체를 Pseudocode(개발 당시의 실제 코드가 아닌, 일반적인 언어로 변환하여 유사하게 흉내 낸 코드로, 동작 흐름을 이해하는 용도로 많이 사용된다)로 변환할 수 있다.

http://hex-rays.com/

C/C++ 디컴파일 테스트 소스코드를 컴파일하고 IDA로 파일을 열고 Hex-Rays 플러그인 단축키 F5키를 눌려 디컴파일을 진행해 보자(기본적으로는 함수 단위로 디컴파일된다. 전체 디컴파일 진행은 Shift+F5키로 진행할 수 있다).

[그림] 대다수의 코드 변환이 가능하다.

Boomerang

부메랑(Boomerang)은 C언어 컴파일러로서, 기계어를 C언어로 디컴파일하는 작업을 도와준다.

부메랑을 이용해 보면, 어셈블리로 역분석하여 C언어로 코드를 생성하는 과정을 GUI를 통해 확인할 수 있다. 하지만 2006년도 이후 새로운 업데이트가 되고 있지 않아, 디컴파일 능력은 우수하지 않다. 부메랑은 아래 사이트에서 다운로드 가능하다.

http://boomerang.sourceforge.net/

부메랑에서도 C/C++ 디컴파일 테스트 소스코드를 컴파일하고 이를 비교해 보자.

컴파일한 파일을 부메랑을 통해 파일을 열고 디컴파일을 진행하면 아래와 같이 어셈블리 수준의 프로그램 분석을 해준다. 정확한 내용을 알아보기에는 조금 무리가 있다.

[그림] 어셈블리 수준으로 변환된다

REC(Reverse Engineering Compiler)

REC는 C언어 디컴파일러임과 동시에 역분석에 필요한 PEHeader와 헥스값 등을 확인할 수 있는 유용한 도구이다. 2012년 현재에도 버전 업데이트를 계속 진행하고 있으며, 어셈블리 능력이 매우 우수하다. 디컴파일을 진행하는 코드 역시 원 코드와 많은 차이를 보이지 않으므로 무료로 이용할 수 있는 유용한 분석 도구라 할 수 있다.

http://www.backerstreet.com/rec/rec.htm

C/C++ 디컴파일 테스트 소스코드를 컴파일하고 이를 비교해 보자. 코드를 확인하는 데 큰 어려움이 없고 디어셈블리부터 파일의 코드 정보를 다각도로 분석하여, 분석시 유용할 것이라 판단된다.

[그림 탭 구분을 통해 다양한 정보를 한눈에 확인 가능하다

NET (C#)

이제 닷넷 언어로 개발된 프로그램에 대한 디컴파일에 대해 알아보자.

helloc#.cs
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class
Program

{

static
void Main(string[] args)

{

string Hello = “Hello, C#”;

Console.WriteLine(Hello);

}

}

}

[예제] .NET(C#) 디컴파일 테스트 소스코드

위 코드를 컴파일하고 다음 소개하는 닷넷 언어 디컴파일러에서 디컴파일을 진행해보자.

VB Decompiler

VB언어로 컴파일한 언어를 디컴파일할 수 있는 도구로, 닷넷(.NET) 기반 언어도 컴파일이 가능하다. 현재 유료 버전으로 제공하고 있으며, 무료 버전의 경우, 문자열과 일부 코드 해석의 기능 제한이 있다. 아래 사이트에서 다운로드하여 사용할 수 있다.

http://www.vb-decompiler.org/

VB Decompiler의 특징 중 하나는 Ollydbg와 연계하여 사용할 수 있는 MAP 파일을 생성할 수 있다는 것이다. 맵 파일은 프로그램 내의 데이터 영역 구분 정보(라벨), 설명(코멘트) 등을 저장하여 공유할 수 있어 다룬 도구를 이용하여 역분석 시 분석가에게 도움을 준다.

.NET(C#) 디컴파일 테스트 프로그램을 이용해 디컴파일을 진행해보자.

[그림] Save procedures list를 이용해 맵 파일을 생성해 영역 구분 정보를 제공할 수 있다

Save procedures list를 누른 후 형식을 MAP으로 변경하고 파일을 저장할 수 있다. 그리고 Ollydbg를 이용하여 파일을 열고, 플러그인 Mapconv (http://www.openrce.org/downloads/details/112/MapConv)를 이용해 로드 할 수 있지만, Ollydbg 1.10 버전은 닷넷 디버깅은 정상적으로 수행하지 못한다. 따라서 닷넷 프로그램인 경우 IDA를 이용하거나 수동으로 MAP파일의 내용을 확인하여야 한다.

[그림] Mapconv를 이용해 MAP파일 로드가 가능하다

IDA에서도 File
à
Produce file 메뉴를 이용해서 생성할 수 있다.

[그림] IDA를 이용해서 맵파일 생성

.NET Reflector

닷넷 기반 디컴파일러 중 제일 강력한 디컴파일 능력을 가지고 있다.

디컴파일 결과 코드와 거의 원본 코드가 같을 정도의 수준으로, 닷넷 디컴파일러로 뛰어나다. 아래 사이트에서 구할 수 있으며, 30일간 테스트 버전으로 사용할 수 있다. 닷넷 디컴파일러로 다른 제품들도 존재하지만, 이 도구 하나로도 충분할 것으로 판단된다.

http://www.reflector.net/

.NET(C#) 디컴파일 테스트 프로그램을 이용해 디컴파일을 진행해보자. 원본 소스코드과 거의 동일한 내용으로 디컴파일을 해낸다.

[그림] 테스트 프로그램 디컴파일 내용, 작성했던 코드와 거의 일치한다

ILSpy

.NET Reflector와 함께 많이 사용되는 디컴파일 프로그램으로써, 오픈 소스로 누구나 사용할 수 있다.

http://www.ilspy.net/

[그림] 무료로 많이 사용된다

그외

윈도우 개발언어로 많은 비중을 차지하지는 않는 언어인 델파이와 자바의 디컴파일러에 대해서도 알아보도록 하자.

DeDe – 델파이

델파이 언어 디컴파일러로 세부적인 개체로 구분하여 확인할 수 있는 특징이 있다.

이 도구를 단독으로 이용하기보다는, 디버깅 도구와 함께 이용하면, 빠른 분석을 진행할 수 있다.

활용 예를 든다면, 본인이 에러 코드 401을 호출하는 어셈블리 단계에서 프로그램에 브레이크 포인트를 설정하고자 한다면, 이를 디버깅 도구만으로 진행하게 되면, 해당 코드까지 분석을 순차적으로 진행하여야 하지만, 아래 프로그램을 이용하면 에러 코드 401 UI를 바로 찾아 해당 어셈블리 시작 코드를 확인할 수 있다. 이와 같이 병행하여 사용하면, 역분석에 소비하는 시간을 대폭 단축시킬 수 있다.

현재 개발사 사이트는 존재하지 않고, 아래 해외 프로그램 다운로드 사이트에서 다운로드 가능하다.

http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/DeDe.shtml

[그림] 개체 단위로 확인할 수 있는 편리성을 제공한다

DJ Java Decompiler – Java

자바는 Class라는 확장자를 사용하는데, 이 역시 디컴파일을 진행할 수 있다. 아래 위치에서 다운로드하여 시험판으로 사용할 수 있다.

http://www.dotster.com/dotster/sites/?referrer=FortuneCity

자바 디컴파일을 테스트하기 위해 아래 링크를 방문하면 SE 버전을 받아 간단한 프로그램을 만들어 디컴파일을 해볼 수 있는데, 필자는 위 홈페이지에서 제공하는 JDK Demos and Samples을 다운로드하여 테스트 해보았다.

http://www.oracle.com/technetwork/java/javase/downloads/index.html

[그림] 데모 원본 코드와 디컴파일코드 비교

디컴파일러들은 사용법이 어렵지 않지만, 최근에는 안티 디버깅 기술이 많이 발전하면서 디컴파일러로 소스코드를 추출할 수 있는 프로그램이 많지 않다. 하지만 아직까지는 여러 프로그램에 적용하여 사용할 수 있을 것이며, 파일에 적용된 안티 디버깅을 해제하였다면, 디컴파일을 이용할 수 있으므로, 사용법을 알아 두었다가 이용해 보기 바란다.

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.