Windows系統中監控檔案複製操作的幾種方式

2021-08-15 11:37:36 字數 3086 閱讀 9330

1. icopyhook

作用: 監視資料夾和印表機移動,刪除, 重新命名, 複製操作. 可以得到源和目標檔名. 可以控制拒絕操作.

缺點: 不能對檔案進行控制. 只對shell檔案操作有效, 對原生api movefile, copyfile之類的操作無效.

用法: 從icopyhook派生乙個com物件, 過載copycallbacka和copycallbackw, 然後把com註冊到hkrc\directory\shellex\copyhookhandlers\中去

2. 檔案改變通知

作用: 監視乙個資料夾下的檔案修改(寫入, 刪除, 重新命名), 並可以註冊到乙個視窗來處理通知.

缺點: 只是通知, 不可以拒絕操作. 不能區分是否檔案複製操作還是移動操作, 不能拿到源檔名. 只對shell檔案操作有效, 對原生api movefile, copyfile之類的操作無效.

用法: shchangenotifyregister 註冊乙個視窗接收檔案改變同; 或者findfirstchangenotification 結合findnextchangenotification 的方式處理.

3.ishellextinit

作用: 每乙個shell擴充套件物件建立都會觸發ishellexinit::initialize呼叫, 在shell中, 使用者的對檔案的複製貼上操作, 最終會被解析成檔案物件的拖拽操作, 然後觸發拖拽目標物件的shell擴充套件物件的呼叫. 所以在資料夾和碟符物件上註冊乙個ishellextinit可以監視到拖拽到資料夾物件的事件. 也就是可以監視到檔案複製或移動到資料夾的操作. 並且同時可以從ishellexitinit::initialize中可以獲取到源檔名.

缺點: 同通知一樣, 不能拒絕檔案操作. 只對shell檔案操作有效, 對原生api movefile, copyfile之類的操作無效.

用法: 從ishellextinit中派生乙個com物件, 過載initialize, 在initialize傳來的第乙個引數是目標目錄名, 第二個引數中可以獲取所有源檔名, 第三個引數是乙個登錄檔物件控制代碼.

下面給一段處理樣例:

hresult stdmethodcalltype ckcopyhook::initialize(

__in_opt  pcidlist_absolute pidlfolder,

__in_opt  idataobject *pdtobj,

__in_opt  hkey hkeyprogid)

if (ntqueryobject == 0)

return e_fail;

// 獲取 hkeyprogid 的名稱

std::auto_ptrbuffer(new wchar[4096]);

dword retlen = 0;

if (ntqueryobject(hkeyprogid, objectnameinformation, buffer.get(), 4096, &retlen) > 0)

return e_invalidarg;

pobject_name_information poni = (pobject_name_information)buffer.get();

poni->name.buffer[poni->name.length] = 0;

dbgoutputmessagew(l"[%s] hkeyprogid=0x%x=[%s]", __functionw__, hkeyprogid, poni->name.buffer);

// 當 hkeyprogid 是 folder 項時才進行檔案處理

if (wcsnicmp(pathfindfilenamew(poni->name.buffer), l"folder", 6) != 0)

return s_ok;

if (!shgetpathfromidlistw(pidlfolder, buffer.get()))

return e_invalidarg;

std::wstring deststr = buffer.get();

ret = e_invalidarg;

coledataobject oledo;

oledo.attach(pdtobj, false);

hglobal  globaldata;

globaldata = oledo.getglobaldata(cf_hdrop);

if (globaldata)

globalfree(globaldata);

}return ret;}

4. 檔案過濾驅動

作用: 控制所有檔案原子操作

缺點: 不能(或者說很難)追蹤檔案複製, 移動操作.

用法: 反正沒用, 不寫了.

5. api hooking

作用: 攔截copyfile, movefile等api, 可以任意控制檔案複製操作, 可以拒絕檔案操作, 也可以在複製前後插入自定義的操作, 相當靈活.

缺點: 麻煩, 相當麻煩, 相容性差.

用法: api hooking的技術這裡就不再陳述了.

需要攔截的api相當多, 從kernel32.dll中匯出的 movefile* copyfile* 系列函式, vista之前的系統中, shell都是使用shfileoperation進行檔案操作的, shfileoperation 內部也是呼叫kernel32中的這些函式, 所以可以不處理shfileoperation.

但是vista之後的系統, shell改為呼叫shfileoperationex, shfileroperationex內部並不使用copyfile, movecopy等的函式, 而是使用createfile, readfile, writefile 重疊io進行檔案操作, 並且shfileoperationex沒有在任何dll中匯出. 這樣就對攔截shfileroperationex帶來很大的麻煩.

不過可以利用搜尋特徵**的方式從記憶體中, 搜尋到shfileroperationex的位址.

下面這個是32位系統中shfileroperationex的開頭的特徵**, 在shell32.dll記憶體空間中, 32位的vista, win7適用 

const byte shfileoperationexcodemark = ;

//其中的0xff的位置跳過比對

Windows系統資源監控

3 使用基於pdh的python客戶端 我們都知道,windows自帶有系統資源監視器。主要有3個地方 1 windows的任務管理器的效能頁籤,包括了cpu,記憶體,磁碟,網路等系統資源的監控。它主要監控系統資源的總體使用情況,使用它,我們可以發現是否有資源達到瓶頸了等等。2 windows資源監...

C 監控 Windows 資料夾

您是否為無法看到孩子在電腦上儲存的而發愁,您是否為無法監控員工在電腦上儲存的東西而發愁,那麼今天給您推薦的這款產品絕對是您不二的選擇,它是由美國大廠生產,完全符合國際標準的產品,完美支援 windows 98 以上系統,他就是filesystemwatcher牌監控儀。他會偵聽檔案系統更改通知,並在...

82 2 監控檔案系統

誰開啟了該檔案?顯示開啟檔案filename的程序 lsof filename列出某個目錄下被開啟的檔案 lsof tmp command pid user fd type device size off node name seahorse 4158 neo cwd dir 8,2 53248 1...