동글동글 라이프
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 를 찾았으니 내일부터는 본격적으로 키를 뽑아보는 과정이 될 것 같네요!! 우히힛(?)
'개발자 이야기 > [forensic]Winproof' 카테고리의 다른 글
5. SubKey List (1) | 2012.04.09 |
---|---|
4. NK Record (0) | 2012.04.06 |
2. Registry hive structure (1) | 2012.04.04 |
1.시작하며... (3) | 2012.04.03 |
Detail (Web Log Analysis) (1) | 2010.07.28 |