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

wordpress图片站模板廊坊seo排名扣费

wordpress图片站模板,廊坊seo排名扣费,申请做网站要什么局,专注高密做网站哪家强在笔者前一篇文章《内核枚举Registry注册表回调》中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监控函数,通过这两个函数可以在不劫持内核API的前提下实…

在笔者前一篇文章《内核枚举Registry注册表回调》中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监控函数,通过这两个函数可以在不劫持内核API的前提下实现对注册表增加,删除,创建等事件的有效监控,注册表监视通常会通过CmRegisterCallback创建监控事件并传入自己的回调函数,与该创建对应的是CmUnRegisterCallback当注册表监控结束后可用于注销回调。

CmRegisterCallback和CmUnRegisterCallback是Windows操作系统提供的两个内核API函数,用于注册和取消注册注册表回调函数。

注册表回调函数是一种内核回调函数,它可以用于监视和拦截系统中的注册表操作,例如键值的创建、修改和删除等。当有相关操作发生时,操作系统会调用注册的注册表回调函数,并将操作相关的信息传递给回调函数。

CmRegisterCallback函数用于注册注册表回调函数,而CmUnRegisterCallback函数则用于取消注册已经注册的回调函数。开发者可以在注册表回调函数中执行自定义的逻辑,例如记录日志、过滤敏感数据、或者阻止某些操作。

需要注意的是,注册表回调函数的注册和取消注册必须在内核模式下进行,并且需要开发者有一定的内核开发经验。同时,注册表回调函数也需要遵守一些约束条件,例如不能阻塞或挂起进程或线程的创建或访问,不能调用一些内核API函数等。

内核监控Register注册表回调在安全软件、系统监控和调试工具等领域有着广泛的应用。开发者可以利用这个机制来监视和拦截系统中的注册表操作,以保护系统安全。

  • CmRegisterCallback 设置注册表回调
  • CmUnRegisterCallback 注销注册表回调

默认情况下CmRegisterCallback需传入三个参数,参数一回调函数地址,参数二空余,参数三回调句柄,微软定义如下。

// 参数1:回调函数地址
// 参数2:无作用
// 参数3:回调句柄
NTSTATUS CmRegisterCallback([in]           PEX_CALLBACK_FUNCTION Function,[in, optional] PVOID                 Context,[out]          PLARGE_INTEGER        Cookie
);

自定义注册表回调函数MyLySharkCallback需要保留三个参数,CallbackContext回调上下文,Argument1是操作类型,Argument2定义详细结构体指针。

NTSTATUS MyLySharkCallback(_In_ PVOID CallbackContext, _In_opt_ PVOID Argument1, _In_opt_ PVOID Argument2)

在自定义回调函数内Argument1则可获取到操作类型,类型是一个REG_NOTIFY_CLASS枚举结构,微软对其的具体定义如下所示。

typedef enum _REG_NOTIFY_CLASS {RegNtDeleteKey,RegNtPreDeleteKey = RegNtDeleteKey,RegNtSetValueKey,RegNtPreSetValueKey = RegNtSetValueKey,RegNtDeleteValueKey,RegNtPreDeleteValueKey = RegNtDeleteValueKey,RegNtSetInformationKey,RegNtPreSetInformationKey = RegNtSetInformationKey,RegNtRenameKey,RegNtPreRenameKey = RegNtRenameKey,RegNtEnumerateKey,RegNtPreEnumerateKey = RegNtEnumerateKey,RegNtEnumerateValueKey,RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,RegNtQueryKey,RegNtPreQueryKey = RegNtQueryKey,RegNtQueryValueKey,RegNtPreQueryValueKey = RegNtQueryValueKey,RegNtQueryMultipleValueKey,RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,RegNtPreCreateKey,RegNtPostCreateKey,RegNtPreOpenKey,RegNtPostOpenKey,RegNtKeyHandleClose,RegNtPreKeyHandleClose = RegNtKeyHandleClose,//// .Net only//    RegNtPostDeleteKey,RegNtPostSetValueKey,RegNtPostDeleteValueKey,RegNtPostSetInformationKey,RegNtPostRenameKey,RegNtPostEnumerateKey,RegNtPostEnumerateValueKey,RegNtPostQueryKey,RegNtPostQueryValueKey,RegNtPostQueryMultipleValueKey,RegNtPostKeyHandleClose,RegNtPreCreateKeyEx,RegNtPostCreateKeyEx,RegNtPreOpenKeyEx,RegNtPostOpenKeyEx,//// new to Windows Vista//RegNtPreFlushKey,RegNtPostFlushKey,RegNtPreLoadKey,RegNtPostLoadKey,RegNtPreUnLoadKey,RegNtPostUnLoadKey,RegNtPreQueryKeySecurity,RegNtPostQueryKeySecurity,RegNtPreSetKeySecurity,RegNtPostSetKeySecurity,//// per-object context cleanup//RegNtCallbackObjectContextCleanup,//// new in Vista SP2 //RegNtPreRestoreKey,RegNtPostRestoreKey,RegNtPreSaveKey,RegNtPostSaveKey,RegNtPreReplaceKey,RegNtPostReplaceKey,MaxRegNtNotifyClass //should always be the last enum
} REG_NOTIFY_CLASS;

