《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 業(yè)界動(dòng)態(tài) > 網(wǎng)絡(luò)安全編程:目錄監(jiān)控工具

網(wǎng)絡(luò)安全編程:目錄監(jiān)控工具

2021-07-31
來(lái)源:計(jì)算機(jī)與網(wǎng)絡(luò)安全
關(guān)鍵詞: 目錄監(jiān)控 工具

  本文介紹通過(guò)ReadDirectoryChangesW()來(lái)編寫一個(gè)監(jiān)視目錄變化的程序。

  對(duì)目錄及目錄中的文件實(shí)時(shí)監(jiān)控,可以有效地發(fā)現(xiàn)文件被改動(dòng)的情況。就好像在本地安裝IIS服務(wù)器,并搭建一個(gè)網(wǎng)站平臺(tái),有時(shí)候會(huì)遭到黑客的篡改,而程序員無(wú)法及時(shí)地恢復(fù)被篡改的頁(yè)面,導(dǎo)致出現(xiàn)了非常不好的影響。如果能及時(shí)地發(fā)現(xiàn)網(wǎng)頁(yè)被篡改,并及時(shí)地恢復(fù)本來(lái)的頁(yè)面就好了,那么該如何做呢?

  下面通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)介紹如何監(jiān)控某目錄及目錄下文件的變動(dòng)情況。首先需要了解的函數(shù)為ReadDirectoryChangesW(),其定義如下:

  BOOL ReadDirectoryChangesW(

  HANDLE hDirectory,

  LPVOID lpBuffer,

  DWORD nBufferLength,

  BOOL bWatchSubtree,

  DWORD dwNotifyFilter,

  LPDWORD lpBytesReturned,

  LPOVERLAPPED lpOverlapped,

  LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine

  );

  參數(shù)說(shuō)明如下。

  hDirectory:該參數(shù)指向一個(gè)要監(jiān)視目錄的句柄。該目錄需要用 FILE_LIST_DIRECTORY的訪問(wèn)權(quán)限打開。

  lpBuffer:該參數(shù)指向一個(gè)內(nèi)存的緩沖區(qū),它用來(lái)存放返回的結(jié)果。結(jié)果為一個(gè) FILE_NOTIFY_INFORMATION 的數(shù)據(jù)結(jié)構(gòu)。

  nBufferLength:表示緩沖區(qū)的大小。

  bWatchSubtree:該參數(shù)為 TRUE 時(shí),表示監(jiān)視指定目錄下的文件及子目錄下的文件操作。如果該參數(shù)為 FALSE,則只監(jiān)視指定目錄下的文件,不包含子目錄下的文件。

  dwNotifyFilter:該參數(shù)指定要返回何種文件變更后的類型,該參數(shù)的常量值參見(jiàn) MSDN。

  lpBytesReturned:該參數(shù)返回傳給 lpBuffer 結(jié)果的字節(jié)數(shù)。

  lpOverlapped:該參數(shù)執(zhí)行一個(gè) OVERLAPPED 結(jié)構(gòu)體,該結(jié)構(gòu)體用于異步操作,否則該數(shù)據(jù)為 NULL。

  ReadDirectoryChangesW()函數(shù)的使用非常簡(jiǎn)單,下面通過(guò)一個(gè)例子介紹其使用。該例子是對(duì)E盤目錄進(jìn)行監(jiān)控,將程序編寫完成后對(duì)E盤進(jìn)行簡(jiǎn)單的文件操作,以觀察程序的輸出結(jié)構(gòu)。完整的代碼如下:

  #include <windows.h>

  #include <stdio.h>

  extern “C”

  BOOL

  WINAPI

  ReadDirectoryChangesW(

  __in HANDLE hDirectory,

  __out_bcount_part(nBufferLength, *lpBytesReturned) LPVOIDlpBuffer,

  __in DWORD nBufferLength,

  __in BOOL bWatchSubtree,

  __in DWORD dwNotifyFilter,

  __out LPDWORD lpBytesReturned,

  __inout LPOVERLAPPED lpOverlapped,

  __in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine

  );

  DWORD WINAPI ThreadProc(LPVOID lpParam)

  {

  BOOL bRet = FALSE;

  BYTE Buffer[1024] = { 0 };

  FILE_NOTIFY_INFORMATION *pBuffer = (FILE_NOTIFY_INFORMATION *)Buffer;

  DWORD BytesReturned = 0;

  HANDLE hFile = CreateFile(“e:\\”,

  FILE_LIST_DIRECTORY,

  FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE,

  NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);

  if ( INVALID_HANDLE_VALUE == hFile )

  {

  return 1;

  }

  printf(“monitor… \r\n”);

  while ( TRUE )

  {

  ZeroMemory(Buffer, 1024);

  bRet = ReadDirectoryChangesW(hFile,&Buffer,sizeof(Buffer),TRUE,

  FILE_NOTIFY_CHANGE_FILE_NAME | // 修改文件名

  FILE_NOTIFY_CHANGE_ATTRIBUTES | // 修改文件屬性

  FILE_NOTIFY_CHANGE_LAST_WRITE , // 最后一次寫入

  &BytesReturned,NULL, NULL);

  if ( bRet == TRUE )

  {

  char szFileName[MAX_PATH] = { 0 };

  // 寬字符轉(zhuǎn)換多字節(jié)

  WideCharToMultiByte(CP_ACP,0,pBuffer->FileName,

  pBuffer->FileNameLength / 2,szFileName,

  MAX_PATH,NULL,NULL);

  switch(pBuffer->Action)

  {

  // 添加

  case FILE_ACTION_ADDED:

  {

  printf(“添加 : %s\r\n”, szFileName);

  break;

  }

  // 刪除

  case FILE_ACTION_REMOVED:

  {

  printf(“刪除 : %s\r\n”, szFileName);

  break;

  }

  // 修改

  case FILE_ACTION_MODIFIED:

  {

  printf(“修改 : %s\r\n”, szFileName);

  break;

  }

  // 重命名

  case FILE_ACTION_RENAMED_OLD_NAME:

  {

  printf(“重命名 : %s”, szFileName);

  if ( pBuffer->NextEntryOffset != 0 )

  {

  FILE_NOTIFY_INFORMATION *tmpBuffer = (FILE_NOTIFY_INFORMATION *)

  ((DWORD)pBuffer + pBuffer->NextEntryOffset);

  switch ( tmpBuffer->Action )

  {

  case FILE_ACTION_RENAMED_NEW_NAME:

  {

  ZeroMemory(szFileName, MAX_PATH);

  WideCharToMultiByte(CP_ACP,0,

  tmpBuffer->FileName,tmpBuffer->FileNameLength / 2,

  szFileName,MAX_PATH,NULL,NULL);

  printf(“ -> : %s \r\n”, szFileName);

  break;

  }

  }

  }

  break;

  }

  case FILE_ACTION_RENAMED_NEW_NAME:

  {

  printf(“重命名(new) : %s\r\n”, szFileName);

  }

  }

  }

  }

  CloseHandle(hFile);

  return 0;

  }

  int main(int argc, char* argv[])

  {

  HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);

  if ( hThread == NULL )

  {

  return -1;

  }

  WaitForSingleObject(hThread, INFINITE);

  CloseHandle(hThread);

  return 0;

  }

  將程序編譯連接并運(yùn)行,在E盤下進(jìn)行簡(jiǎn)單的操作,查看程序?qū)盤的監(jiān)視輸出記錄,如圖1所示。

  圖片

  圖1  目錄監(jiān)控輸出記錄

  對(duì)于目錄監(jiān)視的這個(gè)例子,可以將其改為一個(gè)簡(jiǎn)單的文件防篡改程序。首先將要監(jiān)視的文件目錄進(jìn)行備份,然后對(duì)文件目錄進(jìn)行監(jiān)視,如果有文件發(fā)生了修改,那么就使用備份目錄下的指定文件恢復(fù)被修改的文件。




