求关闭与开启系统文件保护功能

yanele 2009-12-25 04:08:52
上次发文,网上朋以给了一个过程调用,就可以实现关闭系统文件的保护:
procedure CloseWFP(DestFile: pwchar);
var
h: DWORD;
func: procedure(p1: Longint; p2: pwChar; p3: Longint); stdcall;
begin
h := LoadLibrary('sfc_os.dll');
@Func := GetProcAddress(h, lpcstr(5));
Func(0, DestFile, -1);
end;


我弄了好几天,网上也查了很久,这个方面应该算是比较好的方法!
其中'sfc_os.dll'好像只对XP系统有效,2000系统是'sfc.dll'文件,又不敢确认,不知道该如何处理?
但是,我现在想只是去掉timedate.cpl文件后把文件保护改回去开启,不知道怎么办?毕竟关闭系统文件保护还是存在一定的安全隐隐!

弄了很久也没有办法解决,所以再上发贴求助,不知道是不是Func(0, DestFile, -1);里的参数改了就可以了,具体改成多少?

如果能解决此问题,还可以加分!
...全文
540 17 打赏 收藏 举报
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yanele 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gyk120 的回复:]
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Windows File Protection是否存在那个项?把那个项删掉应该就正常了
[/Quote]

我没有找到Windows NT\Windows File Protection目录呢!
hjkto 2009-12-28
  • 打赏
  • 举报
回复
2楼发的代码并不通用,只是一部分而已,并不完全
yanele 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hjkto 的回复:]
禁用的代码网上有,但是没看到过启用的代码
[/Quote]

对呀,禁止我是用的:
procedure CloseWFP(DestFile: pwchar);
var
h: DWORD;
func: procedure(p1: Longint; p2: pwChar; p3: Longint); stdcall;
begin
h := LoadLibrary('sfc_os.dll');
@Func := GetProcAddress(h, lpcstr(5));
Func(0, DestFile, -1);
end;

我现在的问题是执行上面的操作后,如何还原、开启文件保护!
gyk120 2009-12-28
  • 打赏
  • 举报
回复
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Windows File Protection是否存在那个项?把那个项删掉应该就正常了
yanele 2009-12-28
  • 打赏
  • 举报
回复
如果实在不行,能通过Delphi程序实现下面的操作也行:
单击“开始”菜单→“运行”输入“gpedit.msc”打开“组策略编辑器”,再单击“计算机配置”→“Windows设置”→“安全设置”→“本地策略”→“用户权限分配”,在右侧窗格双击“更改系统时间”打开属性对话框,把用户全部删除,单击“确定”退出.刷新组策略使其生效。

上面这段是我知道可以通过手工来完成,简单地让计算机不能修改系统时间,但由于客户端较大,所以希望能过Delphi程序实现!?
hjkto 2009-12-27
  • 打赏
  • 举报
回复
禁用的代码网上有,但是没看到过启用的代码
yanele 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gyk120 的回复:]
这个其实说难也难,说简单也简单,SfcCloseEvents是存在于sfc那个DLL的,你可以看看这个DLL的导出表,通过名称判断是否有相关的函数,比如SfcIsFileProtected可以用来判断文件是否被保护等等
[/Quote]

我上次按照你的方法可以实现系统文件保护,现在想改回去就不知道怎么办了?
你说的太深奥了,对于我来说看不太懂,确实不知道如何实现!
帮帮忙吧!
gyk120 2009-12-26
  • 打赏
  • 举报
回复
网上找到一篇文章,说禁用保护最根本的是操作注册表
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Windows File Protection
如果存在name为SFCDisable的项,值是0xFFFFFF9D的话就禁用了WFP,把这个项删掉就正常了
无条件为你 2009-12-26
  • 打赏
  • 举报
回复
关注。
yanele 2009-12-26
  • 打赏
  • 举报
回复
怎么图片不见了,图片内容如下:

序号 导出函数名称 函数地址
8 SfcGetNextProtectedFile 0000F382
9 SfcIsFileProtected 0000F250
10 SfcWLEventLogoff 000093E8
11 SfcWLEventLogon 00009426
26228 00009436
24420 000094B2
29552 000094EF
25647 00009918
27757 000097C8
21249 00013CF7
25447 0001494D

个人感觉是SfcWLEventLogon函数,但不知道该怎么处理,怎么传参数才能达到恢复系统文件保护功能?
yanele 2009-12-26
  • 打赏
  • 举报
回复
我导出的结果是这样的,剩下的也就不会了:
gyk120 2009-12-26
  • 打赏
  • 举报
回复
我手头没有那个'sfc_os.dll',你可以用一些查看导出表的工具,比如PEid,看看那个DLL导出了哪些函数,那些函数当中可能有关闭和开启文件保护的函数,可以通过函数命名大致猜测一下
hjkto 2009-12-25
  • 打赏
  • 举报
回复
帮顶一下
huhuc 2009-12-25
  • 打赏
  • 举报
回复
上面哪个是通用的办法
这个只XP,1min
procedure CloseWFP(DestFile: pwchar);//BinJian
var
h: DWORD;
func: procedure(p1: Longint; p2: pwChar; p3: Longint); stdcall;
begin
h := LoadLibrary('sfc_os.dll');
@Func := GetProcAddress(h, lpcstr(5));
Func(0, DestFile, -1);
end;
huhuc 2009-12-25
  • 打赏
  • 举报
回复
//AFX
function DisableSFC: boolean;
var
Process, SFC, PID, Thread, ThreadID: longword;
begin
Result := False;
SFC := LoadLibrary('sfc.dll');
GetWindowThreadProcessID(FindWindow('NDDEAgnt', nil), @PID);
Process := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
Thread := CreateRemoteThread(Process, nil, 0, GetProcAddress(SFC, pchar(2 and $ffff)), nil, 0, ThreadId);
if Thread = 0 then Exit;
CloseHandle(Thread);
CloseHandle(Process);
FreeLibrary(SFC);
Result := True;
end;
gyk120 2009-12-25
  • 打赏
  • 举报
回复
这个其实说难也难,说简单也简单,SfcCloseEvents是存在于sfc那个DLL的,你可以看看这个DLL的导出表,通过名称判断是否有相关的函数,比如SfcIsFileProtected可以用来判断文件是否被保护等等
发帖
Windows SDK/API

1177

社区成员

Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
帖子事件
创建了帖子
2009-12-25 04:08
社区公告
暂无公告