이번에는 이전 글에서 다루지 못한 .rsrc 섹션에 대해서 알아보도록 하겠다.

[.rsrc 섹션]
이 섹션은 GUI 프로그램에서 많이 볼 수 있는 섹션으로 그래픽 정보를 저장하는 섹션이다.
해당 섹션의 구조는 다른 섹션과는 달리 트리구조로 되어 있으며 이 트리를 구성하는데 있어 각 노드들에는 두가지의 구조체가 있다. IMAGE_RESOURCE_DIRECTORY라는 구조체와 IMAGE_RESOURCE_DIRECTORY_ENTRY 구조체이다.
또 섹션의 트리에는 속하지 않지만 실제 리소스들의 대한 정보를 가지고 있는 IMAGE_RESOURCE_DATA_ENTRY
구조체가 있다.
해당 섹션의 속성정보를 알아본 뒤 각 구조체에 대해서 알아보도록 하겠다.
 - IMAGE_SCN_CNT_INITIALIZED_DATA
 - IMAGE_SCN_MEM_READ

[IMAGE_RESOURCE_DIRECTORY]
해당 구조체는 해당 노드에 대한 정보를 가지고 있는 구조체로, 아래와 같은 형태이다.

[그림 1 - IMAGE_RESOURCE_DIRECTORY 구조체 형태]

 - Characteristics : 속성정보를 나타내지만 현재는 예약 영역으로 쓰이고 있어 항상 0으로 설정되어 있다.
                            크기는 4바이트 이다.

 - TimeDateStamp : 섹션이 컴파일된 날짜와 시간을 의미한다. 하지만 현재 쓰이지 않고 있어 0으로 설정되어 있다.
                             크기는 4바이트 이다.

 - MajorVersion : 리소스의 주버전을 나타낸다. 하지만 현재 쓰이지 않고 있어 0으로 설정되어 있다.
                         크기는 2바이트 이다.

 - MinorVersion : 리소스의 하위버전을 나타낸다. 하지만 현재 쓰이지 않고 있어 0으로 설정되어 있다.
                         크기는 2바이트 이다.

 - NumberOfNameEntries : 해당 노드 다음에 나오는 노드들 중 이름으로 자신을 구별하는 노드들의 개수를
                                       가지고 있다. 크기는 2바이트 이다.

 - NumberOfIdEntries : 해당 노드 다음에 나오는 노드들 아이디로 자신을 구별하는 노드들의 개수를 가지고 있다.
                                 크기는 2바이트 이다.

결국 이 구조체에서는 마지막 2개의 구조체 멤버만 쓰인다. 


[IMAGE_RESOURCE_DIRECTORY_ENTRY]
해당 구조체는 다른 노드나 하위 노드들의 정보와 실제 리소스 데이터를 가지고 있는 구조체이다.
구조체의 형태는 아래와 같다.

[그림 2 - IMAGE_RESOURCE_DIRECTORY_ENTRY 구조체 형태]


 - Name : 만약 엔트리가 이름으로 구별되어질 경우 사용하는 멤버이다. 최상위 1비트가 1로 설정되어 있으며,
               나머지 31비트는 실제 이름스트링을 가리키는 오프셋(RVA)이다. 크기는 4바이트 이다.
* 참고 : 오프셋 위치는 IMAGE_RESOURCE_DIRECTORY부터 시작이다.
 

 - Id : 만약 엔트리가 아이디로 구별되어질 경우 사용하는 멤버이다. 최상위 1비트가 0으로 설정되어 있으며, 하위
         16비트가 정수로 Id를 뜻한다. 크기는 4바이트 이다.

 - OffsetToData : 만약 엔트리가 아이디를 사용하면, 최상위 1비트는 0으로 설정되며, 나머지는 실제 리소스의
                        오프셋이 된다. 만약 또 다른 엔트리를 가리킬 경우, 최상위 1비트는 1로 설정되며, 나머지는
                        오프셋이 되어 또 다른 엔트리를 가리킨다. 크기는 4바이트 이다.


[IMAGE_DIRECTORY_DATA_ENTRY]
해당 구조체는 실제 리소스들이 저장된 위치와 크기, 코드 페이지 등에 대한 정보를 가지고 있다.
아래는 해당 구조체의 형태이다.

[그림 3 - IMAGE_DIRECTORY_DATA_ENTRY 구조체 형태]

 - OffsetToData : 실제 리소스 데이터가 위치해 있는 주소의 RVA값을 가지고 있다. 크기는 4바이트 이다.

 - Size : 리소스 데이터의 크기이며, 단위는 바이트이다. 크기는 4바이트 이다.

 - CodePage : 리소스 데이터의 코드 페이지 값이다. 보통은 유니코드를 사용하며 값은 0으로 설정되어 있다.
                     크기는 4바이트 이다.

 - Reserved : 예약 영역이며, 0으로 채워져 있다. 크기는 4바이트 이다.


이제 각 구조체가 어떻게 트리형태로 구성되는지 알아볼 차례이다.

아래는 각 구조체와 노드가 어떤 형태로 트리구조를 형성하고 있는지 도식화 한 것이다.

[그림 4 - .rsrc 트리구조]


