윈도우 레지스트리



1. 레지스트리 개요 #

윈도우 레지스트리는 마이크로소프트 윈도우 운영 체제에서 사용되는 중요한 데이터베이스이다. 이 데이터베이스에는 운영 체제, 응용 프로그램 및 하드웨어 설정과 같은 시스템 구성 정보가 저장된다.

레지스트리는 윈도우 운영 체제에서 설정을 저장하고 응용 프로그램이나 하드웨어와의 상호작용을 조정하는 중요한 역할을 한다. 사용자가 시스템 정책을 변경을 할 때나, 설치된 응용 프로그램이 레지스트리를 변경, 저장한다.

1.1. 언제 어떻게 만들어 졌는가? #

Windows 3.1 이전 Windows 3.11 Windows 95 이후 =>
($Application)\.INI 파일 C:\Windows\Reg.DAT 레지스트리 하이브 =>

윈도우 3.X, DOS 에서는 구성 설정을 담는데 각 프로그램마다 .INI 파일이 사용되었다. 당연히 이러한 파일들이 시스템 여러 곳에 퍼져있어서 찾기가 쉽지 않았는데 윈도우 3.11을 개발하는 동안 .INI 파일을 제거해야 한다는 필요성이 제기되었다. 이에 새로운 파일 형식이 도입되었는데 이 파일을 Reg.DAT 이라 하고 C:\Windows 디렉터리에 저장되었으며 현재 레지스트리 구조의 선구자적 역할을 했다.

2. 레지스트리 데이터 유형 #

레지스트리는 키(key)와 값(value) 두 가지 기본 요소로 이루어져 있다.

1. 키 (Key)
키는 레지스트리의 계층적인 구조를 형성한다. 키는 폴더와 유사한 역할을 하며, 다른 키를 가질 수 있다. 각 계층 수준을 나타내기 위해 백슬래시를 사용하며 폴더 경로와 비슷한 구문을 사용한다.

2. 값 (Value)
값은 각 키에 저장된 데이터를 나타낸다. 각 값은 이름, 데이터 유형, 데이터를 가질 수 있다.
데이터 유형은 값이 어떤 유형인지를 나타낸다. 예를 들어, 문자열, 숫자, 이진 데이터 등이 있다. 데이터는 실제로 저장되는 값이다.

fig3.png
[PNG image (28.28 KB)]

  • [질문] 만약 값에 백슬래시(\)가 포함되면 어떻게 될까?
값 이름에 백슬래시를 포함할 수 있다. 하지만 백슬래시를 사용하면 키(경로)와 구별하는 것이 어렵게 될 수 있다. 그래서 레지스트리 값을 이용하는 윈도우 API는 부모 키에 대한 핸들과 값 이름을 따로 파라미터로 받아서 사용한다.

2.1. 레지스트리 값의 유형 #

  • REG_NONE
  • REG_SZ
  • REG_EXPAND_SZ
  • REG_BINARY
  • REG_DWORD/REG_DWORD_LITTLE_ENDIAN
  • REG_DWORD_BIG_ENDIAN
  • REG_LINK
  • REG_MULTI_SZ
  • REG_FULL_RESOURCE_DESCRIPTOR
  • REG_RESOURCE_REQUIREMENTS_LIST
  • REG_QWORD/REG_QWORD_LITTLE_ENDIAN

레지스트리 값은 다양한 데이터 유형(type)을 가질 수 있다. 가장 많이 볼 수 있는 유형은 REG_SZ, REG_DWORD, REG_BINARY 이다. 그 외에는 REG_EXPAND_SZ, REG_MULTI_SZ 정도를 제외하면 특수한 경우에만 사용되거나 거의 쓰이지 않는다.

다음은 레지스트리 값의 일반적인 유형과 각 유형의 특징이다.

1. REG_SZ: 문자열(string). 최대 2,047자까지 저장할 수 있다.
2. REG_EXPAND_SZ: 환경 변수를 포함할 수 있는 문자열. 문자열 내에 %변수명% 형식으로 환경 변수를 참조할 수 있다.
3. REG_MULTI_SZ: 여러 개의 문자열을 가지는 값. 문자열 간에는 null 문자('\0')로 구분된다.
4. REG_DWORD: 32비트 정수 값. 0부터 4,294,967,295까지의 값을 저장할 수 있다.
5. REG_QWORD: 64비트 정수 값. 0부터 18,446,744,073,709,551,615까지의 값을 저장할 수 있다.
6. REG_BINARY: 이진(binary) 데이터 값. 이미지나 음악 파일과 같은 바이너리 데이터를 저장하는 데 사용된다.
7. REG_NONE: 데이터 유형이 정의되지 않은 값. 거의 사용되지 않는다.
8. REG_LINK: 기호 링크를 저장. 링크된 대상의 경로와 이름을 저장한다. 사용자가 직접 만드는 경우는 많지 않다.

3. 레지스트리 구조 #

3.1. 레지스트리 하이브 #

  • HKEY_CLASSES_ROOT (HKCR)
  • HKEY_CURRENT_USER (HKCU)
  • HKEY_LOCAL_MACHINE (HKLM)
  • HKEY_USERS (HKU)
  • HKEY_CURRENT_CONFIG
  • HKEY_PERFORMANCE_DATA
  • HKEY_DYN_DATA

