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
가장 많이 볼 수 있는 유형은 REG_SZ, REG_DWORD, REG_BINARY 이다. 그 외에는 REG_EXPAND_SZ, REG_MULTI_SZ 정도를 제외하면 특수한 경우에만 사용되거나 거의 쓰이지 않는다.
Q: 레지스트리 값의 종류를 모두 알려줘. 예를 들어 REG_SZ 와 같은 유형.
ChatGPT:
레지스트리 값은 다양한 데이터 유형(type)을 가질 수 있습니다. 다음은 레지스트리 값의 일반적인 유형과 각 유형의 특징입니다.

레지스트리 값은 다양한 데이터 유형(type)을 가질 수 있습니다. 다음은 레지스트리 값의 일반적인 유형과 각 유형의 특징입니다.
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: 기호 링크를 저장하는 값입니다. 링크된 대상의 경로와 이름을 저장합니다.
위의 유형 이외에도 다양한 유형의 레지스트리 값이 있을 수 있습니다. 각 값의 유형에 따라 레지스트리 데이터의 해석 방법이 달라질 수 있습니다. 따라서 레지스트리 값을 변경하거나 읽을 때는 올바른 데이터 유형을 지정해야 합니다.
Q: 그 중에서 자주 쓰이는 유형은 어떤 유형이 있지? 그리고 거의 안 쓰이는 유형은 어떤 것이 있지?
ChatGPT:
자주 사용되는 레지스트리 값 유형 중에는 다음과 같은 것들이 있습니다.

자주 사용되는 레지스트리 값 유형 중에는 다음과 같은 것들이 있습니다.
1. REG_SZ: 문자열(string) 값으로, 특정 값을 지정하는 데 많이 사용됩니다. 예를 들어, 사용자 이름, 컴퓨터 이름, 프로그램 경로 등을 저장할 때 사용됩니다.
2. REG_DWORD: 32비트 정수 값으로, 논리값이나 옵션 상태를 저장하는 데 많이 사용됩니다. 예를 들어, 화면의 해상도, 네트워크 연결 상태 등을 저장할 때 사용됩니다.
3. REG_BINARY: 이진(binary) 데이터 값을 가지는 값으로, 이미지나 음악 파일과 같은 바이너리 데이터를 저장하는 데 사용됩니다.
4. REG_EXPAND_SZ: 환경 변수를 포함할 수 있는 문자열 값으로, 시스템 환경 변수나 사용자 환경 변수를 저장할 때 사용됩니다.
2. REG_DWORD: 32비트 정수 값으로, 논리값이나 옵션 상태를 저장하는 데 많이 사용됩니다. 예를 들어, 화면의 해상도, 네트워크 연결 상태 등을 저장할 때 사용됩니다.
3. REG_BINARY: 이진(binary) 데이터 값을 가지는 값으로, 이미지나 음악 파일과 같은 바이너리 데이터를 저장하는 데 사용됩니다.
4. REG_EXPAND_SZ: 환경 변수를 포함할 수 있는 문자열 값으로, 시스템 환경 변수나 사용자 환경 변수를 저장할 때 사용됩니다.
거의 사용되지 않는 레지스트리 값 유형 중에는 다음과 같은 것들이 있습니다.
1. REG_NONE: 데이터 유형이 정의되지 않은 값으로, 거의 사용되지 않습니다.
2. REG_LINK: 기호 링크를 저장하는 값으로, 사용자가 직접 만드는 경우는 많지 않습니다.
2. 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. 레지스트리의 물리적 위치 #
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)
레지스트리의 물리적 파일은 일반적인 방법으로는 접근(복사)을 할 수 없지만 SE_BACKUP_PRIVILEGE를 보안 권한을 획득하면 복사할 수 있다.
Q: 각 하이브들 마다 물리적인 위치가 있는건가?
ChatGPT:
네, 각 레지스트리 하이브는 물리적인 디스크 파일로 저장됩니다. 하지만 이 파일들은 직접적으로 접근하거나 수정할 수 없으며, 레지스트리 편집기와 같은 도구를 사용하여 해당 파일에 대한 액세스를 제공합니다.

네, 각 레지스트리 하이브는 물리적인 디스크 파일로 저장됩니다. 하지만 이 파일들은 직접적으로 접근하거나 수정할 수 없으며, 레지스트리 편집기와 같은 도구를 사용하여 해당 파일에 대한 액세스를 제공합니다.
레지스트리 하이브의 물리적인 위치는 운영체제 설치 디렉토리 내부에 있는
"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_LOCAL_MACHINE
- HKEY_USERS
HKEY_LOCAL_MACHINE 하이브는 하드웨어 설정과 소프트웨어, 네트워크 설정 등과 같은 모든 사용자가 같이 쓰는 전체 시스템 구성 정보를 저장하는 레지스트리이고, HKEY_USERS는 현재 로그인한 모든 사용자에 대한 사용자 프로파일 설정을 저장하는 하이브이다.
HKEY_LOCAL_MACHINE, HKEY_USERS 각 하이브는 SOFTWARE와 SYSTEM 두 개의 같은 서브키를 가지고 있고 하는 역할도 비슷하다.
HKEY_CURRENT_USER는 HKEY_USERS 아래 윈도우 계정의 SID 이름을 가진 서브키와 같다. 즉, HKEY_USERS 쪽 키는 원본이고 HKEY_CURRENT_USER는 링크라고 이해할 수 있다. 단, HKEY_CURRENT_USER를 통한 접근은 단순한 링크와는 차이가 있는데 HKEY_CURRENT_USER는 HKEY_LOCAL_MACHINE과 HKEY_USERS\사용자 SID 키의 합집합이다. 그리고 만약 양 쪽에 같은 이름의 키가 있을 경우 윈도우는 HKEY_USERS 쪽 키를 먼저 조회한다. 따라서 HKEY_CURRENT_USER 계층의 키를 찾으면 윈도우 시스템은 먼저 HKEY_USERS의 키를 찾고
HKEY_CURRENT_USER는 HKEY_USERS 아래 윈도우 계정의 SID 이름을 가진 서브키와 같다. 즉, HKEY_USERS 쪽 키는 원본이고 HKEY_CURRENT_USER는 링크라고 이해할 수 있다. 단, HKEY_CURRENT_USER를 통한 접근은 단순한 링크와는 차이가 있는데 HKEY_CURRENT_USER는 HKEY_LOCAL_MACHINE과 HKEY_USERS\사용자 SID 키의 합집합이다. 그리고 만약 양 쪽에 같은 이름의 키가 있을 경우 윈도우는 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\Steven C:\Users\Steven\ntuser.dat
필요한 작업을 마쳤다면, 다음 같이 언로드할 수 있다.
cmd> reg unload HKU\Steven
4. 레지스트리 사용 #
많은 프로그래밍 언어는 자체 런타임 라이브러리나 클래스를 제공하여 프로그래머들이 레지스트리 설정을 저장할 수 있게 도와준다.
Advanced Win 32 API(advapi32.dll) |
.NET의 Microsoft.Win32.Registry |
델파이의 TRegistry |
WSH Wscript.Shell |
Q: 주요 언어들의 윈도우 레지스트리를 사용하는 라이브러리를 알려줘.

다양한 프로그래밍 언어에서 윈도우 레지스트리를 조작할 수 있는 라이브러리가 존재합니다. 여기에는 일부 주요 언어에서 사용 가능한 라이브러리가 포함됩니다:
- 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 등)
Q: Go 언어에서 윈도우 레지스트리 사용하는 라이브러리를 알려줘.
ChatGPT:
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.
----