当前位置: 首页 > news >正文

什么推广网站好网站建设 保障接单 计划

什么推广网站好,网站建设 保障接单 计划,爱网站长尾关键词挖掘工具,网络安全防护软件注册表是Windows中的一个重要的数据库#xff0c;用于存储系统和应用程序的设置信息#xff0c;注册表是一个巨大的树形结构#xff0c;无论在应用层还是内核层操作注册表都有独立的API函数可以使用#xff0c;而在内核中读写注册表则需要使用内核装用API函数#xff0c;如…注册表是Windows中的一个重要的数据库用于存储系统和应用程序的设置信息注册表是一个巨大的树形结构无论在应用层还是内核层操作注册表都有独立的API函数可以使用而在内核中读写注册表则需要使用内核装用API函数如下将依次介绍并封装一些案例实现对注册表的创建删除更新查询等操作。 在Windows内核中注册表是一种存储系统配置信息的机制包括应用程序、硬件、驱动程序和操作系统的各种设置。内核提供了一些API函数可以让驱动程序通过代码访问和修改注册表以实现系统的配置和管理。下面简单介绍一下内核中的注册表增删改查操作 注册表查询 在内核中可以使用ZwQueryValueKey或ZwEnumerateValueKey函数查询指定键的值。其中ZwQueryValueKey函数可以查询指定键的值而ZwEnumerateValueKey函数可以枚举指定键下的所有值。这两个函数都需要指定键的句柄和要查询的值的名称查询结果将返回在指定的缓冲区中。 注册表修改 在内核中可以使用ZwSetValueKey函数修改指定键的值。该函数需要指定键的句柄、要修改的值的名称、值的类型和值的数据。在修改注册表时需要注意权限和安全性问题以避免潜在的安全问题。 注册表添加 在内核中可以使用ZwCreateKey函数创建一个新的键。该函数需要指定要创建键的父键的句柄、新键的名称、新键的属性等信息。如果成功创建了新键则可以使用ZwSetValueKey函数向其添加值。 注册表删除 在内核中可以使用ZwDeleteValueKey函数删除指定键的值或使用ZwDeleteKey函数删除指定键及其下面的所有子键和值。这两个函数都需要指定要删除的键的句柄或路径。在删除注册表时同样需要注意权限和安全性问题以避免潜在的安全问题。 需要注意的是对注册表的操作可能会对系统的稳定性产生影响。因此在实现这些技术时需要遵循操作系统和安全软件的规定以确保系统的安全和稳定。 8.5.1 ZwCreateKey 创建注册表Key键内核函数ZwCreateKey可用于创建新的注册表项或打开现有注册表项。 ZwCreateKey是Windows内核中的一个函数用于创建一个新的注册表键registry key。它通常被驱动程序使用来添加新的配置信息或者修改已有的配置信息。 以下是ZwCreateKey函数的一般形式 NTSTATUS ZwCreateKey(_Out_ PHANDLE KeyHandle,_In_ ACCESS_MASK DesiredAccess,_In_ POBJECT_ATTRIBUTES ObjectAttributes,_Reserved_ ULONG TitleIndex,_In_ PUNICODE_STRING Class,_In_ ULONG CreateOptions,_Out_ PULONG Disposition );参数说明 KeyHandle 输出参数指向新创建的注册表键的句柄handle。DesiredAccess 指定新创建的键所需的访问权限比如KEY_QUERY_VALUE等具体请参考MSDN文档。ObjectAttributes 指向一个OBJECT_ATTRIBUTES结构体的指针该结构体包含了注册表键的一些属性信息比如名称、路径等。TitleIndex 指定键的标题索引。Class 指向一个UNICODE_STRING结构体的指针它用于指定新创建的键的类名。CreateOptions 指定创建键的选项比如REG_OPTION_NON_VOLATILE等。Disposition 输出参数指向一个ULONG类型的指针返回创建的键的状态信息比如REG_CREATED_NEW_KEY等。 函数执行成功时将返回STATUS_SUCCESS否则返回相应的错误代码。需要注意的是在使用ZwCreateKey函数之前必须先初始化OBJECT_ATTRIBUTES结构体以包含要创建的注册表键的完整路径。 在使用ZwCreateKey函数时需要注意权限和安全性问题以避免潜在的安全问题。同时需要仔细考虑键的类名、访问权限和创建选项等参数的设置以确保所创建的键能够正确地满足应用程序的需求。 #include ntifs.h// 创建或者打开已存在注册表键 BOOLEAN MyCreateRegistryKeyA(UNICODE_STRING ustrRegistry) {HANDLE hRegister NULL;OBJECT_ATTRIBUTES objectAttributes { 0 };ULONG ulResult 0;NTSTATUS status STATUS_SUCCESS;// 创建或者打开已存在注册表键InitializeObjectAttributes(objectAttributes, ustrRegistry, OBJ_CASE_INSENSITIVE, NULL, NULL);// 创建Keystatus ZwCreateKey(hRegister,KEY_ALL_ACCESS,objectAttributes,0,NULL,REG_OPTION_NON_VOLATILE,ulResult);if (!NT_SUCCESS(status)){return FALSE;}if (REG_CREATED_NEW_KEY ulResult){DbgPrint([*] 注册表已被创建 \n);}else if (REG_OPENED_EXISTING_KEY ulResult){DbgPrint([*] 注册表打开 \n);}// 关闭注册表键句柄ZwClose(hRegister);return TRUE; }// 创建键值对 BOOLEAN MyCreateRegistryKeyB(LPWSTR KeyName) {OBJECT_ATTRIBUTES objectAttributes;UNICODE_STRING usKeyName;NTSTATUS ntStatus;HANDLE hRegister;RtlInitUnicodeString(usKeyName, KeyName);// 初始化InitializeObjectAttributes(objectAttributes, usKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL);// 创建KeyntStatus ZwCreateKey(hRegister, KEY_ALL_ACCESS, objectAttributes, 0, NULL, REG_OPTION_NON_VOLATILE, NULL);if (NT_SUCCESS(ntStatus)){DbgPrint([*] 注册表已被创建 \n);ZwClose(hRegister);return TRUE;}else{DbgPrint([*] 注册表创建失败 \n);return FALSE;}return FALSE; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint((Uninstall Driver Is OK \n)); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(Hello lyshark \n);BOOLEAN flag FALSE;// 创建注册表键UNICODE_STRING ustrRegistry;RtlInitUnicodeString(ustrRegistry, L\\Registry\\Machine\\Software\\LySharkKeysA);flag MyCreateRegistryKeyA(ustrRegistry);if (flag TRUE){DbgPrint(注册表键已创建 \n);}// 创建注册表键flag MyCreateRegistryKeyB(L\\Registry\\Machine\\Software\\LySharkKeysB);if (flag TRUE){DbgPrint(注册表键已创建 \n);}Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }运行如上代码即可在计算机\HKEY_LOCAL_MACHINE\SOFTWARE\目录下分别创建LySharkKeysA和LySharkKeysB两个空目录输出效果如下图 8.5.2 ZwDeleteKey 删除注册表Key键内核函数ZwDeleteKey可从注册表中删除打开的项。 ZwDeleteKey是Windows内核中的一个函数用于删除指定的注册表键registry key。它通常被驱动程序使用来删除不再需要的配置信息或者清理无用的键。 以下是ZwDeleteKey函数的一般形式 NTSTATUS ZwDeleteKey(_In_ HANDLE KeyHandle );参数说明 KeyHandle要删除的键的句柄handle。 函数执行成功时将返回STATUS_SUCCESS否则返回相应的错误代码。需要注意的是在使用ZwDeleteKey函数之前需要先打开要删除的键获取其句柄。 在使用ZwDeleteKey函数时需要注意权限和安全性问题以避免潜在的安全问题。同时需要仔细考虑键的名称和路径等信息确保要删除的键是正确的并且不会对系统造成不良影响。 另外需要注意的是ZwDeleteKey函数只能用于删除空的注册表键。如果要删除非空的键需要先递归地删除该键下的所有子键和值。 #include ntifs.h// 删除注册表键 BOOLEAN MyDeleteRegistryKeyA(UNICODE_STRING ustrRegistry) {HANDLE hRegister NULL;OBJECT_ATTRIBUTES objectAttributes { 0 };NTSTATUS status STATUS_SUCCESS;// 打开注册表键InitializeObjectAttributes(objectAttributes, ustrRegistry, OBJ_CASE_INSENSITIVE, NULL, NULL);status ZwOpenKey(hRegister, KEY_ALL_ACCESS, objectAttributes);if (!NT_SUCCESS(status)){return FALSE;}// 删除注册表键status ZwDeleteKey(hRegister);if (!NT_SUCCESS(status)){ZwClose(hRegister);return FALSE;}// 关闭注册表键句柄ZwClose(hRegister);return TRUE; }// 删除注册表键 BOOLEAN MyDeleteRegistryKeyB(LPWSTR KeyName) {OBJECT_ATTRIBUTES objectAttributes;UNICODE_STRING usKeyName;NTSTATUS ntStatus;HANDLE hRegister;RtlInitUnicodeString(usKeyName, KeyName);// 初始化InitializeObjectAttributes(objectAttributes, usKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL);// 打开KeyntStatus ZwOpenKey(hRegister, KEY_ALL_ACCESS, objectAttributes);if (NT_SUCCESS(ntStatus)){ntStatus ZwDeleteKey(hRegister);ZwClose(hRegister);return TRUE;}else{return FALSE;}return FALSE; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint((Uninstall Driver Is OK \n)); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(Hello lyshark \n);BOOLEAN flag FALSE;// 删除注册表键UNICODE_STRING ustrRegistry;RtlInitUnicodeString(ustrRegistry, L\\Registry\\Machine\\Software\\LySharkKeysA);flag MyDeleteRegistryKeyA(ustrRegistry);if (flag TRUE){DbgPrint([*] 已删除 \n);}// 删除注册表键flag MyDeleteRegistryKeyB(L\\Registry\\Machine\\Software\\LySharkKeysB);if (flag TRUE){DbgPrint([*] 已删除 \n);}Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }编译并运行如上程序则可将ZwCreateKey创建的Key键删除当尝试再次打开LySharkKeysB则会提示打开失败输出效果如下所示 8.5.3 ZwRenameKey 重命名注册表Key键内核函数ZwRenameKey可修改特定注册表键名此函数需要自行导出。 ZwRenameKey是Windows内核中的一个函数用于重命名一个指定的注册表键。它通常被驱动程序使用来更改配置信息或者重命名键。 以下是ZwRenameKey函数的一般形式 NTSTATUS ZwRenameKey(_In_ HANDLE KeyHandle,_In_ PUNICODE_STRING NewName );参数说明 KeyHandle 要重命名的键的句柄handle。NewName 新键名称的Unicode字符串。 函数执行成功时将返回STATUS_SUCCESS否则返回相应的错误代码。需要注意的是在使用ZwRenameKey函数之前需要先打开要重命名的键获取其句柄。 在使用ZwRenameKey函数时需要注意权限和安全性问题以避免潜在的安全问题。同时需要仔细考虑键的名称和路径等信息确保要重命名的键是正确的并且不会对系统造成不良影响。另外需要确保新键名称是唯一的且符合注册表键名称的规范。 需要注意的是ZwRenameKey函数只能用于重命名单个键如果需要批量重命名键则需要自行实现递归操作。 #include ntifs.h// ZwRenameKey 需要自己导出 typedef NTSTATUS(__fastcall *ZWRENAMEKEY)(HANDLE KeyHandle, PUNICODE_STRING NewName);ZWRENAMEKEY MyZwRenameKey NULL;// 根据函数名得到函数内存地址 PVOID GetFunctionAddr(PCWSTR FunctionName) {UNICODE_STRING UniCodeFunctionName;RtlInitUnicodeString(UniCodeFunctionName, FunctionName);return MmGetSystemRoutineAddress(UniCodeFunctionName); }// 重命名注册表Key BOOLEAN RegRenameKey(LPWSTR OldKeyName, LPWSTR NewKeyName) {OBJECT_ATTRIBUTES objectAttributes;HANDLE hRegister;NTSTATUS ntStatus;UNICODE_STRING usOldKeyName, usNewKeyName;RtlInitUnicodeString(usOldKeyName, OldKeyName);RtlInitUnicodeString(usNewKeyName, NewKeyName);InitializeObjectAttributes(objectAttributes, usOldKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL);// 得到函数内存地址MyZwRenameKey (ZWRENAMEKEY)GetFunctionAddr(LZwRenameKey);ntStatus ZwOpenKey(hRegister, KEY_ALL_ACCESS, objectAttributes);if (NT_SUCCESS(ntStatus)){// 重命名Key键ntStatus MyZwRenameKey(hRegister, usNewKeyName);ZwFlushKey(hRegister);ZwClose(hRegister);return TRUE;}else{return FALSE;}return FALSE; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint((Uninstall Driver Is OK \n)); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(Hello lyshark \n);BOOLEAN flag FALSE;// 重命名键flag RegRenameKey(L\\Registry\\Machine\\Software\\LySharkKeysA, LSuperLyShark);if (flag TRUE){DbgPrint([*] 已被重命名 \n);}Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }编译并运行这段驱动程序自动将LySharkKeysA改名为SuperLyShark输出效果如下所示 8.5.4 ZwSetValueKey 在键中创建Value值在一个Key中增加一个新的值。 ZwSetValueKey是Windows内核中的一个函数用于向指定的注册表键中写入值。它通常被驱动程序使用来修改或添加配置信息或者键值。 以下是ZwSetValueKey函数的一般形式 NTSTATUS ZwSetValueKey(_In_ HANDLE KeyHandle,_In_ PUNICODE_STRING ValueName,_In_opt_ ULONG TitleIndex,_In_ ULONG Type,_In_opt_ PVOID Data,_In_ ULONG DataSize );参数说明 KeyHandle 要写入值的键的句柄handle。ValueName 要写入值的名称的Unicode字符串。TitleIndex 零基索引用于在键的名称列表中查找与ValueName相对应的索引值。Type 要写入的值的类型。Data 要写入的数据的指针。DataSize 要写入的数据的长度。 函数执行成功时将返回STATUS_SUCCESS否则返回相应的错误代码。需要注意的是在使用ZwSetValueKey函数之前需要先打开要写入值的键获取其句柄。 在使用ZwSetValueKey函数时需要注意权限和安全性问题以避免潜在的安全问题。同时需要仔细考虑键的名称和路径等信息确保要写入值的键是正确的并且不会对系统造成不良影响。另外需要确保写入的数据类型和长度正确以避免造成不必要的问题。 需要注意的是ZwSetValueKey函数只能用于向单个键写入单个值如果需要批量写入值则需要自行实现循环操作。 #include ntifs.h #include windef.h// 在键中增加值 BOOLEAN RegSetValueKey(LPWSTR KeyName, LPWSTR ValueName, DWORD DataType, PVOID DataBuffer, DWORD DataLength) {OBJECT_ATTRIBUTES objectAttributes;UNICODE_STRING usKeyName, usValueName;NTSTATUS ntStatus;HANDLE hRegister;RtlInitUnicodeString(usKeyName, KeyName);RtlInitUnicodeString(usValueName, ValueName);InitializeObjectAttributes(objectAttributes, usKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL);// 打开ntStatus ZwOpenKey(hRegister, KEY_ALL_ACCESS, objectAttributes);if (NT_SUCCESS(ntStatus)){// 设置注册表ntStatus ZwSetValueKey(hRegister, usValueName, 0, DataType, DataBuffer, DataLength);// 将请求刷新到磁盘ZwFlushKey(hRegister);ZwClose(hRegister);return TRUE;}else{return FALSE;}return FALSE; }// 添加或者修改注册表键值 BOOLEAN MySetRegistryKeyValue(UNICODE_STRING ustrRegistry, UNICODE_STRING ustrKeyValueName, ULONG ulKeyValueType, PVOID pKeyValueData, ULONG ulKeyValueDataSize) {HANDLE hRegister NULL;OBJECT_ATTRIBUTES objectAttributes { 0 };NTSTATUS status STATUS_SUCCESS;InitializeObjectAttributes(objectAttributes, ustrRegistry, OBJ_CASE_INSENSITIVE, NULL, NULL);// 打开注册表键status ZwOpenKey(hRegister, KEY_ALL_ACCESS, objectAttributes);if (!NT_SUCCESS(status)){return FALSE;}// 添加或者修改键值status ZwSetValueKey(hRegister, ustrKeyValueName, 0, ulKeyValueType, pKeyValueData, ulKeyValueDataSize);if (!NT_SUCCESS(status)){ZwClose(hRegister);return FALSE;}// 关闭注册表键句柄ZwClose(hRegister);return TRUE; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint((Uninstall Driver Is OK \n)); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(Hello lyshark \n);BOOLEAN flag FALSE;DWORD set_dw 1024;BOOLEAN is_true TRUE;WCHAR sz_char[256] Lhello lyshark;// 新建设置valueflag RegSetValueKey(L\\Registry\\Machine\\Software\\LySharkKeysA, Lis_auth, REG_DWORD, set_dw, sizeof(set_dw));if (flag TRUE){DbgPrint([*] 创建is_auth值成功 \n);}// 新建设置boolflag RegSetValueKey(L\\Registry\\Machine\\Software\\LySharkKeysA, Lis_trhe, REG_BINARY, is_true, sizeof(is_true));if (flag TRUE){DbgPrint([*] 创建is_true值成功 \n);}// 新建设置charflag RegSetValueKey(L\\Registry\\Machine\\Software\\LySharkKeysA, L1001, REG_SZ, sz_char, sizeof(sz_char));if (flag TRUE){DbgPrint([*] 创建char值成功 \n);}// 添加注册表键值UNICODE_STRING ustrRegistry;UNICODE_STRING ustrKeyValueName;WCHAR wstrKeyValueData[] LI am LyShark;RtlInitUnicodeString(ustrKeyValueName, L1002);RtlInitUnicodeString(ustrRegistry, L\\Registry\\Machine\\Software\\LySharkKeysA);flag MySetRegistryKeyValue(ustrRegistry, ustrKeyValueName, REG_SZ, wstrKeyValueData, sizeof(wstrKeyValueData));if (flag TRUE){DbgPrint([*] 创建char值成功 \n);}Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }编译并运行如上代码即可在\\Registry\\Machine\\Software\\LySharkKeysA分别创建一个整数布尔值字符串类型效果图如下 8.5.5 ZwQueryValueKey 查询某个Key键中的值调用后可输出特定键中的值。 ZwQueryValueKey是Windows内核中的一个函数用于从指定的注册表键中读取指定值的数据。它通常被驱动程序使用来获取配置信息或者键值。 以下是ZwQueryValueKey函数的一般形式 NTSTATUS ZwQueryValueKey(_In_ HANDLE KeyHandle,_In_ PUNICODE_STRING ValueName,_In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,_Out_opt_ PVOID KeyValueInformation,_In_ ULONG Length,_Out_ PULONG ResultLength );参数说明 KeyHandle 要读取值的键的句柄handle。ValueName 要读取值的名称的Unicode字符串。KeyValueInformationClass 指定要获取的键值的信息类型。KeyValueInformation 存储读取的键值信息的缓冲区。Length KeyValueInformation缓冲区的大小。ResultLength 实际读取的键值信息的大小。 函数执行成功时将返回STATUS_SUCCESS否则返回相应的错误代码。需要注意的是在使用ZwQueryValueKey函数之前需要先打开要读取值的键获取其句柄。 在使用ZwQueryValueKey函数时需要注意权限和安全性问题以避免潜在的安全问题。同时需要仔细考虑键的名称和路径等信息确保要读取值的键是正确的并且不会对系统造成不良影响。另外需要确保KeyValueInformation缓冲区的大小足够以存储读取的键值信息。 需要注意的是ZwQueryValueKey函数只能用于读取单个键的单个值如果需要读取多个键的值则需要自行实现循环操作。 #include ntifs.h #include windef.h// 查询Key键中的Value值 BOOLEAN RegQueryValueKey(LPWSTR KeyName, LPWSTR ValueName, PKEY_VALUE_PARTIAL_INFORMATION *pkvpi) {ULONG ulSize;NTSTATUS ntStatus;PKEY_VALUE_PARTIAL_INFORMATION pvpi;OBJECT_ATTRIBUTES objectAttributes;HANDLE hRegister;UNICODE_STRING usKeyName;UNICODE_STRING usValueName;RtlInitUnicodeString(usKeyName, KeyName);RtlInitUnicodeString(usValueName, ValueName);// 初始化InitializeObjectAttributes(objectAttributes, usKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL);// 打开注册表KeyntStatus ZwOpenKey(hRegister, KEY_ALL_ACCESS, objectAttributes);if (!NT_SUCCESS(ntStatus)){return FALSE;}// 查询长度ntStatus ZwQueryValueKey(hRegister, usValueName, KeyValuePartialInformation, NULL, 0, ulSize);if (ntStatus STATUS_OBJECT_NAME_NOT_FOUND || ulSize 0){return FALSE;}// 分配空间保存查询结果pvpi (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(PagedPool, ulSize);ntStatus ZwQueryValueKey(hRegister, usValueName, KeyValuePartialInformation, pvpi, ulSize, ulSize);if (!NT_SUCCESS(ntStatus)){return FALSE;}// 这里的pvpi未被释放可在外部释放// 执行 ExFreePool(pvpi); 释放*pkvpi pvpi;return TRUE; }// 查询注册表键值 BOOLEAN MyQueryRegistryKeyValue(UNICODE_STRING ustrRegistry, UNICODE_STRING ustrKeyValueName) {HANDLE hRegister NULL;OBJECT_ATTRIBUTES objectAttributes { 0 };NTSTATUS status STATUS_SUCCESS;ULONG ulBufferSize 0;PKEY_VALUE_PARTIAL_INFORMATION pKeyValuePartialInfo NULL;// 初始化InitializeObjectAttributes(objectAttributes, ustrRegistry, OBJ_CASE_INSENSITIVE, NULL, NULL);// 打开注册表Keystatus ZwOpenKey(hRegister, KEY_ALL_ACCESS, objectAttributes);if (!NT_SUCCESS(status)){return FALSE;}// 先获取查询注册表键值所需缓冲区的大小status ZwQueryValueKey(hRegister, ustrKeyValueName, KeyValuePartialInformation, NULL, 0, ulBufferSize);if (0 ulBufferSize){ZwClose(hRegister);return FALSE;}// 申请缓冲区pKeyValuePartialInfo (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(NonPagedPool, ulBufferSize);// 查询注册表键值并获取查询结果status ZwQueryValueKey(hRegister, ustrKeyValueName, KeyValuePartialInformation, pKeyValuePartialInfo, ulBufferSize, ulBufferSize);if (!NT_SUCCESS(status)){ExFreePool(pKeyValuePartialInfo);ZwClose(hRegister);return FALSE;}// 显示查询结果DbgPrint(KeyValueName%wZ, KeyValueType%d, KeyValueData%S\n, ustrKeyValueName, pKeyValuePartialInfo-Type, pKeyValuePartialInfo-Data);// 释放内存, 关闭句柄ExFreePool(pKeyValuePartialInfo);ZwClose(hRegister);return TRUE; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint((Uninstall Driver Is OK \n)); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(Hello lyshark \n);BOOLEAN flag FALSE;DWORD get_dw 0;PKEY_VALUE_PARTIAL_INFORMATION pkvi;// 查询设置flag RegQueryValueKey(L\\Registry\\Machine\\Software\\LySharkKeysA, Lis_auth, pkvi);if (flag TRUE){// 拷贝查询结果RtlCopyMemory(get_dw, pkvi-Data, pkvi-DataLength);// 输出结果DbgPrint([*] 查询结果: %d \n, get_dw);ExFreePool(pkvi);}// 第二种查询方式UNICODE_STRING ustrRegistry;UNICODE_STRING ustrKeyValueName;RtlInitUnicodeString(ustrRegistry, L\\Registry\\Machine\\Software\\LySharkKeysA);RtlInitUnicodeString(ustrKeyValueName, Lis_auth);MyQueryRegistryKeyValue(ustrRegistry, ustrKeyValueName);Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }编译并运行这段程序将会查询\\Registry\\Machine\\Software\\LySharkKeysA下面的is_auth字段中的值输出效果如下图所示 8.5.6 ZwEnumerateKey 枚举某个主键底部的子键值实现对指定主键中所有的子键的枚举。 ZwEnumerateKey是Windows内核中的一个函数用于列举指定注册表键下的子键。它通常被驱动程序使用来获取键列表以及子键的数量和名称等信息。 以下是ZwEnumerateKey函数的一般形式 NTSTATUS ZwEnumerateKey(_In_ HANDLE KeyHandle,_In_ ULONG Index,_In_ KEY_INFORMATION_CLASS KeyInformationClass,_Out_ PVOID KeyInformation,_In_ ULONG Length,_Out_ PULONG ResultLength );参数说明 KeyHandle 要列举子键的键的句柄handle。Index 指定要列举的子键的索引。KeyInformationClass 指定要获取的子键信息类型。KeyInformation 存储读取的子键信息的缓冲区。Length KeyInformation缓冲区的大小。ResultLength 实际读取的子键信息的大小。 函数执行成功时将返回STATUS_SUCCESS否则返回相应的错误代码。需要注意的是在使用ZwEnumerateKey函数之前需要先打开要列举子键的键获取其句柄。 在使用ZwEnumerateKey函数时需要注意权限和安全性问题以避免潜在的安全问题。同时需要仔细考虑键的名称和路径等信息确保要列举子键的键是正确的并且不会对系统造成不良影响。另外需要确保KeyInformation缓冲区的大小足够以存储读取的子键信息。 需要注意的是ZwEnumerateKey函数只能用于列举单个键下的子键如果需要列举多个键的子键则需要自行实现循环操作。 #include ntifs.h #include windef.h// 枚举子键 BOOLEAN EnumRegistrySubKey(WCHAR *MY_KEY_NAME) {UNICODE_STRING RegUnicodeString;HANDLE hRegister;OBJECT_ATTRIBUTES objectAttributes;NTSTATUS ntStatus;ULONG ulSize, i;UNICODE_STRING uniKeyName;PKEY_FULL_INFORMATION pfi;// 初始化UNICODE_STRING字符串RtlInitUnicodeString(RegUnicodeString, MY_KEY_NAME);// 初始化objectAttributes OBJ_CASE_INSENSITIVE(大小写敏感)InitializeObjectAttributes(objectAttributes, RegUnicodeString, OBJ_CASE_INSENSITIVE, NULL, NULL);// 打开注册表ntStatus ZwOpenKey(hRegister, KEY_ALL_ACCESS, objectAttributes);if (!NT_SUCCESS(ntStatus)){return FALSE;}// 第一次调用获取KEY_FULL_INFORMATION数据的长度ZwQueryKey(hRegister, KeyFullInformation, NULL, 0, ulSize);pfi (PKEY_FULL_INFORMATION)ExAllocatePool(PagedPool, ulSize);// 第二次调用获取KEY_FULL_INFORMATION数据的数据ZwQueryKey(hRegister, KeyFullInformation, pfi, ulSize, ulSize);// 循环输出子键for (i 0; ipfi-SubKeys; i){PKEY_BASIC_INFORMATION pbi;// 第一次调用获取KEY_BASIC_INFORMATION数据的长度ZwEnumerateKey(hRegister, i, KeyBasicInformation, NULL, 0, ulSize);pbi (PKEY_BASIC_INFORMATION)ExAllocatePool(PagedPool, ulSize);// 第二次调用获取KEY_BASIC_INFORMATION数据的数据ZwEnumerateKey(hRegister, i, KeyBasicInformation, pbi, ulSize, ulSize);uniKeyName.Length (USHORT)pbi-NameLength;uniKeyName.MaximumLength (USHORT)pbi-NameLength;uniKeyName.Buffer pbi-Name;DbgPrint([LyShark] 序号: %d | 子Key名: %wZ \n, i, uniKeyName);ExFreePool(pbi);}ExFreePool(pfi);ZwClose(hRegister);return TRUE; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint((Uninstall Driver Is OK \n)); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(Hello lyshark \n);WCHAR MY_KEY_NAME[] L\\Registry\\Machine\\Software;BOOLEAN flag EnumRegistrySubKey(MY_KEY_NAME);if (flag TRUE){DbgPrint([*] 枚举结束 \n);}Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }编译并运行如上代码片段则会枚举\\Registry\\Machine\\Software底部的所有子键值输出效果图如下所示 8.5.7 ZwEnumerateValueKey 用于枚举子键下所有键值对的值原理与上方枚举子键类似。 ZwEnumerateValueKey是Windows内核中的一个函数用于列举指定注册表键下的所有值。它通常被驱动程序使用来获取键值列表以及每个键值的名称、类型和数据等信息。 以下是ZwEnumerateValueKey函数的一般形式 NTSTATUS ZwEnumerateValueKey(_In_ HANDLE KeyHandle,_In_ ULONG Index,_In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,_Out_ PVOID KeyValueInformation,_In_ ULONG Length,_Out_ PULONG ResultLength );参数说明 KeyHandle 要列举值的键的句柄handle。Index 指定要列举的值的索引。KeyValueInformationClass 指定要获取的值信息类型。KeyValueInformation 存储读取的值信息的缓冲区。Length KeyValueInformation缓冲区的大小。ResultLength 实际读取的值信息的大小。 函数执行成功时将返回STATUS_SUCCESS否则返回相应的错误代码。需要注意的是在使用ZwEnumerateValueKey函数之前需要先打开要列举值的键获取其句柄。 在使用ZwEnumerateValueKey函数时需要注意权限和安全性问题以避免潜在的安全问题。同时需要仔细考虑键的名称和路径等信息确保要列举值的键是正确的并且不会对系统造成不良影响。另外需要确保KeyValueInformation缓冲区的大小足够以存储读取的值信息。 需要注意的是ZwEnumerateValueKey函数只能用于列举单个键下的所有值如果需要列举多个键的所有值则需要自行实现循环操作。 #include ntifs.h #include windef.h// 枚举子键 BOOLEAN EnumegistrySubValue(WCHAR *MY_KEY_NAME) {UNICODE_STRING RegUnicodeString;HANDLE hRegister;OBJECT_ATTRIBUTES objectAttributes;ULONG ulSize, i;UNICODE_STRING uniKeyName;PKEY_FULL_INFORMATION pfi;NTSTATUS ntStatus;// 初始化UNICODE_STRING字符串RtlInitUnicodeString(RegUnicodeString, MY_KEY_NAME);// 初始化objectAttributesInitializeObjectAttributes(objectAttributes, RegUnicodeString, OBJ_CASE_INSENSITIVE, NULL, NULL);// 打开注册表ntStatus ZwOpenKey(hRegister, KEY_ALL_ACCESS, objectAttributes);if (!NT_SUCCESS(ntStatus)){return FALSE;}// 查询VALUE的大小ZwQueryKey(hRegister, KeyFullInformation, NULL, 0, ulSize);pfi (PKEY_FULL_INFORMATION)ExAllocatePool(PagedPool, ulSize);ZwQueryKey(hRegister, KeyFullInformation, pfi, ulSize, ulSize);for (i 0; ipfi-Values; i){PKEY_VALUE_BASIC_INFORMATION pvbi;// 查询单个VALUE的大小ZwEnumerateValueKey(hRegister, i, KeyValueBasicInformation, NULL, 0, ulSize);pvbi (PKEY_VALUE_BASIC_INFORMATION)ExAllocatePool(PagedPool, ulSize);// 查询单个VALUE的详情ZwEnumerateValueKey(hRegister, i, KeyValueBasicInformation, pvbi, ulSize, ulSize);uniKeyName.Length (USHORT)pvbi-NameLength;uniKeyName.MaximumLength (USHORT)pvbi-NameLength;uniKeyName.Buffer pvbi-Name;DbgPrint([*] 子键: %d | 名称: %wZ | , i, uniKeyName);if (pvbi-Type REG_SZ){DbgPrint(类型: REG_SZ \n);}else if (pvbi-Type REG_MULTI_SZ){DbgPrint(类型: REG_MULTI_SZ \n);}else if (pvbi-Type REG_DWORD){DbgPrint(类型: REG_DWORD \n);}else if (pvbi-Type REG_BINARY){DbgPrint(类型: REG_BINARY \n);}ExFreePool(pvbi);}ExFreePool(pfi);ZwClose(hRegister);return TRUE; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint((Uninstall Driver Is OK \n)); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(Hello lyshark \n);WCHAR MY_KEY_NAME[] L\\Registry\\Machine\\Software\\LySharkKeysA;BOOLEAN flag EnumegistrySubValue(MY_KEY_NAME);if (flag TRUE){DbgPrint([*] 枚举结束 \n);}Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }编译并运行如上这段代码则可枚举出\\Registry\\Machine\\Software\\LySharkKeysA底部的所有子键以及该子键的键值输出效果如下图所示 8.5.8 ZwDeleteValueKey 用于删除指定键里面键值对的某个值。如果使用函数RegDeleteKey则删除键包括里面的所有值。 ZwDeleteValueKey是Windows内核中的一个函数用于删除指定注册表键下的一个值。它通常被驱动程序使用来删除指定键下的一个值以及释放该值占用的空间。 以下是ZwDeleteValueKey函数的一般形式 NTSTATUS ZwDeleteValueKey(_In_ HANDLE KeyHandle,_In_ PUNICODE_STRING ValueName );参数说明 KeyHandle 要删除值的键的句柄handle。ValueName 要删除的值的名称为Unicode字符串指针。 函数执行成功时将返回STATUS_SUCCESS否则返回相应的错误代码。需要注意的是在使用ZwDeleteValueKey函数之前需要先打开要删除值的键获取其句柄。 在使用ZwDeleteValueKey函数时需要注意权限和安全性问题以避免潜在的安全问题。同时需要仔细考虑键的名称和路径等信息确保要删除的值是正确的并且不会对系统造成不良影响。 需要注意的是ZwDeleteValueKey函数只能用于删除单个键下的一个值如果需要删除多个键的多个值则需要自行实现循环操作。 #include ntifs.h #include windef.h// 删除键中的值 BOOLEAN RegDeleteValueKey(LPWSTR KeyName, LPWSTR ValueName) {OBJECT_ATTRIBUTES objectAttributes;UNICODE_STRING usKeyName, usValueName;NTSTATUS ntStatus;HANDLE hRegister;RtlInitUnicodeString(usKeyName, KeyName);RtlInitUnicodeString(usValueName, ValueName);InitializeObjectAttributes(objectAttributes, usKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL);// 打开注册表ntStatus ZwOpenKey(hRegister, KEY_ALL_ACCESS, objectAttributes);if (NT_SUCCESS(ntStatus)){ntStatus ZwDeleteValueKey(hRegister, usValueName);ZwFlushKey(hRegister);ZwClose(hRegister);return TRUE;}else{return FALSE;}return FALSE; }// 删除注册表键值 BOOLEAN MyDeleteRegistryKeyValue(UNICODE_STRING ustrRegistry, UNICODE_STRING ustrKeyValueName) {HANDLE hRegister NULL;OBJECT_ATTRIBUTES objectAttributes { 0 };NTSTATUS status STATUS_SUCCESS;// 打开注册表键InitializeObjectAttributes(objectAttributes, ustrRegistry, OBJ_CASE_INSENSITIVE, NULL, NULL);status ZwOpenKey(hRegister, KEY_ALL_ACCESS, objectAttributes);if (!NT_SUCCESS(status)){return FALSE;}// 删除注册表键status ZwDeleteValueKey(hRegister, ustrKeyValueName);if (!NT_SUCCESS(status)){ZwClose(hRegister);return FALSE;}// 关闭注册表键句柄ZwClose(hRegister);return TRUE; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint((Uninstall Driver Is OK \n)); }NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) {DbgPrint(Hello lyshark \n);// 删除值BOOLEAN flag RegDeleteValueKey(L\\Registry\\Machine\\Software\\LySharkKeysA, Lis_auth);if (flag TRUE){DbgPrint([*] 删除子键 \n);}UNICODE_STRING ustrRegistry;UNICODE_STRING ustrKeyValueName;RtlInitUnicodeString(ustrRegistry, L\\Registry\\Machine\\Software\\LySharkKeysA);RtlInitUnicodeString(ustrKeyValueName, Lis_trhe);flag MyDeleteRegistryKeyValue(ustrRegistry, ustrKeyValueName);if (flag TRUE){DbgPrint([*] 删除子键 \n);}Driver-DriverUnload UnDriver;return STATUS_SUCCESS; }编译并运行如上驱动程序则会将\\Registry\\Machine\\Software\\LySharkKeysA里面的is_trhe以及is_auth删除效果图如下所示
http://www.pierceye.com/news/910903/

