DuplicateHandle复制句柄保护文件
以獨占方式打開一個文件,然后將文件的句柄復制到另一個進程,比如復制到System進程,然后自己的進程就可以退出。
在Ring3下只要句柄沒有關閉,別人就刪除不了文件。
?
#include <windows.h>
#include <stdio.h>
?
void SetPrivilege()
{
?HANDLE hToken;
?LUID destLuid;
?TOKEN_PRIVILEGES TokenPrivileges;
?OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); //獲得進程訪問令牌的句柄
?LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &destLuid);?? //操作的類型為SE_DEBUG_NAME???????
?TokenPrivileges.PrivilegeCount = 1;
?TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
?TokenPrivileges.Privileges[0].Luid = destLuid;
?AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, 0, NULL, NULL); //提升權限
?CloseHandle(hToken);???//關閉句柄
}
?
BOOL ProtectFile(
???? IN LPCTSTR pszFilePath,
???? IN DWORD dwProcessId,
???? IN BOOL bFileCanBeRead
???? )
{
?HANDLE hFile;
?HANDLE hProcess;
?
?// get the file handle
?
?hFile = CreateFile(
??pszFilePath,
??GENERIC_READ,
??(bFileCanBeRead ? FILE_SHARE_READ : 0),
??NULL,
??OPEN_EXISTING,
??FILE_ATTRIBUTE_NORMAL,
??NULL
??);
?if (hFile == INVALID_HANDLE_VALUE)
?{
??return FALSE;
?}
?
?// open the process handle
?
?hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwProcessId);
?if (!hProcess)
?{
??printf("OpenProcess error/n");
??CloseHandle(hFile);
??return FALSE;
?}
?
?// call duplicatehandle
?
?BOOL fOk = DuplicateHandle(
??GetCurrentProcess(),????????????? // source process handle
??hFile,???????????????????????????????????? // source handle
??hProcess,????????????????????????????? // target process handle
??NULL,??????????????????????????????????? // target handle, we don't care it
??0,
??FALSE,??????????????????????????????????
??DUPLICATE_SAME_ACCESS
??);
?
?CloseHandle(hFile);
?CloseHandle(hProcess);
?return fOk;
}
void main()
{
?SetPrivilege();?? //提升進程權限
?ProtectFile("C://1.txt",4,false);
}
總結
以上是生活随笔為你收集整理的DuplicateHandle复制句柄保护文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 禁止Dockpanel拖动
- 下一篇: VC++打开、保存文件对话框和浏览文件夹