其中对于注册表最常用的监控项为以下几种类型,当然为了实现监控则我们必须要使用之前,如果使用之后则只能起到监视而无法做到监控的目的。

  • RegNtPreCreateKey 创建注册表之前
  • RegNtPreOpenKey 打开注册表之前
  • RegNtPreDeleteKey 删除注册表之前
  • RegNtPreDeleteValueKey 删除键值之前
  • RegNtPreSetValueKey 修改注册表之前

如果需要实现监视则,首先CmRegisterCallback注册一个自定义回调,当有消息时则触发MyLySharkCallback其内部获取到lOperateType操作类型,并通过switch选择不同的处理例程,每个处理例程都通过GetFullPath得到注册表完整路径,并打印出来,这段代码实现如下。

#include <ntifs.h>
#include <windef.h>// 未导出函数声明 pEProcess -> PID
PUCHAR PsGetProcessImageFileName(PEPROCESS pEProcess);NTSTATUS ObQueryNameString(_In_ PVOID Object,_Out_writes_bytes_opt_(Length) POBJECT_NAME_INFORMATION ObjectNameInfo,_In_ ULONG Length,_Out_ PULONG ReturnLength);// 注册表回调Cookie
LARGE_INTEGER g_liRegCookie;// 获取注册表完整路径
BOOLEAN GetFullPath(PUNICODE_STRING pRegistryPath, PVOID pRegistryObject)
{// 判断数据地址是否有效if ((FALSE == MmIsAddressValid(pRegistryObject)) ||(NULL == pRegistryObject)){return FALSE;}// 申请内存ULONG ulSize = 512;PVOID lpObjectNameInfo = ExAllocatePool(NonPagedPool, ulSize);if (NULL == lpObjectNameInfo){return FALSE;}// 获取注册表路径ULONG ulRetLen = 0;NTSTATUS status = ObQueryNameString(pRegistryObject, (POBJECT_NAME_INFORMATION)lpObjectNameInfo, ulSize, &ulRetLen);if (!NT_SUCCESS(status)){ExFreePool(lpObjectNameInfo);return FALSE;}// 复制RtlCopyUnicodeString(pRegistryPath, (PUNICODE_STRING)lpObjectNameInfo);// 释放内存ExFreePool(lpObjectNameInfo);return TRUE;
}// 注册表回调函数
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 RegNtPreCreateKey:{// 获取注册表路径GetFullPath(&ustrRegPath, ((PREG_CREATE_KEY_INFORMATION)Argument2)->RootObject);DbgPrint("[创建注册表][%wZ][%wZ]\n", &ustrRegPath, ((PREG_CREATE_KEY_INFORMATION)Argument2)->CompleteName);break;}// 打开注册表之前case RegNtPreOpenKey:{// 获取注册表路径GetFullPath(&ustrRegPath, ((PREG_CREATE_KEY_INFORMATION)Argument2)->RootObject);DbgPrint("[打开注册表][%wZ][%wZ]\n", &ustrRegPath, ((PREG_CREATE_KEY_INFORMATION)Argument2)->CompleteName);break;}// 删除键之前case RegNtPreDeleteKey:{// 获取注册表路径GetFullPath(&ustrRegPath, ((PREG_DELETE_KEY_INFORMATION)Argument2)->Object);DbgPrint("[删除键][%wZ] \n", &ustrRegPath);break;}// 删除键值之前case RegNtPreDeleteValueKey:{// 获取注册表路径GetFullPath(&ustrRegPath, ((PREG_DELETE_VALUE_KEY_INFORMATION)Argument2)->Object);DbgPrint("[删除键值][%wZ][%wZ] \n", &ustrRegPath, ((PREG_DELETE_VALUE_KEY_INFORMATION)Argument2)->ValueName);// 获取当前进程, 即操作注册表的进程PEPROCESS pEProcess = PsGetCurrentProcess();if (NULL != pEProcess){UCHAR *lpszProcessName = PsGetProcessImageFileName(pEProcess);if (NULL != lpszProcessName){DbgPrint("进程 [%s] 删除了键值对 \n", lpszProcessName);}}break;}// 修改键值之前case RegNtPreSetValueKey:{// 获取注册表路径GetFullPath(&ustrRegPath, ((PREG_SET_VALUE_KEY_INFORMATION)Argument2)->Object);DbgPrint("[修改键值][%wZ][%wZ] \n", &ustrRegPath, ((PREG_SET_VALUE_KEY_INFORMATION)Argument2)->ValueName);break;}default:break;}// 释放内存if (NULL != ustrRegPath.Buffer){ExFreePool(ustrRegPath.Buffer);ustrRegPath.Buffer = NULL;}return status;
}VOID UnDriver(PDRIVER_OBJECT driver)
{DbgPrint(("Uninstall Driver Is OK \n"));// 注销当前注册表回调if (0 < g_liRegCookie.QuadPart){CmUnRegisterCallback(g_liRegCookie);}
}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{DbgPrint(("hello lyshark \n"));// 设置注册表回调NTSTATUS status = CmRegisterCallback(MyLySharkCallback, NULL, &g_liRegCookie);if (!NT_SUCCESS(status)){g_liRegCookie.QuadPart = 0;return status;}Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;
}

