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...