Windows注册表(Registry)是Windows操作系统中用于存储系统配置信息、用户设置和应用程序数据的一个集中式数据库。它是一个层次结构的数据库,由键(Key)和值(Value)组成,这些键和值被用于存储各种系统和应用程序的配置信息。
以下是注册表的一些基本概念:
HKEY_CLASSES_ROOT
、HKEY_CURRENT_USER
、HKEY_LOCAL_MACHINE
等。Windows注册表的作用包括:
RegOpenKeyEx
是一个用于打开指定的注册表键的 Windows API 函数。它允许应用程序访问和操作 Windows 注册表的子键。在较新的 Windows 版本中,例如 Windows 10,RegOpenKeyEx
已被推荐的函数 RegOpenKey
和 RegOpenKeyEx
代替。以下是 RegOpenKeyEx
的一般用法:
LSTATUS RegOpenKeyEx(
HKEY hKey,
LPCTSTR lpSubKey,
DWORD ulOptions,
REGSAM samDesired,
PHKEY phkResult
);
参数说明:
hKey
: 指定要打开的基础键的句柄,可以是 HKEY_CLASSES_ROOT
、HKEY_CURRENT_USER
、HKEY_LOCAL_MACHINE
等。lpSubKey
: 指定相对于 hKey
的子键路径。ulOptions
: 保留参数,通常可以设置为 0。samDesired
: 指定键的访问权限,例如 KEY_READ
或 KEY_WRITE
。phkResult
: 接收指向打开的注册表键的句柄的指针。函数返回值:
ERROR_SUCCESS
。RegEnumValue
用于列举指定注册表键中的值。它可以用来遍历注册表键中的所有值,以便你可以获取键中包含的信息。以下是 RegEnumValue
的一般用法:
LSTATUS RegEnumValue(
HKEY hKey,
DWORD dwIndex,
LPTSTR lpValueName,
LPDWORD lpcchValueName,
LPDWORD lpReserved,
LPDWORD lpType,
LPBYTE lpData,
LPDWORD lpcbData
);
参数说明:
hKey
: 指定要列举值的注册表键的句柄。dwIndex
: 指定要检索的值的索引。从 0 开始,逐渐递增。lpValueName
: 接收值的名称的缓冲区。lpcchValueName
: 接收值名称的缓冲区大小的指针。在调用函数之前,你应该将其设置为缓冲区大小。lpReserved
: 保留参数,通常可以设置为 NULL。lpType
: 接收值的数据类型的指针。lpData
: 接收值的数据的缓冲区。lpcbData
: 接收数据缓冲区大小的指针。在调用函数之前,你应该将其设置为缓冲区大小。函数返回值:
ERROR_SUCCESS
。枚举指定键值对中是否存在值,如果存在则循环将其输出。
#include
#include
void Enum_Regedit(HKEY Reg_Root,const char *Reg_Path)
{
HKEY hKey = NULL;
DWORD dwType = 0;
char szValueName[MAXBYTE], szValueKey[MAXBYTE] = { 0 };
DWORD dwBufferSize = MAXBYTE, dwKeySize = MAXBYTE;
// 打开注册表项
LONG lRet = RegOpenKeyEx(Reg_Root, Reg_Path, 0, KEY_ALL_ACCESS, &hKey);
int index = 0;
while (1)
{
// 枚举注册表键项
lRet = RegEnumValue(hKey, index, szValueName, &dwBufferSize, NULL,
&dwType, (unsigned char *)szValueKey, &dwKeySize);
if (lRet == ERROR_NO_MORE_ITEMS)
break;
printf("序号: %3d 名称: %-25s 值: %-50s 类型: ", index, szValueName, szValueKey);
switch (dwType)
{
case 1: printf("REG_SZ \n"); break;
case 2: printf("REG_EXPAND_SZ \n"); break;
case 4: printf("REG_DWORD \n"); break;
case 7: printf("REG_MULTI_SZ \n"); break;
default: printf("None \n"); break;
}
dwBufferSize = MAXBYTE;
dwKeySize = MAXBYTE;
index++;
}
RegCloseKey(hKey);
}
int main(int argc, char *argv[])
{
// 枚举普通启动项
Enum_Regedit(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run");
Enum_Regedit(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run");
// 枚举Boot启动项
// HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute
Enum_Regedit(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\Session Manager\\");
// 枚举ActiveX启动项,在子键中添加SubPath即可完成开机自启动.
Enum_Regedit(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\");
system("pause");
return 0;
}
RegCreateKey
是用于创建或打开指定的注册表键。如果键不存在,则它将被创建;如果存在,则它将被打开。以下是 RegCreateKey
的一般用法:
LSTATUS RegCreateKey(
HKEY hKey,
LPCTSTR lpSubKey,
PHKEY phkResult
);
参数说明:
hKey
: 指定要创建或打开的基础键的句柄,可以是 HKEY_CLASSES_ROOT
、HKEY_CURRENT_USER
、HKEY_LOCAL_MACHINE
等。lpSubKey
: 指定相对于 hKey
的子键路径。phkResult
: 接收指向创建或打开的注册表键的句柄的指针。函数返回值:
ERROR_SUCCESS
。RegSetValueEx
是用于在指定的注册表键中设置一个值。它可以用于创建新的键值,也可以用于修改现有键值。以下是 RegSetValueEx
的一般用法:
LSTATUS RegSetValueEx(
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
const BYTE *lpData,
DWORD cbData
);
参数说明:
hKey
: 指定要设置值的注册表键的句柄。lpValueName
: 指定要设置的值的名称。Reserved
: 保留参数,通常可以设置为 0。dwType
: 指定值的数据类型,例如 REG_SZ
表示字符串。lpData
: 指定要设置的值的数据。cbData
: 指定数据的大小。函数返回值:
ERROR_SUCCESS
。通过获取自身进程名称,并将该进程路径写入到CurrentVersion
变量中实现开机自启。
#include
#include
#define Reg_Path "Software\\Microsoft\\Windows\\CurrentVersion\\Run"
BOOL Reg_Regedit(HKEY Reg_Root,char *lpszFileName, char *lpszValueName)
{
HKEY hKey;
if (ERROR_SUCCESS != RegOpenKeyEx(Reg_Root, Reg_Path, 0, KEY_WRITE, &hKey))
{
return FALSE;
}
if (ERROR_SUCCESS != RegSetValueEx(hKey, lpszValueName, 0, REG_SZ, (BYTE *)lpszFileName, (1 + ::lstrlen(lpszFileName))))
{
RegCloseKey(hKey);
return FALSE;
}
RegCloseKey(hKey);
return TRUE;
}
int main(int argc, char *argv[])
{
TCHAR szPath[MAX_PATH] = { 0 };
if (GetModuleFileName(NULL, szPath, MAX_PATH))
{
int ret = Reg_Regedit(HKEY_CURRENT_USER, szPath, "main");
if (ret == 1)
printf("添加自身启动项成功 \n");
}
system("pause");
return 0;
}
注册表项不仅可以实现开机自启动,由于Win系统都是在注册表之上工作的,只要向指定位置写入键值,即可实现许多不可思议的功能。
// 禁用系统任务管理器
void RegTaskmanagerForbidden()
{
HKEY hkey;
DWORD value = 1;
RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);
RegSetValueEx(hkey, "DisableTaskMgr", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));
RegCloseKey(hkey);
}
// 禁用注册表编辑器
void RegEditForbidden()
{
HKEY hkey;
DWORD value = 1;
RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);
RegSetValueEx(hkey, "DisableRegistryTools", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));
RegCloseKey(hkey);
}
// 干掉桌面壁纸
void RegModifyBackroud()
{
DWORD value = 1;
HKEY hkey;
RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);
RegSetValueEx(hkey, "Wallpaper", NULL, REG_SZ, (unsigned char *)"c://", 3);
RegSetValueEx(hkey, "WallpaperStyle", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));
}
RegQueryValueEx
是用于检索指定注册表键中的指定值。它可以用来获取注册表键中的数据,例如字符串、整数等。以下是 RegQueryValueEx
的一般用法:
LSTATUS RegQueryValueEx(
HKEY hKey,
LPCTSTR lpValueName,
LPDWORD lpReserved,
LPDWORD lpType,
LPBYTE lpData,
LPDWORD lpcbData
);
参数说明:
hKey
: 指定要查询值的注册表键的句柄。lpValueName
: 指定要查询的值的名称。lpReserved
: 保留参数,通常可以设置为 NULL。lpType
: 接收值的数据类型的指针。lpData
: 接收值的数据的缓冲区。lpcbData
: 接收数据缓冲区大小的指针。在调用函数之前,你应该将其设置为缓冲区大小。函数返回值:
ERROR_SUCCESS
。判断指定键值对是否存在,是否被设置过.
#include
#include
#define Reg_Path "Software\\Microsoft\\Windows\\CurrentVersion\\Run"
BOOL Check_Regedit(HKEY Reg_Root,char * name)
{
HKEY hKey;
if (ERROR_SUCCESS == RegOpenKeyEx(Reg_Root, Reg_Path, NULL, KEY_ALL_ACCESS, &hKey))
{
DWORD dwSize = 255, dwType = REG_SZ;
char String[256];
if (ERROR_SUCCESS == RegQueryValueEx(hKey, name, 0, &dwType, (BYTE *)String, &dwSize))
{
return true;
}
}
RegCloseKey(hKey);
return false;
}
int main(int argc, char *argv[])
{
int ret = Check_Regedit(HKEY_CURRENT_USER, "ctfmon");
printf("启动项存在: %d \n", ret);
system("pause");
return 0;
}
RegDeleteValue
是用于删除指定注册表键中的指定值。它可以用来删除注册表键中的数据值。以下是 RegDeleteValue
的一般用法:
LSTATUS RegDeleteValue(
HKEY hKey,
LPCTSTR lpValueName
);
参数说明:
hKey
: 指定要删除值的注册表键的句柄。lpValueName
: 指定要删除的值的名称。函数返回值:
ERROR_SUCCESS
。传入需要删除的注册表位置,以及该表中键值对的名字即可完成删除。
#include
#include
void Delete_Regedit(const char *Reg_Path,const char *Key_Name)
{
char szKeyName[MAXBYTE] = { 0 };
HKEY hKey = NULL;
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, Reg_Path, 0, KEY_ALL_ACCESS, &hKey);
RegDeleteValue(hKey, Key_Name);
RegCloseKey(hKey);
}
int main(int argc, char *argv[])
{
Delete_Regedit("Software\\Microsoft\\Windows\\CurrentVersion\\Run", "main1");
system("pause");
return 0;
}