关于Ring3层的注册表监控
最近一直想做远程操作的注册表,将客户端的注册表发送到主控端,遇到两个问题:
1.不能每次点击TreeControl都是一次请求的发送,太浪费资源。
2.在客户端的注册表监控效果也不是很好。(驱动不稳定,只想用Ring3层)
第一个问题比较好解决,在主控端加一个缓存结构就Ok,但是第二个问题还有一些问题。
常用的注册表监控一般都会使用钩子,Hook有关注册表操作的函数。但是这种方法是针对进程
而言,如果要监控全局,就要对每个进程Inject,这基本不现实。
一个使用DETOUR库的RegQueryValueExW函数
DETOUR_TRAMPOLINE(LONG APIENTRY Real_RegQueryValueExW(HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD), RegQueryValueExW);
LONG APIENTRY Mine_RegQueryValueExW(
HKEY hKey,
LPCWSTR lpValueName,
LPDWORD lpReserved,
LPDWORD lpType,
LPBYTE lpData,
LPDWORD lpcbData)
{
LONG nRet;
__try{
nRet = Real_RegQueryValueExW(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData);
if(!HOOK_RegQueryValueEx)
return nRet;
if(GetCurrentProcessId() == ExplorerPID)
return nRet;
if(GetCurrentProcessId() == RegMonPID)
return nRet;
if((PID == ) || ((GetCurrentProcessId() == PID) && (PID>)) )
{
if(nRet != ERROR_SUCCESS)
return nRet;
COPYDATASTRUCT data;
PARAMS params = {};
params.PID = GetCurrentProcessId();
params.hKey = hKey; if(lpValueName == NULL || /*lpType == NULL ||*/ lpData == NULL || lpcbData == NULL)
return nRet; memcpy(params.buffer1, lpValueName, wcslen(lpValueName)*); if(lpType == NULL)
params.type = ;
else
params.type = *lpType; if(*lpcbData == )
{
return nRet;
}
else if(*lpcbData>)
{
memcpy(params.buffer2, lpData, );
params.cbBuffer2 = ;
}
else
{
memcpy(params.buffer2, lpData, *lpcbData);
params.cbBuffer2 = *lpcbData;
} params.result = nRet; data.cbData = sizeof(PARAMS);
data.lpData = ¶ms;
data.dwData = TYPE_RegQueryValueExW;
SendMessage(hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&data);
} }__finally{
};
return nRet;
}
要在Ring3全局监控注册表的变化,只能使用RegNotifyChangeKeyValue微软提供的接口,但得不到具体的改变。
MSDN提供的例子:
#include <windows.h>
#include <tchar.h>
#include <stdio.h> //void main(int argc, char *argv[])
void __cdecl _tmain(int argc, TCHAR *argv[])
{
DWORD dwFilter = REG_NOTIFY_CHANGE_NAME |
REG_NOTIFY_CHANGE_ATTRIBUTES |
REG_NOTIFY_CHANGE_LAST_SET |
REG_NOTIFY_CHANGE_SECURITY; HANDLE hEvent;
HKEY hMainKey;
HKEY hKey;
LONG lErrorCode; // Display the usage error message.
if (argc != )
{
_tprintf(TEXT("Usage: notify [HKLM|HKU|HKCU|HKCR|HCC] [<subkey>]\n"));
return;
} // Convert parameters to appropriate handles.
if (_tcscmp(TEXT("HKLM"), argv[]) == ) hMainKey=HKEY_LOCAL_MACHINE;
else if(_tcscmp(TEXT("HKU"), argv[]) == ) hMainKey=HKEY_USERS;
else if(_tcscmp(TEXT("HKCU"), argv[]) == ) hMainKey=HKEY_CURRENT_USER;
else if(_tcscmp(TEXT("HKCR"), argv[]) == ) hMainKey=HKEY_CLASSES_ROOT;
else if(_tcscmp(TEXT("HCC"), argv[]) == ) hMainKey=HKEY_CURRENT_CONFIG;
else
{
_tprintf(TEXT("Usage: notify [HKLM|HKU|HKCU|HKCR|HCC] [<subkey>]\n"));
return;
} // Open a key.
lErrorCode = RegOpenKeyEx(hMainKey, argv[], , KEY_NOTIFY, &hKey);
if (lErrorCode != ERROR_SUCCESS)
{
_tprintf(TEXT("Error in RegOpenKeyEx (%d).\n"), lErrorCode);
return;
} // Create an event.
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (hEvent == NULL)
{
_tprintf(TEXT("Error in CreateEvent (%d).\n"), GetLastError());
return;
} // Watch the registry key for a change of value.
lErrorCode = RegNotifyChangeKeyValue(hKey,
TRUE,
dwFilter,
hEvent,
TRUE);
if (lErrorCode != ERROR_SUCCESS)
{
_tprintf(TEXT("Error in RegNotifyChangeKeyValue (%d).\n"), lErrorCode);
return;
} // Wait for an event to occur.
_tprintf(TEXT("Waiting for a change in the specified key...\n"));
if (WaitForSingleObject(hEvent, INFINITE) == WAIT_FAILED)
{
_tprintf(TEXT("Error in WaitForSingleObject (%d).\n"), GetLastError());
return;
}
else _tprintf(TEXT("\nChange has occurred.\n")); // Close the key.
lErrorCode = RegCloseKey(hKey);
if (lErrorCode != ERROR_SUCCESS)
{
_tprintf(TEXT("Error in RegCloseKey (%d).\n"), GetLastError());
return;
} // Close the handle.
if (!CloseHandle(hEvent))
{
_tprintf(TEXT("Error in CloseHandle.\n"));
return;
}
}
暂时先这样解决吧,有什么好的方法再多多积累。
关于Ring3层的注册表监控的更多相关文章
- 用Visual studio11在Windows8上开发驱动实现注册表监控和过滤
在Windows NT中,80386保护模式的“保护”比Windows 95中更坚固,这个“镀金的笼子”更加结实,更加难以打破.在Windows 95中,至少应用程序I/O操作是不受限制的,而在Win ...
- 入侵检测中需要监控的注册表路径研究(Windows Registry Security Check)
1. Windows注册表简介 注册表(Registry,繁体中文版Windows称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息.早在Wind ...
- Win64 驱动内核编程-15.回调监控注册表
回调监控注册表 在 WIN32 平台上,监控注册表的手段通常是 SSDT HOOK.不过用 SSDT HOOK 的方式监控注册表实在是太麻烦了,要 HOOK 一大堆函数,还要处理一些 NT6 系统有而 ...
- 驱动开发:内核监控Register注册表回调
在笔者前一篇文章<驱动开发:内核枚举Registry注册表回调>中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监 ...
- Process Monitor监控进程操作注册表如何实现?
http://zhidao.baidu.com/link?url=Kqav4qkQSprC5FnpHPOGJvhqvY9fJ9-Vdx9g_SWh4w5VOusdRJo4Vl7qIdrG4LwRJvr ...
- [No000017F]如何监控注册表的修改
今天我们将向您展示如何使用我们最喜欢的工具之一Proc Mon,在您更改PC上的组策略设置时查看编辑的注册表项. 使用Proc Mon查看组策略对象修改的注册表设置 您要做的第一件事就是从Sys In ...
- Windows x86/ x64 Ring3层注入Dll总结
欢迎转载,转载请注明出处:http://www.cnblogs.com/uAreKongqi/p/6012353.html 0x00.前言 提到Dll的注入,立马能够想到的方法就有很多,比如利用远程线 ...
- 病毒木马查杀实战第020篇:Ring3层主动防御之基本原理
前言 假设说我们的计算机中安装有杀毒软件,那么当我们有意或无意地下载了一个恶意程序后.杀软一般都会弹出一个对话框提示我们,下载的程序非常可能是恶意程序,建议删除之类的.或者杀软就不提示.直接删除了:或 ...
- Java 使用 JRegistry-1.8.1 读取和设置 windows 注册表
在一个监控相关的Java项目中,需要读取windows系统的注册表,搜索到使用 JRegistery 可以解决.代码如下: /** * @author digdeep@126.com */ publi ...
随机推荐
- 【转】CentOS 7.3 从下载到安装
CentOS 7.3 从下载到安装 https://blog.csdn.net/sxy2475/article/details/75194142 [百度知道]图解CentOS 7.3安装步骤 ht ...
- smb.conf - Samba组件的配置文件
总览 SYNOPSIS smb.conf是Samba组件的配置文件,包含Samba程序运行时的配置信息.smb.conf被设计成可由swat (8)程序来配置和管理.本文件包含了关于smb.conf的 ...
- Codeforces 1186F - Vus the Cossack and a Graph 模拟乱搞/欧拉回路
题意:给你一张无向图,要求对这张图进行删边操作,要求删边之后的图的总边数 >= ceil((n + m) / 2), 每个点的度数 >= ceil(deg[i] / 2).(deg[i]是 ...
- MYSQL如何优化?
MYSQL如何优化?结合你的经验 1.数据库的设计尽量把数据库设计的更小的占磁盘空间.1).尽可能使用更小的整数类型.(mediumint就比int更合适).2).尽可能的定义字段为not null, ...
- enumerate()(Python)
>>> E=enumerate('spam') >>> E <enumerate object at 0x1021ceca8> >>> ...
- Flink(一)集群配置
三台主机 centos6 已经完成的工作: 防火墙已关闭 主机名修改完毕,ssh免密登陆配置完成 jdk已安装 zookeeper已经部署并运行 hadoop已经部署并运行 版本:flink-1.8. ...
- Linux文件归档工具——cpio
一cpio的介绍 功能:复制文件从或到归档 cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件. cpio [选项] > 文件 ...
- 阿里云 Centos 7 PHP7环境配置 LNMP
首先更新系统软件 $ yum update 安装nginx 1.安装nginx源 $ yum localinstall http://nginx.org/packages/centos/7/noarc ...
- sql 基础语法3:分组,聚合函数,having,联合查询,快速备份,内联函数
select * from Classinfo select * from StuInfo select * from CourseInfo select * from ScoreInfo --分组 ...
- [CSP-S模拟测试]:简单的填数(贪心+模拟)
题目描述 对于一个长度为$n$,且下标从$1$开始编号的序列$a$,我们定义它是「合法的」,当且仅当它满足以下条件:·$a_1=1$·对于$i\in [1,n),a_i\leqslant a_{i+1 ...