동글동글 라이프
FunnyPE 본문
작년 10월 말 부터 12월 초까지 약 한달 반정도 걸린
개인적인 프로젝트입니다.
즐겁게 PE 파일구조를 를 보자 라는 의미에서 만든 Funny PE 입니다 ^^;
¨ 운영체제 : Windows XP Professional
¨ 개발도구 : Microsoft Visual Studio 2008
¨ 개발언어 : Visual C# 2008
일반적으로 EXE 파일을 분석할 때, DLL 의 정보를 분석할 때,
혹은 바이러스를 분석 해야 할 때 PE 구조에 따라 파일을 분석해야 합니다.
이런 실행할 수 있는 파일의 구조는 분석하기가 까다롭고, 보기에도 난해함으로 쉽고 단순하면서,
즐겁게 분석을 하기 위한 프로그램을 구현하기 위해서 이러한 프로그램을 작성하였으며,
한 눈에 PE의 모든 구조를 볼 수 있는 Simple한 Map을 GDI+로 구현하여
PE File 의 전체 구조를 파악 할 수 있도록 하였습니다.
본 프로그램은 윈도우의 실행 파일 Format인 PE(Portable Excutable) File Format 을 분석해주는 도구입니다.
PE File 을 메모리에 올려놓은 뒤, 각각의 클래스를 생성하여 그 정보들을 TreeView를 통해 사용자가
보기 편하도록 구현해 놓았으며, TreeView의 각 세부적인 부분들을 16진수 및 아스키문자로
확인할 수 있도록 구현하였습니다.
각 Header에 관한 핵심적인 정보출력 및 실행파일 내에 위치하는 Section 의 가상 주소 및 실제주소,
그리고 Section의 속성을 조사하여, 실행파일이 패킹이 되어있는지에 대한 여부를 판단하였습니다.
PE 구조에서 dll 의 정보를 확인 가능하며 실제 메모리에 Load되는 위치를 확인 할 수 있으며,
dll에서 사용되는 함수들의 이름까지 확인 가능합니다.
재배치 섹션도 구현하여, Load되는 메모리가 겹쳐질 때, 어떤 방식으로 재배치가 이루어 지는지
확인 할 수 있으며, Resource 정보를 통해 아이콘, 메뉴, 다이얼로그 등등 Resource의 정보들이 확인 가능합니다.
실행파일이 패킹이 되어 있는지에 대한 여부에 따라 기존의 OP Code를 Disassembly가 가능하도록 구현하여,
어셈블리로는 어떤 식으로 코드가 풀어졌는지 확인 할 수 있습니다.
마지막으로 프로그램의 핵심적인 부분으로써 한눈에 PE 구조를 확인할 수 있도록
분석한 파일에 맞춰 전체 구조를 그려주는 PE Viewer 도 구현하였습니다.
시스템적인 구조 적인 부분은 그냥 넘기도록 하고,
프로그램 실행부분을 설명드리겠습니다.
PE File format 파일을 분석하기 위해는 일단 파일을 불러와야 합니다.
파일을 불러오는 방식은 2가지입니다.
첫 번째 방법으로는 폴더이미지를 클릭을 하면 파일열기 대화상자를 이용하여
PE 구조를 가진 파일들을 불러올 수 있으며,
두 번째로는 Drag & Drop 을 이용하여 파일을 프로그램으로 끌어오는 방법이 있습니다.
위 그림은 폴더 이미지를 눌렀을 때의 그림이며,
파일을 선택했을 시에 그 파일에 대하여 분석이 시작됩니다.
이 과정에서 PE 구조가 아닌 파일을 불러 들었을 시에는 PE 구조가 아니라는 경고 창이 뜨며,
PE 구조를 분석하지 않으며, PE 구조일 시에는 각각의 구조체에 따라 분석이 되며,
File Info Tab의 ListView 창에는 C#에서 제공하는 파일 클래스를 사용하여,
파일의 속성, 이름, 사이즈, 생성 시간, 마지막 접근시간 등을 출력했습니다.
PE 구조를 가진 파일의 로드가 끝났을 때,
두 번째 Tab인 PE Analysis 에는 PE의 전체구조를 Treeview로 출력해서 보여주며,
각각의 Header 값들을 클릭했을 시에는 아래에 ListView에는 주소값과,
16진수 값 그리고 ASCII 코드로 출력이 되게 됩니다.
Tab에 오른쪽에 있는 값들은 분석에 있어서 중요한 정보들을 저장시켜 놓았으며,
주로 디버깅을 대신하여 변수의 값들을 Check 할 때 효과적으로 사용하였습니다.
아래쪽에 있는 메모리 출력 Viewer 에서 Offset 의 범위를 지정하여
탐색 아이콘을 누르면 지정한 주소의 범위까지 메모리의 값들을 확인할 수 있습니다.
Tab의 2,3번째인 Headers 와 Section 은 PE 구조를 토대로 중요정보들을 출력해주는 부분입니다.
코드의 처음 실행부분인 Entrypoint 나 메모리에 처음 올라오는 값인 ImageBase
그리고 Image의 Size 등, PE 구조에서 중요한 정보들을 확인하기 쉽도록
하나의 Tab으로 만들어 놓았습니다.
그리고 DATA DIRECTORY에서도 중요한 6가지 정도의 값들의 주소와 Size를 보여줍니다.
Sections Tab 에서는 Section이 있는지 나열해 주며, 각 Section 들의 이름,
가상주소 및 실제주소, 그리고 Size와 속성들까지 출력해줍니다.
Section을 클릭했을 경우 Flag 값을 체크하여 아래에
Check Box 에서 해당되는 값들의 결과값을 알려줍니다.
Section 들의 주소가 같은지 다른지 보여주는 distinction 부분도 함께 구현했으며,
다를 경우에는 어느 정도의 주소의 차이가 나는지도 나타나게 됩니다.
5번째 Tab인 Import & Export 에서는 해당 파일이 어떠한 DLL을 Import 하고 있으며
어떠한 함수들을 사용하고 있는지 나열 해주는 부분으로써
TreeView를 사용하여 각 DLL 에 따른 함수
그리고 그 함수가 가지고 있는 주소까지 확인이 가능합니다.
Export 도 마찬가지로 구조에 따라 Export 하는 값들을 확인 할 수 있습니다.
6번째 Tab인 Relocation 은 주로 DLL 파일이 재배치가 이루어져야 함으로
주로 DLL 파일에서 확인을 할 수 있습니다.
system Architecture 에서 설명된 Relocation에 구조체에 따라
재배치를 수행하는 값에 대해서 TreeView로 확인할 수 있습니다.
이 두 Tab에 관련된 값들을 구하는 방법은 파일을 분석할 당시
각각의 클래스를 모두 작성했기 때문에 쉽게 UI 부분을 완성할 수 있었습니다.
7번째 Tab 인 Resource 를 표현하는 방법에는 많은 고민을 하였는데
IMAGE_RESOURCE_DIRECTORY 에서 DIRECTORY ENTRY 를 접근할 수 있으므로,
3개의 TreeView 를 사용하여, Resource 를 표현하였고, 첫 번째 TreeView 에서
IMAGE_RESOURCE_DIRECTORY 값을 클릭했을 경우에는
두 번째 TreeView 에서 리소스 타입 디렉터리 정보들을 확인 할 수 있도록 하였습니다.
링크를 따라가듯이 다음 값으로 접근할 때 마다 새로운 TreeView 가 그려지며,
마지막 값까지 접근했을 시에는 해당 리소스의 이름과 데이터 엔트리 값을 확인 할 수 있으며,
이 값에 따라 실제 리소스 데이터 값으로도 접근이 가능합니다.
Disassem Tab은 코드의 Entry Point 값과 그 값에 해당되는 Section 을 파악하여
OP 코드를 코드의 Size 만큼 Disassembly 하여 ListView 에 출력하는 부분입니다.
EntryPoint 의 Section 의 속성을 파악하여 그 속성의 값에 따라
파일이 Packing 되었는지 되지 않았는지도 Check 할 수 있습니다.
Packing
OP 코드 그리고 Assembly 를 나열하여 ListView에 뿌려줍니다.
Disassembly Code가 길어질 경우를 대비하여 progressbar 를 연동하여 진행상황을 알 수 있습니다.
Data Abstraction Tab 에서는 이제껏 분석한 정보들을 통해 전체적인 PE File의 구조를 그려줍니다.
GDI+를 사용하여 전체 값들을 출력하였으며,
각각의 구조체에 맞춰서 Header를 그려줬으며, Header의 좌표가 저장되어 있어
그 좌표에 따라 화살표를 그려주는 모듈도 만들어 사용자가 보기 좋도록 출력하는데 노력을 들였습니다.
키보드의 화살표에 따라 투명도 조절이 가능하며,
마우스 휠을 사용하여 이미지의 ZOOM 을 조절하는 기능도 있습니다.
그리고 마우스 클릭을 이용하여 좌표이동이 가능합니다.
왼쪽에 툴바를 삽입하여 Pen 으로 그릴 수 있는 모드와
Move 하는 모드 2가지를 선택할 수 있도록 하였으며,
이미지 파일로 저장도 가능합니다.
모든 기능 중에 가장 신경을 많이 쓴 부분이며,
효율적으로 각각의 PE 구조를 볼 수 있도록 많은 부분을 생각하여 작성하였습니다.
위 그림은 프로그램의 순서도이며, 어떤 방식으로 프로그램의 PE 구조를 분석하는지 보여줍니다.
파일을 불러온 뒤 PE 구조와 관련된 Header 파일들을 분석한 뒤,
그 결과값에 따라 PE 파일인지 Check 한 뒤 계속적으로 분석을 할 것인지의 여부를 판단합니다.
PE 파일일 경우에만 순차적으로 분석을 하며 아닐 경우에는 분석하지 않습니다.
Disassembly 같은 경우에는 Packing의 유무에 따라 Disassembly 코드를 변환을 결정 짓습니다.
=======================================================================================
어디까지나 개인적으로 만든 프로젝트라
코드를 공개하기가 꺼려집니다.
가독성 문제도 있고 너무나 제식대로만 코드를 짜서 ^^;;
프로그램은 원하는 분들에게만 배포할 생각이며,
PE에 관심있으신 분들은 저에게 문의 주시기 바랍니다.
감사합니다 :)
=======================================================================================
프로그램 실행파일
잔버그가 많네요 ㅠ_ㅠ
추후에 기회가 된다면 유지보수하겠습니다 :)
'Project' 카테고리의 다른 글
사용자 분석을 위한 포렌식 도구 Winproof (17) | 2011.03.07 |
---|---|
[Bada Developer Challenge ] Contacts Ranking (1) | 2010.09.02 |
Digital Forensic Tool Winproof (2) | 2010.07.25 |
The Contents for Studying English using American TV Dreamas (4) | 2010.06.08 |
Google Distance + TTA + KNN (1) | 2010.03.11 |