未命名文章

原理是以独占的方式打开文件,再把文件句柄复制到另一个程序中去,达到本程序退出后目标文件仍被打开的目的
program createfile;  
uses
Windows, SysUtils;
//提权函数
procedure SetPrivilege;
var
TPPrev, TP: TTokenPrivileges;
TokenHandle: THandle;
dwRetLen: DWORD;
lpLuid: TLargeInteger;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ALL_ACCESS, TokenHandle);
if (LookupPrivilegeValue(nil, ’SeDebugPrivilege’, lpLuid)) then
begin
TP.PrivilegeCount := 1;
TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
TP.Privileges[0].Luid := lpLuid;
AdjustTokenPrivileges(TokenHandle, False, TP, SizeOf(TPPrev), TPPrev, dwRetLen);
end;
CloseHandle(TokenHandle);
end;
procedure OccupyFile(lpFileName: string);
var
hProcess, hFile, hTargetHandle: thandle;
begin
 //打开一个pid为4的进程,只要是存在的进程,都可以
hProcess := OpenProcess(PROCESS_DUP_HANDLE, FALSE, 4);
if (hProcess = 0) then exit;
//以独占模式打开目标文件
hFile := CreateFileA(PChar(lpFileName), GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile = INVALID_HANDLE_VALUE) then
begin
CloseHandle(hProcess);
exit;
end;
//把文件句柄复制到pid=4的进程中去,这样,只要pid=4的进程不退出,谁也动不了目标文件
DuplicateHandle(GetCurrentProcess(), hFile, hProcess, @hTargetHandle, 0, FALSE, DUPLICATE_SAME_ACCESS or DUPLICATE_CLOSE_SOURCE);
CloseHandle(hProcess);
end;
begin
SetPrivilege;
OccupyFile(’D:\Program Files\工具软件\任务管理.exe’);//这是要保护的程序名
end.

以下是vc6.0代码

#include   

//提权函数  

void RaiseToDebugP()  

{  

HANDLE hToken;  

HANDLE hProcess = GetCurrentProcess();  

if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )  

{  

  TOKEN_PRIVILEGES tkp;  

  if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )  

  {  

   tkp.PrivilegeCount = 1;  

   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  

     

   BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;  

  }  

  CloseHandle(hToken);  

}      

}  

  BOOL OccupyFile( LPCTSTR lpFileName )  

  {  

      BOOL    bRet;  

      //提升自身权限  

      RaiseToDebugP();  

   //打开一个pid为4的进程,只要是存在的进程,都可以  

   HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);    // 4为system进程号  

     

      if ( hProcess == NULL )  

      {            

    return FALSE;  

      }  

     

      HANDLE hFile;  

      HANDLE hTargetHandle;  

   //以独占模式打开目标文件  

   hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);      

     

     

      if ( hFile == INVALID_HANDLE_VALUE )  

      {  

          CloseHandle( hProcess );  

          return FALSE;  

      }  

     

   //把文件句柄复制到pid=4的进程中去,这样,只要pid=4的进程不退出,谁也动不了目标文件  

  bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle,   

          0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);  

     

      CloseHandle( hProcess );  

     

      return bRet;  

  }  

    

    

  //入口函数  

  int main()  

  {  

      OccupyFile("D:\\Program Files\\工具软件\\任务管理.exe");  

     

      return 0;  

  } 

 

此项目被张贴在未分类 。书签的 permalink

发表评论

电子邮件地址不会被公开。 必填项已用*标注