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)
값은 각 키에 저장된 데이터를 나타낸다. 각 값은 이름, 데이터 유형, 데이터를 가질 수 있다.
데이터 유형은 값이 어떤 유형인지를 나타낸다. 예를 들어, 문자열, 숫자, 이진 데이터 등이 있다. 데이터는 실제로 저장되는 값이다.
값은 각 키에 저장된 데이터를 나타낸다. 각 값은 이름, 데이터 유형, 데이터를 가질 수 있다.
데이터 유형은 값이 어떤 유형인지를 나타낸다. 예를 들어, 문자열, 숫자, 이진 데이터 등이 있다. 데이터는 실제로 저장되는 값이다.
[PNG image (28.28 KB)]
[질문]
만약 값에 백슬래시(\)가 포함되면 어떻게 될까?
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: 기호 링크를 저장. 링크된 대상의 경로와 이름을 저장한다. 사용자가 직접 만드는 경우는 많지 않다.
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.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: 현재 사용 중인 하드웨어와 관련된 설정 정보를 포함.
2. HKEY_CURRENT_USER: 현재 로그인한 사용자의 설정 정보를 포함.
3. HKEY_LOCAL_MACHINE: 컴퓨터의 전체 시스템 설정 정보를 포함.
4. HKEY_USERS: 모든 사용자 계정의 설정 정보를 포함.
5. HKEY_CURRENT_CONFIG: 현재 사용 중인 하드웨어와 관련된 설정 정보를 포함.
3.2. 레지스트리의 물리적 위치 #
각 레지스트리 하이브는 물리적인 디스크 파일로 저장된다. 레지스트리의 물리적 파일은 일반적인 방법으로는 직접적으로 접근(복사)을 할 수 없지만 SE_BACKUP_PRIVILEGE 보안 권한을 획득하면 복사할 수 있다.
Windows 95, 98, and ME | \Windows\USER.DAT & Windows\SYSTEM.DAT |
Windows 2000/XP and Vista/7 | \Windows\system32\config & %userprofile%\ntuser.dat 등 |
[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)
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_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의 키를 찾고
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 키 찾기는 호출되지 않는다.[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 등)
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 버전 및 아키텍처에 대한 자동 처리 기능이 있습니다.
5. 참고문헌 #
- http://ko.wikipedia.org/wiki/윈도_레지스트리
- Mark E. Russinovich , et al., Windows Internals, 5th Edition.
----