윈도우 레지스트리는 여러 개의 레지스트리 하이브(hive)가 모여서 이루어진 데이터베이스이다. 레지스트리 하이브는 레지스트리 데이터를 저장하는데 사용되는 윈도우 레지스트리의 하위 구조이다. 각 하이브는 별도의 파일로 저장되어 있으며, 윈도우 레지스트리는 이러한 하이브 파일들의 모음이다.

윈도우 운영체제에는 여러 개의 하이브가 있으며, 다음과 같이 구성된다.

1. HKEY_CLASSES_ROOT: 파일 형식 연결 및 COM 클래스 등록 정보를 포함.
2. HKEY_CURRENT_USER: 현재 로그인한 사용자의 설정 정보를 포함.
3. HKEY_LOCAL_MACHINE: 컴퓨터의 전체 시스템 설정 정보를 포함.
4. HKEY_USERS: 모든 사용자 계정의 설정 정보를 포함.
5. HKEY_CURRENT_CONFIG: 현재 사용 중인 하드웨어와 관련된 설정 정보를 포함.

3.2. 레지스트리의 물리적 위치 #

Windows 95, 98, and ME \Windows\USER.DAT & Windows\SYSTEM.DAT
Windows 2000/XP and Vista/7 \Windows\system32\config & %userprofile%\ntuser.dat 등
fig1.png
[PNG image (95.27 KB)]


대표적으로는 다음과 같다.

HKEY_LOCAL_MACHINE \SYSTEM (%windir%/system32/config/system)
HKEY_LOCAL_MACHINE \SOFTWARE (%windir%/system32/config/software)
HKEY_USERS \.Default (%windir%/system32/config/default)
HKEY_CURRENT_USER (%userprofile%/ntuser.dat)


레지스트리의 물리적 파일은 일반적인 방법으로는 접근(복사)을 할 수 없지만 SE_BACKUP_PRIVILEGE 보안 권한을 획득하면 복사할 수 있다.

레지스트리 하이브 마다 물리적인 위치가 있나?
네, 각 레지스트리 하이브는 물리적인 디스크 파일로 저장됩니다. 하지만 이 파일들은 직접적으로 접근하거나 수정할 수 없으며, 레지스트리 편집기와 같은 도구를 사용하여 해당 파일에 대한 액세스를 제공합니다.

레지스트리 하이브의 물리적인 위치는 운영체제 설치 디렉토리 내부에 있는 "System32\config" 폴더에 저장됩니다. 예를 들어, HKEY_LOCAL_MACHINE hive는 "System32\config\SYSTEM" 파일에 저장되고, HKEY_CURRENT_USER hive는 현재 로그인한 사용자의 NTUSER.DAT 파일에 저장됩니다.

그러나 이러한 레지스트리 파일들은 바로 수정하거나 삭제하면 컴퓨터 시스템에 심각한 문제를 일으킬 수 있으므로, 이러한 작업은 전문 지식과 경험이 필요합니다. 그러므로, 일반적으로는 레지스트리 편집기와 같은 도구를 사용하여 레지스트리 설정을 변경하는 것이 좋습니다.

3.3. 어떻게 구성되는가? #

