您的位置:首页网络冲浪系统安全 → windows文件保护机制

windows文件保护机制

时间:2004/10/15 1:09:00来源:本站整理作者:蓝点我要评论(0)

    如果我们在win2000下运行任何过时的win32病毒,我们会发现一个讨厌的对话框,上面显示:

“一个受windows保护的系统文件被替换,为了维持系统的稳定性,这个文件已经被恢复成正确的系统版本,如

果你的程序发生了错误,请联系微软帮助中心获得支持。”

Heh!windows2000维护着一个被系统保护的文件的列表,并且忽略任何替换或修改这些文件的请求,同时显示

上面的信息。通过翻阅windows2000 DDK文档,我们可以发现更多有关文件保护的信息,

“当SFP检测到一个受保护的系统文件被替换,它会还原这个系统文件。当一个在系统保护目录下的文件被更改

时,SFP收到一个目录变更通知并被激活,SFP收到这个通知之后,它将检测哪个文件被更改,如果这个文件是

受保护的,SFP将从某个目录文件中寻找这个文件的数字签名来判断它是否是正确的版本,如果这个文件的版本

不正确,系统将试着用dllcache目录中的一个文件来恢复它,如果dllcache中没有这个文件,系统将会从distrib

ution media中寻找一个替代文件.


查找注册表我们可以找到一些与SFP有关的键:
HKEY_LOCAL_MACHINE
\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

SfcBugcheck
SfcDisable
SfcQuota
SfcScan


SfcDisable这个键似乎就是我们所要找的,这个键值可以是FLASE (00h) 或者 TRUE (01h),现在让我们把它设

成TRUE

FUCK! 真倒霉,我们没能改变世界,SfcDisable的确可以禁用SFP,但是只有下次启动之后才能生效,最糟的是

,下次启动的时候,系统将跳出一个消息框通知用户SFP已被禁用,然后系统将重新激活SFP。

当我在windows2000 bata 2 下工作时,我发现把 SfcDisable键值设成除00h和01h之外的数值(例如设置成04h

),可以防止系统在下次启动时显示警告对话框,这样很好。当系统重新激活SFP时,SFP将对受保护的文件进

行一次扫描,那个时候系统将警告我们哪些文件受到了修改。

当我写这篇文章的时候,windows2000 beta 3 build 2072已经推出了,我没有预料到SFP的执行过程被大幅度

的更改了,因此让我们仔细的看看它的内部运行机制。

在查看WINLOGON.EXE 输入节的时候,我注意到以下描述符:
SFC.DLL

Hint/Name Table: 0001BA80
TimeDateStamp: FFFFFFFF
ForwarderChain: FFFFFFFF
First thunk RVA: 00001690
Ordn Name
1
2

SFC.DLL是一个包含了SFP运行期函数的动态链接库,让我们看看它提供了哪些API
exports table:

Name: sfc.dll
Characteristics: 00000000
TimeDateStamp: 37741427
Version: 0.00
Ordinal base: 00000001
# of functions: 0000000B
# of Names: 00000004

Entry Pt Ordn Name
0000743A 1
000073D2 2
00003D70 3
00003DA9 4
00003DB5 5
00003DED 6
00003E21 7
00003F0B 8 SfcGetNextProtectedFile
00003FA0 9 SfcIsFileProtected
00008D1D 10 SfcWLEventLogoff
00008C5A 11 SfcWLEventLogon

看了这一大堆另人厌烦的函数之后,我决定仔细研究SfcIsFileProtected这个API,当我们传递一个文件名给Sf

cIsFileProtected,它将告诉我们这个文件是否受到SFP的保护,让我们来看看下面这段C代码:

if ( SfcIsFileProtected( NULL, szFileName) == 0)
{
printf ( "Not protected.\n") ;
}
else
{
printf ( "Yes, its protected.\n") ;
}

通过使用这个API,我们可以防止操作系统的重要文件受到病毒的感染,并且病毒无法寄生在这些受保护的文件

上去感染其它的计算机,这可能是一种防止病毒感染的办法。。。我从没见过有什么软件站点提供windows的计

算器程序下载: P

下面给出一些代码,演示SFC.DLL提供的一些API的用法
----------------------------------------------------------------------------------
GriYo / 29A

I'm not in the business...
...I am the business
哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪[win2k-sfp.txt]哪?
哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪[Sfc.c]哪?
//
// Sfc check
//
// A stupid but useful program to check if a file is protected
// by System File Protection
//
// Tested under Windows 2000 Professional Build 2128
//
// GriYo / 29A
//

#include "stdio.h"
#include
#include

