Recent Posts
Recent Comments
04-26 00:00
관리 메뉴

동글동글 라이프

2. Registry hive structure 본문

개발자 이야기/[forensic]Winproof

2. Registry hive structure

동글동글라이프 2012. 4. 4. 19:10

Registry Hive 파일을 통해 원본  레지스트리값들을 알아내기 위해서는 먼저 Hive 파일의 구조를 알아야 합니다.

이 장에서는 샘플 Hive 파일을 추출하여 Hex Editor를 통해 값을 확인하고 프로그래밍으로 Hive 파일을 불러와서 

값들을 체크하는 샘플을 만들어 보도록 하겠습니다.


레지스트리 Hive 파일을 분석하기 위해서는 먼저 Hive 파일을 추출해야 합니다.

정확한 레지스트리 Hive 파일을 얻어오기 위해서는 컴퓨터를 종료 한 뒤, 

하드 디스크에 있는 Hive 파일을 추출하여 사용하는게 가장 좋은 방법이지만


하드 디스크를 빼려면 본체도 열어야 하고 나사도 풀어야 하고 ㅡ_ㅠ

보통 힘든일이 아닙니다. (쉬우신 분들도 있겠지만요 ^^;)


그래서 간단하게 샘플 파일을 얻는 방법을 설명해 드리겠습니다.

자신의 현재 컴퓨터에서도 가능합니다.


1. 실행창에서 레지스트리 편집기인 regedit 를 입력합니다.


2. HKEY_LOCAL_MACHINE 의 SAM을 선택하여 내보내기를 누릅니다.

(SAM에 값이 없는 것 같지만 숨겨져 있을뿐 중요한 정보가 많이 담겨져 있습니다)


3. 내보내기를 할 때 파일형식을 레지스트리 하이브파일로 선택해주셔야 합니다!


위와 같이 진행하시면 현재 컴퓨터의 레지스트리 Hive 샘플 파일인 SAM 파일을 얻을 수가 있습니다. +_+


레지스트리 Hive 파일의 전체 구조는 아래와 같습니다. 

첫번째로 Base Block 가 존재하며 'regf'라는 시퀀스를 가지고 있습니다.

이 Base Block은 4096(0x1000)Byte로 이루어져 있으며 

Hive 파일 이름, 첫번째 키 레코드의 주소, 마지막 hbin 파일 주소 등이 담겨 있습니다.

이 블럭에는 hive 파일의 전체적으로 중요한 정보들을 저장하고 있습니다.

Hive 파일의 습니다.


이런건 눈으로 봐야 하는데.. Hex Editor로 파일을 한번 열어 보겠습니다.

처음에 'regf' 보이시죠? 이 시퀀스가 레지스트리 Hive 파일이라는 것을 알려주는 부분입니다.


그리고 4096Byte를 봤을 때 시퀀스 값이 'hbin' 이라는 것도 확인을 할 수 있습니다 :)


레지스트리의 Hive 파일의 스펙은 정확히 공개되지 않았습니다. 

그래서 지속적으로 그 값들을 확인하기 위한 작업들이 이루어지고 있으며

그래도 제일 분석이 잘 된 The WindowsNT Registry File Format.pdf 파일의 맨 마지막장에 보시면 

각 구조에 대한 값들을 자세하게 확인 할 수 있습니다. ( 정확하지 않은 부분은 Unknown 이나 물음표를 넣어놨더군요 ^^;)



앞서 설명드린 Base Block 파일은 위와 같은 정보들을 가지고 있으며, 

이 값들을 perl을 사용하여 추출하여 보도록 하겠습니다.

( timestamp 는 기록이 정확하게 되어 있지 않아 제외 시켰습니다. )


> rega.pl 


use strict;
use warnings;

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

# Magic Number 
read($reg,$record,4);
my $magic = unpack("A4",$record);
print $magic,"\n";

#root key offset
seek($reg,0x24,0);
read($reg,$record,4);
my $rootkey = unpack("L",$record);
print $rootkey,"\n";

#file name
seek($reg,0x30,0);
read($reg,$record,64);
my $filename = unpack("A*",$record);
printf $filename;


코드의 문법상 어려운 부분은 없을 것입니다. 
unpack 문서는 아래 링크를 참고 하시면 됩니다.

rega.pl 파일을 실행을 시켰을 때 결과값이 아래와 같이 나오면 정상적으로 추출 된 것입니다.

>perl rega.pl SAM

regf

32

\S y s t e m R o o t \ S y s t e m 3 2 \ C o n f i g \ S A M

※ 현재 컴퓨터에서 추출한 샘플 파일일 경우에는 아래 경로가 나오지 않습니다


레지스트리 Hive 파일을 알리는 'regf' 와 root key 값을 나타내는 32(0x20) 그리고 

SAM 파일이 위치한 전체경로를 확인 할 수 있습니다 :)




'개발자 이야기 > [forensic]Winproof' 카테고리의 다른 글

4. NK Record  (0) 2012.04.06
3. Bin Header  (2) 2012.04.05
1.시작하며...  (3) 2012.04.03
Detail (Web Log Analysis)  (1) 2010.07.28
Detail (Registry Analysis)  (2) 2010.07.28
Comments