그러면 여러 개의 하이브들이 어떻게 모여 레지스트리를 구성하는가? 이게 좀 복잡하다... 글로 설명하면 다음과 같다.

  • HKEY_CURRENT_USER (HKCU)는 HKEY_USERS\%SID(User's Security identifier)%[1]와 HKEY_LOCAL_MACHINE이 합쳐진 Shortcut이다. *아래 추가 설명. (사용자가 로그인하면 그 사용자의 프로파일에 대한 SID 서브키가 HKEY_USERS 아래 연결된다.)
  • HKEY_CLASSES_ROOT (HKCR)는 HKEY_LOCAL_MACHINE\SOFTWARE\Classes와 HKEY_CURRENT_USER\Software\Classes의 합집합이다.
  • HKEY_CLASSES_ROOT는 HKEY_CURRENT_USER\%SID%\Software\Classes 의 Shortcut 이다.
  • HKEY_CLASSES_ROOT\SYSTEM\CurrentControlSet은 \SYSTEM\CurrentControlSet001 또는 \SYSTEM\CurrentControlSet002의 Shortcut이다. CurrentControlSet과 만약 윈도우가 예기치않게 종료되었을 때 부팅 시 마지막으로 성공한 구성 메뉴를 선택하면 다른 번호로 연결된다.
  • HKEY_USERS\%SID%_Classes는 HKEY_USERS\%SID%\Software\Classes의 Shortcut이다.
  • HKEY_CURRENT_CONFIG (HKCC)는 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current의 Shortcut이다. \Current 는 \0000 키 또는 \0001 키의 Shortcut이며 용도는 CurrentControlSet과 마찬가지다.

자세히 보면 HKEY_CLASSES_ROOT, HKEY_CURRENT_USER 등은 단지 다른 위치의 키를 쉽게 접근하게 만든 링크와 비슷한 개념이라는 것을 알 수 있다. 즉, 실제 레지스트리 원본은 다음 두 하이브만으로 구성되는 것으로도 볼 수 있다.

  • HKEY_LOCAL_MACHINE
  • HKEY_USERS

HKEY_LOCAL_MACHINE 하이브는 하드웨어 설정과 소프트웨어, 네트워크 설정 등과 같은 모든 사용자가 같이 쓰는 전체 시스템 구성 정보를 저장하는 레지스트리이고, HKEY_USERS는 현재 로그인한 모든 사용자에 대한 사용자 프로파일 설정을 저장하는 하이브이다.

HKEY_LOCAL_MACHINE, HKEY_USERS\<USER'S SID> 각 하이브는 SOFTWARE와 SYSTEM 두 개의 같은 서브키를 가지고 있고 하는 역할도 비슷하다.
HKEY_CURRENT_USER와 같이 HKEY_USERS, HKEY_LOCAL_MACHINE 양쪽에 원본이 있고 그 합집합인 경우, 만약 양 쪽에 같은 이름의 키가 있을 경우 윈도우 내부 시스템 API는 HKEY_USERS 쪽 키를 먼저 조회한다. 따라서 HKEY_CURRENT_USER 계층의 키를 찾으면 윈도우 시스템은 먼저 HKEY_USERS의 키를 찾고 NAME_NOT_FOUND 에러가 발생하면 HKEY_LOCAL_MACHINE의 키를 찾는다. HKEY_USERS 찾기가 성공하면 HKEY_LOCAL_MACHINE 키 찾기는 호출되지 않는다.

fig5.png
[PNG image (68.59 KB)]

  • [질문] HKEY_USERS는 시스템에 존재하는 모든 사용자 하이브가 아니라 지금 로그인된 사용자 하이브만 포함되는가?
그렇다.
  • [질문] 그렇다면 로그아웃된 사용자의 하이브를 불러들일 수 있는가?
필요하다면 다음 같이 가능하다.
cmd> reg load HKU\<User-Name> C:\Users\<User-Name>\ntuser.dat
필요한 작업을 마쳤다면, 다음 같이 언로드할 수 있다.
cmd> reg unload HKU\<User-Name>

4. 레지스트리 사용 #

많은 프로그래밍 언어는 자체 런타임 라이브러리나 클래스를 제공하여 프로그래머들이 레지스트리 설정을 저장할 수 있게 도와준다.

Advanced Win 32 API(advapi32.dll)
.NET의 Microsoft.Win32.Registry
델파이의 TRegistry
WSH Wscript.Shell

주요 언어들의 윈도우 레지스트리를 사용하는 라이브러리를 알려줘.
다양한 프로그래밍 언어에서 윈도우 레지스트리를 조작할 수 있는 라이브러리가 존재합니다. 여기에는 일부 주요 언어에서 사용 가능한 라이브러리가 포함됩니다:

  • C/C++: Windows API 함수를 사용하여 레지스트리 조작 가능 (e.g. RegOpenKeyEx(), RegSetValueEx(), RegQueryValueEx() 등)
  • C#: .NET Framework에서 제공하는 Registry 클래스 사용 가능
  • Java: Java에서 제공하는 Preferences 클래스 사용 가능
  • Python: _winreg 또는 winreg 모듈 사용 가능
  • PowerShell: PowerShell에서 제공하는 명령어를 사용하여 레지스트리 조작 가능 (e.g. Get-ItemProperty, Set-ItemProperty 등)

이외에도 다른 언어에서도 윈도우 레지스트리를 조작할 수 있는 라이브러리가 존재합니다. 예를 들어, Ruby에서는 win32/registry 모듈을 사용할 수 있습니다.

Go 언어에서 윈도우 레지스트리 사용하는 라이브러리를 알려줘.
Go 언어에서 윈도우 레지스트리를 다루기 위한 라이브러리로는 다음과 같은 것들이 있습니다:

  • golang.org/x/sys/windows/registry: Go에서 Windows API를 직접 사용하여 레지스트리를 조작할 수 있도록 지원하는 패키지입니다. 이 패키지는 Windows 전용이며, C/C++의 Windows API 함수와 거의 동일한 함수를 제공합니다.
  • github.com/go-ole/go-ole: Go에서 COM (Component Object Model) 인터페이스를 사용하여 레지스트리를 조작할 수 있도록 지원하는 패키지입니다. 이 패키지는 Windows 전용이며, 다른 COM 개체와 상호 작용할 수 있는 데 사용할 수도 있습니다.
  • github.com/gentlemanautomaton/winreg: Go에서 Windows API를 추상화한 패키지로, 레지스트리를 다루기 쉽도록 인터페이스를 제공합니다. 이 패키지는 Windows 전용이며, OS 버전 및 아키텍처에 대한 자동 처리 기능이 있습니다.

이외에도 다른 Go 패키지들이 윈도우 레지스트리를 다루기 위한 다양한 방법을 제공하고 있습니다.

5. 참고문헌 #


이 글에는 0 개의 댓글이 있습니다.