首先,监控注册表信息的作用在于防止他人篡改数据,因为多数木马程序都是通过修改注册表信息来对电脑进行攻击,在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; }