运行驱动程序,则会输出当前系统中所有针对注册表的操作,如下图所示 。
文章插图
如上的代码只能实现注册表项的监视,而如果需要监控则需要在回调函数
MyLySharkCallback
判断,如果指定注册表项是需要保护的则直接返回status = STATUS_ACCESS_DENIED;
从而达到保护注册表的目的,核心代码如下所示 。// 反注册表删除回调NTSTATUS MyLySharkCallback(_In_ PVOID CallbackContext, _In_opt_ PVOID Argument1, _In_opt_ PVOID Argument2){ NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING ustrRegPath; // 获取操作类型 LONG lOperateType = (REG_NOTIFY_CLASS)Argument1; ustrRegPath.Length = 0; ustrRegPath.MaximumLength = 1024 * sizeof(WCHAR); ustrRegPath.Buffer = ExAllocatePool(NonPagedPool, ustrRegPath.MaximumLength); if (NULL == ustrRegPath.Buffer) {return status; } RtlZeroMemory(ustrRegPath.Buffer, ustrRegPath.MaximumLength); // 判断操作 switch (lOperateType) {// 删除键值之前 case RegNtPreDeleteValueKey: {// 获取注册表路径GetFullPath(&ustrRegPath, ((PREG_DELETE_VALUE_KEY_INFORMATION)Argument2)->Object);DbgPrint("[删除键值][%wZ][%wZ]\n", &ustrRegPath, ((PREG_DELETE_VALUE_KEY_INFORMATION)Argument2)->ValueName);// 如果要删除指定注册表项则拒绝PWCH pszRegister = L"\\REGISTRY\\MACHINE\\SOFTWARE\\lyshark.com";if (wcscmp(ustrRegPath.Buffer, pszRegister) == 0){DbgPrint("[lyshark] 注册表项删除操作已被拦截! \n");// 拒绝操作status = STATUS_ACCESS_DENIED;}break; } default:break; } // 释放内存 if (NULL != ustrRegPath.Buffer) {ExFreePool(ustrRegPath.Buffer);ustrRegPath.Buffer = NULL; } return status;}
运行驱动程序,然后我们尝试删除\\LyShark\HKEY_LOCAL_MACHINE\SOFTWARE\lyshark.com
里面的子项,则会提示如下信息 。文章插图
当然这里的
RegNtPreDeleteValueKey
是指的删除操作,如果将其替换成RegNtPreSetValueKey
,那么只有当注册表被创建才会拦截,此时就会变成拦截创建 。// 拦截创建操作NTSTATUS MyLySharkCallback(_In_ PVOID CallbackContext, _In_opt_ PVOID Argument1, _In_opt_ PVOID Argument2){ NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING ustrRegPath; // 获取操作类型 LONG lOperateType = (REG_NOTIFY_CLASS)Argument1; // 申请内存 ustrRegPath.Length = 0; ustrRegPath.MaximumLength = 1024 * sizeof(WCHAR); ustrRegPath.Buffer = ExAllocatePool(NonPagedPool, ustrRegPath.MaximumLength); if (NULL == ustrRegPath.Buffer) {return status; } RtlZeroMemory(ustrRegPath.Buffer, ustrRegPath.MaximumLength); // 判断操作 switch (lOperateType) { // 修改键值之前 case RegNtPreSetValueKey: {// 获取注册表路径GetFullPath(&ustrRegPath, ((PREG_DELETE_VALUE_KEY_INFORMATION)Argument2)->Object);// 拦截创建PWCH pszRegister = L"\\REGISTRY\\MACHINE\\SOFTWARE\\lyshark.com";if (wcscmp(ustrRegPath.Buffer, pszRegister) == 0){DbgPrint("[lyshark] 注册表项创建操作已被拦截! \n");status = STATUS_ACCESS_DENIED;}break; } default:break; } // 释放内存 if (NULL != ustrRegPath.Buffer) {ExFreePool(ustrRegPath.Buffer);ustrRegPath.Buffer = NULL; } return status;}
加载驱动保护,然后我们尝试在\\LyShark\HKEY_LOCAL_MACHINE\SOFTWARE\lyshark.com
里面创建一个子项,则会提示创建失败 。文章插图
经验总结扩展阅读
- 【pytest官方文档】解读-开发可pip安装的第三方插件
- 如何开发简单的游戏(自学开发一个游戏app)
- 个人如何开发手机游戏(如何自己开发一款手机游戏)
- 驱动开发:内核运用LoadImage屏蔽驱动
- 分享几个关于Camera的坑
- 二 京东云开发者| Redis数据结构-List、Hash、Set及Sorted Set的结构实现
- 物业是开发商请来的吗 小区没有业委会能不能换物业
- DevOps | 如何快速提升团队软件开发成熟度,快速提升研发效能?
- 三 【单片机入门】应用层软件开发的单片机学习之路-----UART串口通讯和c#交互
- 四十六 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-环境搭建