运行驱动程序,则会输出当前系统中所有针对注册表的操作,如下图所示。

如上的代码只能实现注册表项的监视,而如果需要监控则需要在回调函数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";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里面的子项,则会提示如下信息。

当然这里的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";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里面创建一个子项,则会提示创建失败。

http://www.hkea.cn/news/207025/

相关文章:

  • 三门峡网站建设电话青岛网站推广公司
  • 洞口做网站找谁市场营销推广方案模板
  • 怎么做用来表白的网站湖人队最新消息
  • 新疆网站建设哪家好泉州网站seo外包公司
  • 网站开发前后端工具组合深圳推广公司推荐
  • 老外做的汉字网站一键生成app制作器
  • 网上设计接单的网站seo排名优化排行
  • wordpress后台加统计代码seo建站的步骤
  • 怎么做外贸网站的邮箱签名搜索引擎优化是指什么
  • 网页制作基础教程免费邯郸网站seo
  • phpcms做网站感想漯河seo推广
  • 公司部门kpi绩效考核指标模板河北百度seo软件
  • 印团网网站是哪家做的唯尚广告联盟
  • 网红营销网站seo综合查询怎么用的
  • 西安地区网站建设云推广
  • wordpress个人站2020年关键词排名
  • 网站建设企业公司石家庄新闻头条新闻最新今天
  • 道滘镇做网站百度统计
  • qq空间做宣传网站怎样建立自己的网站平台
  • 做设计一般用的素材网站是什么意思刷网站排名软件
  • 帮人做兼职的网站吗青岛seo服务哪家好
  • 贷款类网站怎样做网络营销的推广
  • 乐清做网站哪家好税收大数据
  • 校园网站建设需求天津放心站内优化seo
  • 哈尔滨微网站建设热搜在哪里可以看
  • 网站用oracle做数据库福州seo推广服务
  • 康保县城乡建设委员会网站营销型网站重要特点是
  • 手机做网站的步骤跨境电商有哪些平台
  • 请人做网站要多少网络事件营销
  • 网站页脚有什么作用厦门seo哪家强