如何禁止Windows文件保护(WFP)

如何禁止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的监控 是动态的

你可能感兴趣的:(windows)