在Win7中删除系统文件(编程实现)

2012-11-24 Nie.Meining Coding

在Win7中编程实现删除系统文件分四步:

1. 提升本进程的权限(取得SeTakeOwnershipPrivilege权限);

2. 取得文件所有者权限;

3. 取得文件删除权限;

4. 删除文件(调用 DeleteFie 函数);

 

具体代码实现如下:

1. 提升本进程的权限(取得SeTakeOwnershipPrivilege权限):

BOOL GetTakeOwnershipPrivilege()
/*++
Routine Description:
   为本进程赋予 SeTakeOwnershipPrivilege 权限。

Return Value:
   成功返回 TRUE,失败返回 FALSE

Author:
   小聂
   2011/4/6
--*/
{
   HANDLE hProc = NULL;
   HANDLE hToken = NULL;
   BOOL bRet = FALSE;

   do {
       hProc = OpenProcess(PROCESS_QUERY_INFORMATION,
                           FALSE,
                           GetCurrentProcessId()
                         );
       if (!hProc)
           break;

       HANDLE hToken = NULL;

       bRet = OpenProcessToken(hProc, 
                               TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, 
                               &hToken
                           );

       if (!bRet)
           break;

       LUID Luid;

       bRet = LookupPrivilegeValue(NULL, 
                                   TEXT("SeTakeOwnershipPrivilege"), 
                                   &Luid
                               );
       if (!bRet)
           break;

       TOKEN_PRIVILEGES NewTP;
       NewTP.Privileges[0].Luid.LowPart = Luid.LowPart;
       NewTP.Privileges[0].Luid.HighPart = Luid.HighPart;
       NewTP.PrivilegeCount = 1;
       NewTP.Privileges[0].Attributes = 2;

       bRet = AdjustTokenPrivileges(hToken, FALSE, &NewTP, 0, 0, NULL);
       if (!bRet{
           break;
       }

       bRet = TRUE;
   } while (FALSE);

   if (hProc)
       CloseHandle(hProc);
   if (hToken)
       CloseHandle(hToken);
   return bRet;
}

 

2. 取得文件所有者权限:

BOOL
TakeOwnerShip(
   IN PCTSTR ptcsFilePath
   )
/*++
Routine Description:
   取得某文件的所有者权限。

Arguments:
   ptcsFilePath - 输入参数,要取得所有者权限的文件的完整路径.

Return Value:
   成功返回 TRUE,失败返回 FALSE

Author:
   小聂
   2011/4/6
--*/
{
   SID_IDENTIFIER_AUTHORITY sia = {0, 0, 0, 0, 0, 5};
   PSID pSid = NULL;
   HANDLE hFile = INVALID_HANDLE_VALUE;
   PACL pAcl = NULL;
   PSECURITY_DESCRIPTOR pSD = NULL;
   SECURITY_DESCRIPTOR sd;
   BOOL bRet = FALSE;
   do {
       if ( !ptcsFilePath )
           break;

       if (!AllocateAndInitializeSid(&sia, 0x2, 0x20, 0x220, 
                                     0, 0, 0, 0, 0, 0, &pSid))
           break;

       if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
           break;

       hFile = CreateFileptcsFilePath,
                           FILE_SUPPORTS_ENCRYPTION,
                           FILE_SHARE_READ,
                           NULL,
                           OPEN_EXISTING,
                           FILE_FLAG_BACKUP_SEMANTICS,
                           NULL
                       );
       if (hFile != INVALID_HANDLE_VALUE{
           DWORD dwStatus = GetSecurityInfo(hFile, 
                                            SE_FILE_OBJECT, 
                                            DACL_SECURITY_INFORMATION, 
                                            0, 
                                            0, 
                                            &pAcl, 
                                            0, 
                                            &pSD
                                           );
           if (dwStatus != ERROR_SUCCESS)
               break;
           if (!SetSecurityDescriptorDacl(&sd, TRUE, pAcl, FALSE))
               break;
       }

       if (!SetSecurityDescriptorOwner(&sd, pSid, FALSE))
           break;

       if (!SetFileSecurity(ptcsFilePath, OWNER_SECURITY_INFORMATION, &sd))
           break;

       bRet = TRUE;
   } while (FALSE);

   // over
   if (pSid)
       FreeSid(pSid);
   if (hFile != INVALID_HANDLE_VALUE)
       CloseHandle(hFile);
   if (pSD)
       LocalFree(pSD);
   return bRet;
}


3. 取得文件删除权限:

BOOL
GetFilePrivilege (
   IN PCTSTR ptcsFilePath
   )
/*++
Routine Description:
   取得删除文件的权限

Arguments:
   ptcsFilePath - 输入参数,要取得所有者权限的文件的完整路径

Return Value:
   成功返回 TRUE,失败返回 FALSE

Author:
   小聂
   2011/4/6
--*/
{
   SECURITY_DESCRIPTOR sd;

   if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
       return FALSE;

   if (!SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE))
       return FALSE;

   if (!SetFileSecurity(ptcsFilePath, DACL_SECURITY_INFORMATION, &sd))
       return FALSE;

   return TRUE;
}


4. 删除文件(调用 DeleteFie 函数):

 

注:以上代码基本上全部来自对系统系统文件 takeown.exe 的逆向分析。

 

 

评论:

aaa
2015-01-20 11:33
貌似TakeOwnerShip(wszSysFilePath)执行总是不成功啊
Nie.Meining
2015-01-28 10:39
@aaa:需要管理员权限吧
aaa
2015-02-04 00:19
@aaa:如果管理员权限不就可以直接删了么?可能是我理解有问题,我理解的系统文件只是需要管理员权限删除的文件,明天开虚拟机试试管理员权限能否删系统文件
同时感谢博主,在你这学了很多很感谢
aa
2013-11-23 22:14
标准的WRK编码风格啊
Nie.Meining
2013-12-10 22:05
@aa:没办法,典型的强迫症啊……

发表评论:

Powered by emlog