原理是以独占的方式打开文件,再把文件句柄复制到另一个程序中去,达到本程序退出后目标文件仍被打开的目的 这是delphi代码: 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代码 //VC-ConsoleWithApi #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; } |
|