网络安全编程:目录监控工具

 [[406308]]

本文介绍通过ReadDirectoryChangesW()来编写一个监视目录变化的程序。

对目录及目录中的文件实时监控,可以有效地发现文件被改动的情况。就好像在本地安装IIS服务器,并搭建一个网站平台,有时候会遭到黑客的篡改,而程序员无法及时地恢复被篡改的页面,导致出现了非常不好的影响。如果能及时地发现网页被篡改,并及时地恢复本来的页面就好了,那么该如何做呢?

下面通过一个简单的例子来介绍如何监控某目录及目录下文件的变动情况。首先需要了解的函数为ReadDirectoryChangesW(),其定义如下: 

  1. BOOL ReadDirectoryChangesW(  
  2.  HANDLE hDirectory,  
  3.  LPVOID lpBuffer,  
  4.  DWORD nBufferLength,  
  5.  BOOL bWatchSubtree,  
  6.  DWORD dwNotifyFilter,  
  7.  LPDWORD lpBytesReturned,  
  8.  LPOVERLAPPED lpOverlapped,  
  9.  LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine  
  10. ); 

参数说明如下。

hDirectory:该参数指向一个要监视目录的句柄。该目录需要用 FILE_LIST_DIRECTORY的访问权限打开。

lpBuffer:该参数指向一个内存的缓冲区,它用来存放返回的结果。结果为一个 FILE_NOTIFY_INFORMATION 的数据结构。

nBufferLength:表示缓冲区的大小。

bWatchSubtree:该参数为 TRUE 时,表示监视指定目录下的文件及子目录下的文件操作。如果该参数为 FALSE,则只监视指定目录下的文件,不包含子目录下的文件。

dwNotifyFilter:该参数指定要返回何种文件变更后的类型,该参数的常量值参见 MSDN。

lpBytesReturned:该参数返回传给 lpBuffer 结果的字节数。

lpOverlapped:该参数执行一个 OVERLAPPED 结构体,该结构体用于异步操作,否则该数据为 NULL。

ReadDirectoryChangesW()函数的使用非常简单,下面通过一个例子介绍其使用。该例子是对E盘目录进行监控,将程序编写完成后对E盘进行简单的文件操作,以观察程序的输出结构。完整的代码如下: 

  1. #include <windows.h>  
  2. #include <stdio.h>  
  3. extern "C"  
  4. BOOL  
  5. WINAPI  
  6. ReadDirectoryChangesW(  
  7.   __in HANDLE hDirectory,  
  8.   __out_bcount_part(nBufferLength, *lpBytesReturned) LPVOIDlpBuffer,  
  9.   __in DWORD nBufferLength,  
  10.   __in BOOL bWatchSubtree,  
  11.   __in DWORD dwNotifyFilter,  
  12.   __out LPDWORD lpBytesReturned,  
  13.   __inout LPOVERLAPPED lpOverlapped,  
  14.   __in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine  
  15.  ); 
  16. DWORD WINAPI ThreadProc(LPVOID lpParam)  
  17.  
  18.   BOOL bRet = FALSE 
  19.   BYTE Buffer[1024] = { 0 };  
  20.   FILE_NOTIFY_INFORMATION *pBuffer = (FILE_NOTIFY_INFORMATION *)Buffer;  
  21.   DWORD BytesReturned = 0 
  22.   HANDLE hFile = CreateFile("e:\\",  
  23.     FILE_LIST_DIRECTORY,  
  24.     FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE,  
  25.     NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);  
  26.   if ( INVALID_HANDLE_VALUE == hFile )  
  27.   {  
  28.     return 1;  
  29.   }  
  30.   printf("monitor... \r\n");  
  31.   while ( TRUE )  
  32.   {  
  33.     ZeroMemory(Buffer, 1024);  
  34.     bRet = ReadDirectoryChangesW(hFile,&Buffer,sizeof(Buffer),TRUE,  
  35.       FILE_NOTIFY_CHANGE_FILE_NAME | // 修改文件名  
  36.       FILE_NOTIFY_CHANGE_ATTRIBUTES | // 修改文件属性  
  37.       FILE_NOTIFY_CHANGE_LAST_WRITE , // 最后一次写入  
  38.       &BytesReturned,NULL, NULL);  
  39.     if ( bRet == TRUE )  
  40.     {  
  41.       char szFileName[MAX_PATH] = { 0 };  
  42.       // 宽字符转换多字节  
  43.       WideCharToMultiByte(CP_ACP,0,pBuffer->FileName,  
  44.         pBuffer->FileNameLength / 2,szFileName,  
  45.         MAX_PATH,NULL,NULL);  
  46.       switch(pBuffer->Action)  
  47.       {  
  48.         // 添加  
  49.         case FILE_ACTION_ADDED:  
  50.           {  
  51.             printf("添加 : %s\r\n", szFileName);  
  52.             break;  
  53.           }  
  54.           // 删除  
  55.         case FILE_ACTION_REMOVED:  
  56.           {  
  57.             printf("删除 : %s\r\n", szFileName); 
  58.             break;  
  59.           }  
  60.           // 修改  
  61.         case FILE_ACTION_MODIFIED:  
  62.           {  
  63.             printf("修改 : %s\r\n", szFileName);  
  64.             break; 
  65.           }  
  66.           // 重命名 
  67.          case FILE_ACTION_RENAMED_OLD_NAME:  
  68.           {  
  69.             printf("重命名 : %s", szFileName);  
  70.             if ( pBuffer->NextEntryOffset != 0 )  
  71.             {  
  72.               FILE_NOTIFY_INFORMATION *tmpBuffer = (FILE_NOTIFY_INFORMATION *)  
  73.                 ((DWORD)pBuffer + pBuffer->NextEntryOffset);  
  74.               switch ( tmpBuffer->Action )  
  75.               {  
  76.               case FILE_ACTION_RENAMED_NEW_NAME:  
  77.                 {  
  78.                   ZeroMemory(szFileName, MAX_PATH);  
  79.                   WideCharToMultiByte(CP_ACP,0,  
  80.                     tmpBuffer->FileName,tmpBuffer->FileNameLength / 2,  
  81.                     szFileName,MAX_PATH,NULL,NULL);  
  82.                   printf(" -> : %s \r\n", szFileName);  
  83.                   break;  
  84.                 }  
  85.               }  
  86.             }  
  87.             break;  
  88.           }  
  89.         case FILE_ACTION_RENAMED_NEW_NAME:  
  90.           {  
  91.             printf("重命名(new) : %s\r\n", szFileName);  
  92.           }  
  93.         }  
  94.       }  
  95.     }  
  96.     CloseHandle(hFile);  
  97.     return 0;  
  98.  
  99. int main(int argc, char* argv[])  
  100.  
  101.   HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);  
  102.   if ( hThread == NULL )  
  103.   {  
  104.     return -1;  
  105.   }  
  106.   WaitForSingleObject(hThread, INFINITE);  
  107.   CloseHandle(hThread);  
  108.   return 0;  

将程序编译连接并运行,在E盘下进行简单的操作,查看程序对E盘的监视输出记录,如图1所示。

图1  目录监控输出记录

对于目录监视的这个例子,可以将其改为一个简单的文件防篡改程序。首先将要监视的文件目录进行备份,然后对文件目录进行监视,如果有文件发生了修改,那么就使用备份目录下的指定文件恢复被修改的文件。 

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/143757.html<

(0)
运维的头像运维
上一篇2025-03-09 20:36
下一篇 2025-03-09 20:38

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注