Windows 調用OpenProcess失敗
阿新 • • 發佈:2018-11-27
adp led 訪問權限 urn nat eof sum windows ttr
OpenProcess 打開|獲得進程句柄
函數原型: HANDLE OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId) 參數說明: 1、dwDesiredAccess:想擁有的該進程訪問權限 PROCESS_ALL_ACCESS //所有能獲得的權限 PROCESS_CREATE_PROCESS //需要創建一個進程 PROCESS_CREATE_THREAD //需要創建一個線程 PROCESS_DUP_HANDLE //重復使用DuplicateHandle句柄 PROCESS_QUERY_INFORMATION //獲得進程信息的權限,如它的退出代碼、優先級 PROCESS_QUERY_LIMITED_INFORMATION /*獲得某些信息的權限,如果獲得了PROCESS_QUERY_INFORMATION,也擁有PROCESS_QUERY_LIMITED_INFORMATION權限*/ PROCESS_SET_INFORMATION //設置某些信息的權限,如進程優先級 PROCESS_SET_QUOTA //設置內存限制的權限,使用SetProcessWorkingSetSize PROCESS_SUSPEND_RESUME //暫停或恢復進程的權限 PROCESS_TERMINATE //終止一個進程的權限,使用TerminateProcess PROCESS_VM_OPERATION //操作進程內存空間的權限(可用VirtualProtectEx和WriteProcessMemory) PROCESS_VM_READ //讀取進程內存空間的權限,可使用ReadProcessMemory PROCESS_VM_WRITE //讀取進程內存空間的權限,可使用WriteProcessMemory SYNCHRONIZE //等待進程終止 2、bInheritHandle:表示所得到的進程句柄是否可以被繼承 3、dwProcessId:被打開進程的PID 返回值: 如果函數調用成功將返回一個進程句柄值,否則將返回NULL 註意:在使用完所獲得的進程句柄後一定要調用CloseHandle(handle)來關閉進程的句柄。 使用的例子在前面的文章中已經寫出了。在使用此函數時會發現不能成功獲得有些系統進程的句柄,原因是沒有權限。解決辦法是在調用此函數前讓我們的進程得到SeDebugPrivilege權限。
服務方式程序時,程序的創建者為SYSTEM用戶;非SYSTEM用戶調用OpenProcess訪問該服務程序時,調用失敗,GetLastError返回5
調用下面的函數提權,即可解決。(若有其他方案,歡迎補充)
void enableDebugPriv() { HANDLE hToken; LUID sedebugnameValue; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {return; } if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) { CloseHandle(hToken); return; } tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = sedebugnameValue; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeoftkp, NULL, NULL)) { CloseHandle(hToken); return; } }
Windows 調用OpenProcess失敗