電子技術(shù)圖片.png

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 中文字幕国产视频 | 亚洲一区二区三区香蕉 | www.成人在线视频 | 夭天曰天天躁天 | 国产免费黄视频 | 免费的看黄网站 | 五月天在线影院 | 精品亚洲一区二区三区 | 另类色综合 | 欧美videosex娇小hd | 国产亚洲一路线二路线高质量 | 在线亚洲精品国产成人二区 | 欧美成人黄色 | 国产欧美在线观看视频 | 永久视频免费 | 色视频在线免费看 | 特大一级aaaaa毛片 | 亚洲国产精品日韩在线观看 | 国产综合色在线视频区色吧图片 | 成人短视频在线在线观看 | 99久久免费国产精精品 | 亚洲制服丝袜在线观看 | 无遮挡免费视频 | 国产日韩一区二区三区在线观看 | www.操.com| 最近中文字幕2019视频1 | 成人精品一区二区三区中文字幕 | 国产日韩欧美亚洲 | 有色hd| 免费性网站| 国产在线观看一区二区三区四区 | 国产一级大片 | 女bbbbxxxx毛片视频0 | 中国一及黄色片 | 亚洲人色大成年网站在线观看 | 一区二区三区四区精品视频 | 九九国产视频 | 老师影院| 精品国产第一国产综合精品 | 香蕉久久夜色精品国产小优 | 国产女同一区二区在线 |