Windows 从 2000 开始就引入了系统文件保护功能(WFP),今天先看看如何列出被保护的系统文件。
代码很简单,只调用了一个 api 函数:SfcGetNextProtectedFile
DECLARE Long SfcGetNextProtectedFile IN sfc Long RpcHandle, String @ ProtFileData CREATE CURSOR pfiles ( fname C(128) ) m.cPFD = REPLICATE( CHR(0), 260*2+4 ) DO WHILE .T. IF ( 0 == SfcGetNextProtectedFile( 0, @ m.cPFD )) EXIT ELSE INSERT INTO pfiles ( fname ) VALUES ( ; RTRIM( STRCONV( LEFT( m.cPFD, 260*2 ), 6 ), CHR(0)) ) m.cPFD = REPLICATE( CHR(0), 260*2 ) + RIGHT( m.cPFD, 4 ) ENDIF ENDDO LOCATE BROWSE NAME m.oBrowser NOWAIT WITH m.oBrowser AS Grid .AllowCellSelection = .F. .HighlightBackColor = RGB(49,106,197) .HighlightForeColor = RGB(255,255,255) WITH .Columns(1) .FontName = 'Tahoma' WITH .Header1 .Caption = '被保护的文件' .FontName = 'Tahoma' ENDWITH ENDWITH ENDWITH MESSAGEBOX( '总计有 ' + TRANSFORM(RECCOUNT()) + ' 个文件受到保护。' ) |
接下来看看如何关闭这个保护功能
按照国外大侠们找到方法,大概有 5 种,参见这里:http://www.bitsum.com/aboutwfp.asp
先看看第 5 种方法,它采用修改保护文件列表 SfcFiles.dll 的方法,而且需要纠正检查和并在重启之后生效,不好
再看看第 4 种方法,它使用了注册表中的一个后门方法,不过 MS 已用补丁关闭了它,所以要改动补丁后的 sfc_os.dll 文件,也不好
剩下的三种方法中,第 2/3 种都采用了调用 sfc_os.dll 中未公开接口的方法,这在 C/Delphi 中都很容易实现,但在 vfp 中要调用一个 dll 中未导出的函数比较困难,我们只能用 LoadLibrary 装入这个 dll,然后用 GetProcessAddress 得到这个未公开函数d 地址指针,但 vfp 没有办法直接调用函数指针
这样看来就只有第一种方法可以比较容易的实现了,研究中...
另外,是否存在简单的方法添加我们自己的程序到这个保护列表中,从而享受这免费的保护呢?