'Per'에 해당되는 글 1건

  1. 2012.04.05 3. Bin Header (2)

Naver Perl Community & Study Cafe


2012.04.05 22:00

3. Bin Header

Hive Bins 은 블록 단위로 이루어져 있으며 각각의 Cell 값을 담고 있습니다. 

즉 세부적인 정보를 가진 큰 틀이라고 보시면 됩니다. 

이 장에서는 Hive Bin Header 를 살펴보고 root key 값을 찾는 샘플을 만들어 보도록 하겠습니다.



Hive Bin들은 일반적으로 4096Byte 단위로 할당이 됩니다. 

하지만   Hive Bin의 크기가 꼭 4096Byte 보다 클 수도 있죠 :)

이전 글에서 'hbin' 값을 확인했었는데 bin size는 1000h(4096)Byte 인 것을 확인 할 수 있습니다.


아래와 같이 Hive Bin Header 밑에는 Cell 들이 존재합니다.


Hive Bin Header 밑에 바로 Cell 들이 쭉~ 연결해서 붙어 있습니다.

하지만 이 Cell 들을 바로 다 읽어 들이는 것이 아니라 연결 되어 있는 값들 위주로 불러 오기 때문에

전체 구조만 파악해 두시면 됩니다 :)


프로그래밍 상에서 가장 먼저 해야 할 것은 Cell의 root key 를 찾는 작업인데

키의 타입이 0x2c나 0xac 가 root 키로 예약 되어 있습니다.

아래 그림을 보시면 hbin Header의 nk 레코드 뒤에 Flags 들이 다른것을 확인할 수 있습니다.


자! 그럼 이제 소스코드를 한번 보겠습니다.


use strict;
use warnings;

my $ADJUST  = 0x1004;	# Global adjustment value (4096 + 4 bytes)

my $file = shift || die "You must enter a filename.\n";
open my $reg, '<', $file  or die "cannot open [$file] file: $!";

my ($node,$offset) = locateRecord($ADJUST);
print "offset = $offset";

sub locateRecord {
	my $offset = shift;
	my $record;
	seek($reg,$offset,0);
	while(1) {
		read($reg,$record,4);
		my ($tag,$id) = unpack("SS",$record);
		if ($tag == 0x6b6e && $id == 0x2c) { 
			print "nk record located.\n";
			return("nk",$offset);
		}
		$offset = $offset + 2;
		seek($reg,$offset,0);
	}
}

locateRecord 함수는 ADJUST 값을 통해 hbin값으로 접근 한 뒤

4byte 씩 읽어 들이면서 nk(0x6b6e)와 rootkey flag 인 0x2c를 찾는 작업을 수행합니다.


소스코드 상에서는 0xac를 제외하고 0x2c 만 설정되어 있는데

Jolanta Thomassen님의 문서와는 다르게 H. Carvey 님의 소스코드에는 0xac는 설정되지 않아 있더군요.

제가 넣는 것보다는 최대한 소스코드를 유지하려는 생각 때문에 0xac는 설정하지 않았습니다^^;


결과는 아래와 같이 나오네요 :) offset 은 파일에 다르게 나올 수도 있습니다.

>perl rega.pl SAM

nk record located.

offset = 4132


이제 rootkey 를 찾았으니 내일부터는 본격적으로 키를 뽑아보는 과정이 될 것 같네요!! 우히힛(?)

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 2


티스토리 툴바