如何禁止Windows檔案保護(WFP)。我們先來瞭解下WFP是如何工作的。相關的檔案是sfc_os.dll(2000下是sfc.dll,在xp下也有sfc.dll檔案,但都是調用sfc_os.dll的功能)和 Winlogon.exe 。
Winlogo進程通過調用sfc dll 匯出的函數進行檔案保護,後者通過FindFirstChangeNotification函數在使用者態監視要保護的目錄,然後通過WaitForSingleObject等待事件的發生。實際上如果你通過object viewer觀察這個進程,會找到每個保護目錄的控制代碼。這裡我用Process Explorer觀察得到:
EVENT /BaseNamedObjects/WFP_IDLE_TRIGGER
File D:/WINDOWS/system32/dllcache
File D:/WINDOWS/system32
……
那麼,我們是可以通過FindCloseChangeNotification或CloseHandle(兩個實際是相同的)來停止WFP監視系統目錄。
簡要步驟如下:
1. 在管理員身份下運行程式,提升自已進程的SeDebugPrivileges許可權
2. 找到winlogo進程的ID
3. 以PROCESS_DUP_HANDLE許可權開啟winlogo進程(後面要複製winlogo進程內的控制代碼)
4. 通過NtQuerySystemInformation函數,遍曆winlogo進程內所有開啟的控制代碼。
5. 通過NtQueryObject查詢控制代碼對象的名稱,如果名稱是我們需要停止保護的目錄,則用DuplicateHandle複製控制代碼到我們進程,
帶DUPLICATE_CLOSE_SOURCE標誌,然後調用CloseHandle關閉該控制代碼。
詳細代碼參考:http://bbs.driverdevelop.com/htm_data/101/0705/101763.html
Sfc_os.dll匯出的第5號函數(SetSfcFileException),也可用于禁止Windows檔案保護。通常,這個函數使得由參數指定的被保護檔案在60秒內可以修改替換,實際測試後,發現在xp下是沒有這個時間限制的。函數原型:
SetSfcFileException (DWORD param1, PWCHAR param2, DWORD param3);
param1: Always set to 0
param2: The full path of the file to modify later
param3: Always set to –1
代碼示範:
typedef DWORD(__stdcall *CPP) (DWORD param1, PWCHAR param2, DWORD param3);
void Disable_WFP()
{
HINSTANCE hmod=LoadLibrary("sfc_os.dll");
CPP SetSfcFileException;
// the function is stored at the fifth ordinal in sfc_os.dll
SetSfcFileException= (CPP)GetProcAddress(hmod,(LPCSTR)5);
SetSfcFileException(0, L"c://windows//system32//calc.exe",-1);
//Now we can modify the system file in a complete stealth.
}
--------------------------------
上面的方法,重啟之後將會失效
Cryptographic Services
引用:
提供三種管理服務: 編錄資料庫服務,它確定 Windows
檔案的簽名;受保護的根服務,它從此電腦添加和刪除受信根授權的認證;和密鑰(Key)服務,它協助註冊此電腦擷取認證。如果此服務被終止,
這些管理服務將無法正常運行。如果此服務被禁用,任何依賴它的服務將無法啟動。
在大家的反覆測試下 發現 CS服務以及WFP的幾個特性 CS服務在第一次關閉以後 會自動啟用
(往後 重複啟動 停止 CS都不會自動啟用了)
so 我想這就是 envymask為什麼測試會彈出框的原因
有兩個解決的辦法:
1.利用luoluo提出的替換服務 把 cs服務用其他服務替換 那麼即使cs再次啟動 也不能啟檢查作用
2.修改註冊表 HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Hardware Profiles/0001/System/CurrentControlSet/Enum/ROOT/LEGACY_CRYPTSVC/0000
0值 為啟用
1值 為禁用
為了徹底幹掉cs服務 我們設值為1
wfp的特性 僅在系統檔案被刪除 或者 替換的時候 調用cs服務對其進行檢測
而當我們結束cs服務 刪除 或者 替換系統檔案以後 再次啟動cs服務 wfp不會對系統檔案是否改動
做檢測 所以wfp的監控 是動態