admin 管理员组

文章数量: 1184232

一直想跟着 Cogito 学安全,昨晚终于下定决心开始。 Cogito 给我出了一道编程修改 IE 首页的题目,在他的指导下很快完成了,不过对注册表还是懵懵懂懂的,所以便找点资料好好补了一课。

首先,注册表中的数据是通过一种树状结构以根键和子键的形式组成的。放在这些键中的各种参数控制着 windows 的启动、硬件驱动程序的装载以及一些 windows 应用程序的运行。

自己分别在 Windows 7 vista xp 系统中打开注册表编辑器,发现都有五个根键,分别是: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS HKEY_CURRENT_CONFIG 。上网查了一下,发现 Windows 98 还有一个记录系统运行时刻状态的 HKEY_DYN_DATA 总共六个根键。这五个根键存放的信息分别是:

HKEY_CLASSES_ROOT根键记录了某类文件和打开该类文件的应用程序之间的相互关联关系。

HKEY_CURRENT_USER 根键包含了当前登录用户的配置文件信息。

HKEY_LOCAL_MACHINE 根键包含了当前计算机的配置数据,包括所安装的硬件以及软件的设置。这些性新为所有的用户登录系统服务。

HKEY_USERS 根键包括默认用户的信息和所有以前登录用户的信息。

HKEY_CURRENT_CONFIG 根键包含有关本地计算机在系统启动时使用的硬件配置文件的信息。

其中, HKEY_LOCAL_MACHINE 一个键已经存放了 HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG 中存放的信息, HKEY_USERS 也存放着 HKEY_CURRENT_USER 中存放的信息。

一个根键键就是一个文件夹,而子键就是这个文件夹中的子文件夹,子键同样是一个键。一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成。一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。

键的数据类型主要有以下四种:

REG_SZ

字符串

文本字符串

REG_MULTI_SZ

多字符串

含有多个文本值的字符串

REG_BINARY

二进制数

二进制值,以十六进制显示。

REG_DWORD

双字

一个 32 位的二进制值,显示为 8 位的十六进制值。

OK ,有了注册表的基本概念后,可以动手来编程实现修改 IE 首页了。关于注册表的 API 函数有二三十个,提供对注册表的读取,写入,删除,以及打开注册表及键值等操作。修改 IE 首页主要涉及打开键、设置键值和关闭键三个操作,相关的 API 分别是:

本函数打开指定的键或子键。如果要打开的键不存在的话,则建立它。第一个参数是根键;第二个参数是子键;第三个参数设为 0 ;第四个参数设为 NULL ;第五个参数为注册表键选项,可以设置为 REG_OPTION_NON_VOLATILE REG_OPTION_VOLATILE ;第六个参数设置为 0 ;第七个参数设置为 NULL ;第八个参数为一个句柄指针,该句柄用 RegCloseKey 关闭。该函数调用不成功返回非 0 ,成功返回 ERROR_SUCCESS

本函数设置某子键下特定名称的值。第一个参数为 RegCreateKeyEx 中第八个参数所指的句柄,第二个参数为名称;第三个参数设为 0 ;第四个函数是键的类型;第五个函数是指向键值的指针;第六个参数是该键值的大小。函数调用不成功返回非 0 ,成功返回 ERROR_SUCCESS

本函数关闭指定的主册表键,释放句柄。当对一个或多个键或值操作完成以后,需要关闭其键来进行保存操作结果。关闭一个键后,句柄变为非法,以使其不可再次被使用。为系统重新使用而释放句柄。函数调用不成功返回非 0 ,成功返回 ERROR_SUCCESS

修改 IE 首页的代码如下:

int _tmain(int argc, _TCHAR* argv[])

{

HKEY hkey;

LPCTSTR path  = _T("Software//Microsoft//Internet Explorer//Main");

// 打开键,若没有则创建

LONG ret = RegCreateKeyEx(HKEY_CURRENT_USER ,path,0,NULL,REG_OPTION_NON_VOLATILE,

KEY_ALL_ACCESS ,NULL,&hkey,NULL);

if(ret != ERROR_SUCCESS)

{

printf("Error ! RegCreateKeyEx() failed!/n");

return -1;

}

LPCTSTR startPage = _T("g.cn");

// 修改键值

ret = RegSetValueEx(hkey,_T("Start Page"),NULL,REG_SZ,

(BYTE*)startPage,_tcslen(startPage)*2);

if(ret != ERROR_SUCCESS)

{

printf("Error ! RegSetValueEx() failed!/n");

return -1;

}

// 关闭该键

RegCloseKey(hkey);

return 0;

}

本文标签: 信息 根键包含 修改