- 首先,监控注册表信息的作用在于防止他人篡改数据,因为多数木马程序都是通过修改注册表信息来对电脑进行攻击,在WindowsAPI中,系统提供了
RegNotifyChangeKeyValue
这个函数方法来实现对注册表相关信息的监控。
RegNotifyChangeKeyValue (
__in HKEY hKey,
__in BOOL bWatchSubtree,
__in DWORD dwNotifyFilter,
__in_opt HANDLE hEvent,
__in BOOL fAsynchronous
);
的API各个参数的含义如下:
- ·
hKey
:指的是注册表项,这个可以通过RegOpenKeyEx
去获取注册表项的句柄 bWatchSubtree
指的是是否监控子注册表项的内容 可选参数为true或falsedwNotifyFilter
:指的是监控项的监控方式,可选的参数有:
#define REG_NOTIFY_CHANGE_NAME (0x00000001L) //监控名称是否发生改变
#define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L) //监控属性值是否改变
#define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L) // time stamp
#define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
hEvent
:指的是创建事件的句柄fAsynchronous
:False 表示监听到变化才返回,True:则是会立即返回,但是还会监听,本质上就是异步和同步的区别,然后可以通过监控事件hEvent
的方式。这个参数一般情况下True即可
- 实现步骤:
1.创建事件
2.打开注册表对应位置
3.使用RegNotifyChangeKeyValue进行监控
- 实现代码:
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
bool RegeditNotifyChanged(HKEY hKey_,std::wstring path_)
{
// 1.创建事件
HANDLE hNotify = CreateEvent(NULL,FALSE,TRUE,L"RegeditNotifyChanged");
if (hNotify == INVALID_HANDLE_VALUE)
{
cout << "监控事件创建失败" << endl;
CloseHandle(hNotify);
return false;
}
//2. 打开注册表对应位置
HKEY hRegKey ;
if (RegOpenKeyEx(hKey_,path_.c_str(),0,KEY_NOTIFY,&hRegKey)!=ERROR_SUCCESS)
{
cout << "打开注册表失败" << endl;
CloseHandle(hNotify);
RegCloseKey(hRegKey);
return false;
}
//3.使用RegNotifyChangeKeyValue进行监控
if (RegNotifyChangeKeyValue(hRegKey,TRUE,REG_NOTIFY_CHANGE_NAME|REG_NOTIFY_CHANGE_ATTRIBUTES|REG_NOTIFY_CHANGE_LAST_SET,hNotify,TRUE)!=ERROR_SUCCESS)
{
cout << "监控失败" << endl;
CloseHandle(hNotify);
RegCloseKey(hRegKey);
return false;
}
if (WaitForSingleObject(hNotify,INFINITE)!=WAIT_FAILED)
{
cout << "监控项发生改变" << endl;
CloseHandle(hNotify);
RegCloseKey(hRegKey);
return true;
}
CloseHandle(hNotify);
RegCloseKey(hRegKey);
return false;
}