int main( int argc, char* argv[])
{
OSVERSIONINFO VersionInformation ;
HMODULE hSFC ;
FARPROC a_SfcIsFileProtected ;
FARPROC a_SfcGetNextProtectedFile ;
WCHAR wszFileName[ MAX_PATH] ;
PROTECTED_FILE_DATA pfd ;

printf( "Sfp check by GriYo / 29A\n\n") ;

if ( argc > 2)
{
printf( "Usage:\n\n"
"%s <--- List protected files\n\n"
"or\n\n"
"%s /f:filename <--- Check if file is protected\n\n", argv[ 0], argv[ 0]) ;

return -1 ;
}

VersionInformation.dwOSVersionInfoSize = sizeof( OSVERSIONINFO) ;

if ( GetVersionEx( &VersionInformation) == 0)
{
printf( "Error: Api GetVersionEx() failed\n\n", argv[ 0]) ;
return -1 ;
}

if ( ( VersionInformation.dwPlatformId != VER_PLATFORM_WIN32_NT) ||
( VersionInformation.dwMajorVersion != 5))
{
printf( "Error: This program only runs under Windows 2000\n\n") ;
return -1 ;
}

if ( ( hSFC = LoadLibrary( "SFC.DLL")) == NULL)
{
printf( "Error: SFC.DLL not found\n\n", argv[ 0]) ;
return -1 ;
}

if ( argc == 2)
{
//
// SfcIsFileProtected
//
// [This is preliminary documentation and subject to change.]
//
// The SfcIsFileProtected function determines whether the specified
// file is protected. Applications should avoid replacing protected
// system files.
//
// BOOL WINAPI SfcIsFileProtected( IN HANDLE RpcHandle, // must be NULL
// IN LPCWSTR ProtFileName) ;
//
// Parameters:
//
// ProtFileName
//
// [in] Pointer to a string that specifies the name of the
// file.
//
// Return Value:
//
// If the file is protected, the return value is a nonzero
// value.
//
// If the file is not protected, the return value is zero.
//
// Requirements :
//
// Windows NT/2000: Requires Windows 2000.
// Windows 95/98: Unsupported.
// Windows CE: Unsupported.
// Header: Declared in sfc.h.
// Import Library: Use sfc.lib.
//
// See Also:
//
// SfcGetNextProtectedFile
//

if ( ( a_SfcIsFileProtected = GetProcAddress( hSFC, "SfcIsFileProtected")) == NULL)
{
FreeLibrary( hSFC) ;
printf( "Error: Api SfcIsFileProtected not found\n\n", argv[ 0]) ;
return -1 ;
}

MultiByteToWideChar(CP_ACP, 0, argv[ 1], -1, wszFileName, MAX_PATH) ;

if ( a_SfcIsFileProtected( NULL, wszFileName)) printf( "Protected file\n\n") ;
else printf( "Unprotected file\n\n") ;
}
else
{
//
// SfcGetNextProtectedFile
//
// [This is preliminary documentation and subject to change.]
//
// The SfcGetNextProtectedFile function retrieves the complete list of protected
// files. Applications should avoid replacing these files.
//
// BOOL WINAPI SfcGetNextProtectedFile( IN HANDLE RpcHandle, // must be NULL
// IN PPROTECTED_FILE_DATA ProtFileData) ;
//
// Parameters:
//
// ProtFileData [in/out] Receives the list of protected files. The format
// of this structure is as follows:
//
// typedef struct _PROTECTED_FILE_DATA {
// WCHAR FileName[ MAX_PATH] ;
// DWORD FileNumber ;
// } PROTECTED_FILE_DATA, *PPROTECTED_FILE_DATA ;
//
// Before calling this function the first time, set the FileNumber
// member to zero.
//
// Return Value:
//
// If the function succeeds, the return value is nonzero.
//
// If there are no more protected files to enumerate, the return value
// is zero.
//
// Requirements:
//
// Windows NT/2000: Requires Windows 2000.
// Windows 95/98: Unsupported.
// Windows CE: Unsupported.
// Header: Declared in sfc.h.
// Import Library: Use sfc.lib.
//
// See Also:
//
// SfcIsFileProtected
//

if ( ( a_SfcGetNextProtectedFile = GetProcAddress( hSFC, "SfcGetNextProtectedFile")) == NULL)
{
FreeLibrary( hSFC) ;
printf( "Error: Api SfcGetNextProtectedFile not found\n\n", argv[ 0]) ;
return -1 ;
}

printf( "List of protected files:\n\n") ;

pfd.FileNumber = 0 ;

while( SfcGetNextProtectedFile( NULL, &pfd) != 0)
{
printf( "%ws\n", &pfd.FileName) ;
}
}

FreeLibrary( hSFC) ;
return 0;
}


相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 U盘传播的病毒 _ U盘病打开U盘才不会中毒的方 alg.exe是什么进程?能不能关闭?nsis error是什么?及解决方法蓝屏错误代码解析 看代码解决问题dotnetfx.exe是什么

人气排行 alg.exe是什么进程?能不能关闭?qq修复工具怎么用如何更改ie收藏夹地址位置(路径)无光驱,无U盘启动,怎样重装系统?nsis error是什么?及解决方法Generic Host Process for Win32 开机后总是六种修复崩溃后WindowsXP系统的技巧exp1orer.exe 病毒清除办法