当前位置: 首页 > 科技观察

网络安全编程:注册表操作常用API函数

时间:2023-03-20 17:25:56 科技观察

注册表操作和文件操作很相似,也有打开、关闭、写入、查询等操作,即“增、删、改”的功能modify,andcheck”都可以,但是用到的API函数都是Reg开头的。1.打开和关闭注册表。操作注册表需要一个可以操作注册表的句柄,类似于文件操作。在读写注册表之前,需要通过API函数打开注册表,并返回操作注册表的句柄,通过注册表的API函数打开返回的句柄,然后对注册表进行读写操作.读写操作完成后,通过API函数关闭打开的注册表句柄。用于打开注册表的函数是RegOpenKeyEx()。Win16下有个函数叫做RegOpenKey(),虽然这个函数在Win32下还是可以用的,但是这是为了兼容而设置的。RegOpenKeyEx()函数定义如下:参数说明如下。hKey:指定父键句柄。lpSubKey:指向一个字符串,用于表示要打开的子项的名称。ulOptions:系统保留,必须指定为0值。samDesired:开启注册表的访问权限,为了方便对注册表的操作,通常使用KEY_ALL_ACCESS。phkResult:指向一个双精度变量,用于接收打开的子项句柄。如果该函数执行成功,则返回ERROR_SUCCESS,并将打开的子项的句柄保存在phkResult中。所谓打开注册表,本质上就是打开注册表的某个子键,然后进行操作。当对注册表的操作完成后,需要关闭打开的注册表句柄来释放资源。关闭和释放注册表句柄的函数定义如下:LONGRegCloseKey(HKEYhKey//handletokeytoclose);这个函数只有一个参数,就是RegOpenKeyEx()函数的最后一个参数,也就是打开的注册表句柄。2、创建和删除子键创建子键的API函数是RegCreateKeyEx(),定义如下:/desiredsecurityAtlpScurityECITURL,//inheritancePHKEYphkResult,//keyhandleLPDWORDlpdwDisposition//dispositionvaluebuffer);参数说明如下。hKey:用于指定父键句柄。lpSubKey:指向一个字符串,用于表示要创建的子项的名称。Reserved:系统保留,必须指定为0值。lpClass:子键类名,一般设置为NULL值。dwOptions:创建子键时的选项,通常使用REG_OPTION_NON_VOLATILE宏,意思是创建的子键是在注册表文件中创建的,而不是在内存中。samDesired:开启注册表的访问权限,为了方便对注册表的操作,通常使用KEY_ALL_ACCESS。lpSecurityAttributes:该参数指向一个SECURITY_ATTRIBUTES结构,用于指定密钥句柄的安全属性,这里一般使用NULL。phkResult:指向一个双精度变量,用于接收打开的子项句柄。lpdwDisposition:一般设置为NULL值。如果函数执行成功,则返回ERROR_SUCCESS,并保存并返回在phkResult中创建子键的句柄。当要创建的子项已经存在时,该函数与RegOpenKeyEx()函数具有相同的功能,因此也可以使用RegCreateKeyEx()函数来代替打开注册表。但是,此函数的参数比RegOpenKeyEx()函数多。因此,为了方便编写代码,使用RegOpenKeyEx()函数打开注册表更为方便。要删除子项,请使用RegDeleteKey()函数,其定义如下:LONGRegDeleteKey(HKEYhKey,//handletoopenkeyLPCTSTRlpSubKey//subkeyname);该函数的值可用于删除键值项,即该函数只能删除最底层的子键。该函数有2个参数,hKey是父键的句柄,lpSubKey是指向要删除的子键名的字符串。3.查询、写入和删除注册表项。读取键名中的数据或查询键名的属性,使用RegQueryValueEx()函数,函数定义如下://databufferLPDWORDlpcbData//sizeofdatabuffer);参数说明如下。hKey:用于指定要读取的键值项所在的子键句柄。lpValueName:用于指定要读取的键值项的名称。lpReserved:保留参数,必须为NULL值。lpType:接收返回的key-value类型,如果不需要返回key-value项类型,可以给NULL值。lpData:指向一个缓冲区,用于接收返回的key-value数据。lpcbData:调用该函数时,该参数用于指定缓冲区的长度;当函数返回时,这个变量保存缓冲区实际接收到的长度。写键值项的函数是RegSetValueEx(),定义如下:参数说明如下。hKey:用于指定要写入的键值项所在的子键句柄。lpValueName:指向定义键值项名称的字符串。Reserved:保留参数,必须为0值。dwType:指出要写入的key-value数据的类型。lpData:指向要写入键值数据的缓冲区。cbData:写入key-value数据的缓冲区长度。删除键值项的函数是RegDeleteValue(),定义如下:LONGRegDeleteValue(HKEYhKey,//handletokeyLPCTSTRlpValueName//valuename);参数说明如下。hKey:用于指定要删除的句柄。lpValueName:被删除键值项的名称。4.子键和键值的枚举枚举是一个一个获取的。子键的枚举是逐个获取指定键下的子键。枚举键值就是逐个获取指定子键下的键值。枚举子键的函数为RegEnumKeyEx(),其定义如下:LONGRegEnumKeyEx(HKEYhKey,//handletokeytoenumerateDWORDdwIndex,//subkeyindexLPTSTRlpName,//subkeynameLPDWORDlpcName,//sizeofsubkeybufferLPDWORDlpReserved,//reservedLPTSTRlpClass,//classstringbufferLPDWORDlpcClass,//sizeofclassstringbufferPFILETIMElpftLastWriteTime//lastwritetime);参数说明如下。hKey:指定要枚举的键句柄。dwIndex:指定需要返回信息的子键的索引号。lpName:用户收到一个返回子项名称的缓冲区。lpcName:调用本函数前,该参数保存lpName指向的缓冲区长度;该函数调用完成后,该参数保存的是缓冲区实际接收到的数据长度。lpReserved:保留参数,必须为NULL值。lpClass:一般为NULL值。lpcClass:一般为NULL值。lpftLastWriteTime:指向一个用于接收最后写入时间的FILETIME结构。枚举键值的函数为RegEnumValue(),其定义如下:LONGRegEnumValue(HKEYhKey,//handletokeytoqueryDWORDdwIndex,//indexofvaluetoqueryLPTSTRlpValueName,//valuebufferLPDWORDlpcValueName,//sizeofvaluebufferLPDWORDlpReserved,//reservedLPDWORDlpType,//typebufferLPBYTElpData,//databufferLPDWORDlpcbData//sizeofdatabuffer);参数说明如下。hKey:指定要枚举的键句柄。dwIndex:指定需要返回信息的键值的索引号。lpValueName:用户接收返回键值名称的缓冲区。lpcValueName:调用本函数前,该参数保存lpValueName指向的缓冲区长度;函数调用完成后,该参数保存缓冲区实际接收数据的长度。lpReserved:保留参数,必须为NULL值。lpType:指向用于返回键值数据类型的双字变量。lpData:用户接收返回键值数据的缓冲区。lpcbData:调用本函数前,该参数保存lpData指向的缓冲区长度;该函数调用完成后,该参数保存的是缓冲区实际接收到的数据长度。与注册表操作相关的函数就介绍到这里。以上是注册表操作常用的函数。这里无法一一介绍注册表操作相关的功能。其他相关功能请参考MSDN学习。

猜你喜欢