맨 위 루트노드는 각 하위 노드들을 찾는데에만 사용이 되며, 루트 하위 노드들은 각 리소스 타입을 대표하는 노드들로 사용이 된다. IMAGE_RESOURCE_DIRECTORY_ENTRY의 개수에 따라 해당 노드는 NumberOf[Name/ID]Entries의 값이 결정된다.
예를들면 루트 하위 노드들이 이름으로 구분지어 지면 루트노드의 NumberOfNameEntries의 값은 3이 되는 것이다.
* 참고:  .rsrc의 트리구조가 모두 위 이미지처럼 IMAGE_RESOURCE_DIRECTORY_ENTRY의 개수가
          일정한 것은 아니다.



 


'[+] Information > [-] RCE' 카테고리의 다른 글

ARE(Android Reverse Engineering) 환경 소개  (5) 2012.05.05
Oter : Android Revese Engineering Tool  (8) 2012.01.30
PE 구조 (8)  (0) 2012.01.01
PE 구조 (7)  (0) 2012.01.01
PE 구조 (6)  (0) 2011.12.31
이번에는 IMAGE_DATA_DIRECTORY 구조체를 알아볼 차례이다.

WinNT.h를 보면 IMAGE_OPTIONAL_HEADER안에 있지만, 사실은 NT Additional Fields 하부구조체이다.

구조는 아래와 같다.

[그림 1 - 구조체 형태]


WinNT.h에 명시되어 있는 것을 보면 IMAGE_DATA_DIRECTORY의 엔트리 개수는 16개로 정의되어 있다.

[그림 2 - 엔트리 정의]

 
엔트리는 다음과 같이 정의되어 있고, 마지막은 0으로 예약되어 있기 때문에 16개가 되는 것이다.

 [그림 3 - 엔트리 목록]

아래는 notepad.exe의 IMAGE_DATA_DIRECTORY 구조체의 각 엔트리 부분을 표시한 것이다.

표시한 각 부분의 앞쪽 4바이트는 RVA(DWORD VirtualAddress)이며, 뒤쪽 4바이트는 크기(DWORD Size)를

의미한다. 


 [그림 4 - notepad.exe 엔트리 표시]

각 부분에 대한 설명은 주소와 크기로만 나누어지기 때문에 생략하도록 하겠다. 

'[+] Information > [-] RCE' 카테고리의 다른 글

PE 구조 (7)  (0) 2012.01.01
PE 구조 (6)  (0) 2011.12.31
PE 구조 (5)  (0) 2011.12.31
PE 구조 (4)  (0) 2011.12.30
PE 구조 (3)  (0) 2011.12.30
포렌식에서 메모리 분석을 통해 파일을 카빙한다거나 하드디스크 이미지에서 파일을 카빙하여 해당 파일이 무엇인지

분석하려고 할 때 꼭 필요한 지식이기에 이렇게 상세하게 공부를 해 본다.

일반적으로 포렌식에서 파일을 분석 할 경우는 악성코드로 의심되는 파일을 분석하는 경우로 정적분석과 동적분석을 하게

되는데 리버스 엔지니어링 같은 경우에는 정적분석에 속한다.

정적분석을 할 경우 어셈블리어와 메모리 구조 등에 대한 지식도 있어야 하지만, PE구조에 대한 지식도 있어야 하기에

이렇게 상세히 PE 구조를 몇개의 포스팅을 거쳐 알아 볼 것이다.

PE(Portable Executable)파일포맷은 윈도우에 해당하는 파일포맷으로 .exe, .dll, .cpl, .sys, .scr, .drv, .vxd, .ocx 확장자를

가진 파일들에게서 볼 수 있다.

PE 구조를 보다보면 IMAGE로 시작하는 구조체들을 많이 보게 되는데 이는 윈도우에서 실행파일을 IMAGE라는 명칭으로

대신하기 때문에 구조체 이름도 그렇게 지은 것이다.

PE 구조는 간단하게 보면 아래와 같다.

[그림 1 - PE 구조 간단 도식화]

세부적으로 들어가면 많은 양의 구조체들과 구조체 멤버들이 나와 설명하려면 꽤나 많은 분량이 될 것이다.

그렇기에 여러개의 단편으로 나누어 각 부분을 알아 볼 것이다. 

'[+] Information > [-] RCE' 카테고리의 다른 글

PE 구조 (3)  (0) 2011.12.30
PE 구조 (2)  (0) 2011.12.29
PE 구조 (1)  (0) 2011.12.29
Lena's Tutorial 11 상세 분석  (0) 2011.10.13
Lena's Tutorial 9 상세 분석  (0) 2011.10.12

PE분석기라고 하기에 참 뭐한 프로그램이라...

일단은 PE 돋보기라고 해두겠다 ㅋㅋㅋㅋㅋㅋㅋ

PE문서 보면서 공부하던 도중에 실제 값들은 어떤지 궁금해서 한번 짜보았다 ㅋ

Import 함수 리스트 뽑는 기능은 아직 추가를 못했다(군대가기전에는 추가 할 수 있겠지 ㅋㅋ)


별로 어려운건 없다. 구조체변수 선언해서 쭈욱 뽑아주면 끝 ㅡㅡ;;

'[+] Information > [-] System' 카테고리의 다른 글

Windows OS의 구조 및 원리 - 프로세스  (0) 2012.07.08
Windows OS의 구조 및 원리 - 컴퓨터의 역사와 구조  (0) 2012.07.07
PE 돋보기??  (0) 2009.12.12
.htaccess 가지고 놀기  (2) 2009.10.05
Zend Decoding  (8) 2009.10.04

+ Recent posts