하이브의 구조를 파악함으로써 비할당영역이나, 메모리등에서 하이브를 추출(카빙)할 수 있게 되고, 해당 하이브가 어떠한 이름을 가지고 있는지 어떠한 데이터를 가지고 있는지 파악 할 수 있게 된다.
하이브의 파일 구조 베이스블록, 하이브빈, 셀, 셀맵으로 이루어져 있다.
이해가 빠르도록 그림으로 표현하자면 아래와 같다.
이제 위에서 나온 것들을 하나씩 상세히 분석할 것이다.
[블록]
하이브는 파일 시스템이 클러스터라 불리는 논리적 저장 단위를 사용하는 블록이라는 논리적 단위를 사용한다.
블록의 크기는 4킬로바이트이며, NTFS에서의 일반적인 클러스터 크기와 같다.
파일시스템의 경우 클러스터가 4킬로 바이트일 경우 모든 파일의 물리적 크기가 4킬로바이트씩 증가하고, 클러스터가 1비트이면 파일의 물리적 크기가 1비트씩 증가하지만, 하이브는 파일의 크기 증가 기준이 논리적 바이트이기 때문에 언제나 4바이트씩 증가한다.
[베이스 블록]
하이브의 첫번째 블록이며, 하이브의 여러 정보들이 들어있다. 베이스 블록은 하이브의 시작이 되는 부분이기 때문에 하이브 헤더 역할을 한다. 하지만 아직까지 완벽히 연구된 영역이 아니기 때문에 각 오프셋이 뭘 의미하는지 모두 알수는 없다.
아래는 지금까지 알려진 오프셋에 대해서 강조하여 놓은 것이다.
애매모호한 offset 설명은 제외하였다.
[하이브 빈]
레지스트리는 4kb를 기준으로 증가하는 동시에 내부에서 4kb크기의 하이브 빈이라는 논리적 단위를 생성한다.
블록과 하이브 빈의 크기는 4kb로 동일하기 때문에 블록하나가 하이브 빈 하나를 구성할 수도 있고 여러 블록이 하이브 빈 하나를 구성 할 수도 있다. 하이브 빈은 하이브의 크기를 결정짓는 블록과 다르게 하이브의 논리적 구조를 결정짓는 요소로 작용한다. 또 베이스 블록은 시그니처가 달라 하이브 빈이라고 부르지 않는다. 각각의 하이브 빈은 다음 하이브 빈까지의 상대적 거리를 저장하고 있으며, 윈도우는 레지스트리를 읽어들일 때 하이브 빈을 기본 단위로 삼는다. 셀이라는 논리적 단위를 사용하게 되면 잦은 호출로 인해 시스템의 속도저하를 일으킬 수 있고 단편화가 발생 할 수 있다. 이러한 이유로 윈도우에서는 빈 하이브 빈이 생기면 인접 하이브 빈과 결합시키고, 마지막 하이브 빈이 비게 되면 하이브를 축소시킨다.
참고로 하이브 빈의 크기는 가변적이다.
위 하이브의 크기를 보면 0x00001000의 값을 가지고 있는데 이는 10진수로 4096이다.
기본적인 크기로 생성되었음을 알 수 있다.
[셀 맵]
셀 맵은 레지스트리를 불러올 시 매번 접근하지 않기 위해서 사용하는 것이다.
하이브의 일부분을 메모리에 맵핑하여 메모리 내의 불연속적인 하이브 데이터를 참조하기 위해 셀 맵을 사용 함.
아래 그림은 셀 맵을 가식화 한 것이다.
'[+] Forensic' 카테고리의 다른 글
Registry (8) (2) | 2012.01.06 |
---|---|
Registry (7) (0) | 2012.01.04 |
Registry (5) (0) | 2012.01.04 |
Registry (4) (0) | 2012.01.03 |