[.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]
해당 구조체는 해당 노드에 대한 정보를 가지고 있는 구조체로, 아래와 같은 형태이다.
- Characteristics : 속성정보를 나타내지만 현재는 예약 영역으로 쓰이고 있어 항상 0으로 설정되어 있다.
크기는 4바이트 이다.
- TimeDateStamp : 섹션이 컴파일된 날짜와 시간을 의미한다. 하지만 현재 쓰이지 않고 있어 0으로 설정되어 있다.
크기는 4바이트 이다.
- MajorVersion : 리소스의 주버전을 나타낸다. 하지만 현재 쓰이지 않고 있어 0으로 설정되어 있다.
크기는 2바이트 이다.
- MinorVersion : 리소스의 하위버전을 나타낸다. 하지만 현재 쓰이지 않고 있어 0으로 설정되어 있다.
크기는 2바이트 이다.
- NumberOfNameEntries : 해당 노드 다음에 나오는 노드들 중 이름으로 자신을 구별하는 노드들의 개수를
가지고 있다. 크기는 2바이트 이다.
- NumberOfIdEntries : 해당 노드 다음에 나오는 노드들 아이디로 자신을 구별하는 노드들의 개수를 가지고 있다.
크기는 2바이트 이다.
결국 이 구조체에서는 마지막 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]
해당 구조체는 실제 리소스들이 저장된 위치와 크기, 코드 페이지 등에 대한 정보를 가지고 있다.
아래는 해당 구조체의 형태이다.
- OffsetToData : 실제 리소스 데이터가 위치해 있는 주소의 RVA값을 가지고 있다. 크기는 4바이트 이다.
- Size : 리소스 데이터의 크기이며, 단위는 바이트이다. 크기는 4바이트 이다.
- CodePage : 리소스 데이터의 코드 페이지 값이다. 보통은 유니코드를 사용하며 값은 0으로 설정되어 있다.
크기는 4바이트 이다.
- Reserved : 예약 영역이며, 0으로 채워져 있다. 크기는 4바이트 이다.
이제 각 구조체가 어떻게 트리형태로 구성되는지 알아볼 차례이다.
아래는 각 구조체와 노드가 어떤 형태로 트리구조를 형성하고 있는지 도식화 한 것이다.
맨 위 루트노드는 각 하위 노드들을 찾는데에만 사용이 되며, 루트 하위 노드들은 각 리소스 타입을 대표하는 노드들로 사용이 된다. 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 구조 (7) (0) | 2012.01.01 |
PE 구조 (6) (0) | 2011.12.31 |