相关文章:

  • 广州网站建设市场佛山专业做网站公司哪家好
  • 四川省凉亭建设工程有限公司网站的博客wordpress
  • 搭建一个网站需要多少钱?如何做网站二级域名
  • 广德县住房和城乡建设网站wordpress网站维护教程
  • 在网站上显示地图金湖县网站建设
  • 网站域名区别吗模板和网站是一体的吗
  • 百度网盟推广怎么选择投放网站抖音seo代理
  • 电商wordpress网站优化百度
  • phpcms v9 网站搬家南通网站设计专家
  • 延安网站建设推广黄骅市网站建设价格
  • 做网站怎么选关键词网站管理强化阵地建设
  • 网站制作是那个cms 导航网站
  • 网站标题优化技巧房产信息网上自助查询系统
  • wordpress电影网教程合肥网站快速排名优化
  • 药房网站模板网站中英文要怎么做
  • 做影视网站用什么网盘最好wordpress投资主题
  • 潍坊市建设工程质量安全监督站网站网站建设的毕业设计
  • 建筑网站夜里几点维护怎么开发软件app软件
  • 厦门人才网官方网站wordpress 晒单
  • 网站不收录是什么原因网站建设与网页设计试卷
  • html网站模板资源2015做那个网站能致富
  • 设计导航精选最好的设计网站大全商城网站建设开发多少钱
  • 滨州j建设局网站投诉电话检察机关加强网站建设
  • 付费抽奖网站怎么做宁波网站推广营销
  • 单位的网站的建设个人网页制作策划书
  • 在中国可以做国外的域名网站吗企业网查询是什么
  • 网站开发在线浏览pdfwin7可以做网站吗
  • 手机上制作网站的软件巢湖有没有专门做网站的公司
  • 哪里有做企业网站的wordpress 主题类型
  • 什么是网站平台开发工具网站怎么做筛选功能的代码