2014-09-24 40 views
1

我在寫微過濾器來阻止應用程序執行。微過濾器將向用戶模式應用程序請求IRP_MJ_CREATE上的文件掃描。 usermode應用程序將掃描是否允許執行PE文件(.exe/.dll/etc)或否。微過濾器:阻止應用程序通知

目前,當用戶模式應用程序顯示「否」時,微過濾器將發出拒絕訪問狀態並取消打開的文件。發出拒絕訪問返回值時(是的,使用FltCancelFileOpen

問題是,從用戶角度出發,他們將得到一個消息框,從系統是這樣的: Windows cannot access the specified path or file. You may not have the appropriate permissions to access the item.

又如,阻斷特定的時被加載的DLL,另一個消息框會出現:

The application was unable to start correctly (0xc00000022)

我想做到的是仍然拒絕開放,但禁止該消息框,並有自己的通知,這是一個用戶友好的ERR或表示應用程序被阻止的消息。例子就像Windows 8智能屏幕功能,它會在運行被阻止的exe文件時通知用戶,而沒有任何消息框表示訪問被拒絕或類似。 Windows 8 smart screen

我該怎麼做?

回答

1

我們來看看DLL的例子。你得到這個錯誤,因爲有代碼在Windows相當於

if (!LoadLibrary(szDllName)) 
{ 
    MessageBox("Application Error", ...); 
} 
else 
{ 
    DllMain = GetProcAddress("DllMain"); 
    DllMain(DLL_PROCESS_ATTACH); 

所以,如果你不希望採取的代碼的第一個分支,則應當允許DLL加載。沒有第三種選擇。

Windows 8的例子有誤導性。如果你是微軟,當然你可以添加第三個選項。

關於第二個想法,您是否取消了使用FltCancelFileOpen的操作?如果沒有,那麼你是怎麼做到的?

+0

感謝您的洞察力,我意識到這一點。也許我正在尋找的是在運行之前終止應用程序的東西。例如,IIRC,PsSetImageNotify。 – 2014-09-24 14:26:18

+0

聽起來不像是一個可行的計劃 - 該加載的DLL發生在加載程序鎖定下。如果加載成功,則DllMain將在相同的鎖定下執行。要終止應用程序,您還需要加載器鎖,以便等待DllMain完成。 (我認爲Windows現在會殺死失控的DllMains,但它不是即時的) – MSalters 2014-09-24 14:52:36

+0

這裏只是一個想法,我並不確定它的可行性......你可以將庫打開重定向到另一個自己創建的文件,一個空的DllMain。這將允許調用者認爲他已成功加載。無論調用者下一次嘗試什麼,您仍然遇到問題,即GetProcAddress將失敗。但是,這可能會讓您在調用GetProcAddress之前終止該進程。 – lordjeb 2014-09-24 15:40:45