如何在C ++中通过其名称获取进程句柄?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C ++中通过其名称获取进程句柄?相关的知识,希望对你有一定的参考价值。
我正在尝试获取example.exe的进程句柄,所以我可以在上面调用TerminateProcess
。我怎样才能做到这一点?请注意,它没有窗口,所以FindWindow
将无法正常工作。
#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>
int main( int, char *[] )
{
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry) == TRUE)
{
while (Process32Next(snapshot, &entry) == TRUE)
{
if (stricmp(entry.szExeFile, "target.exe") == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
// Do stuff..
CloseHandle(hProcess);
}
}
}
CloseHandle(snapshot);
return 0;
}
此外,如果您想在OpenProcess中使用PROCESS_ALL_ACCESS,您可以尝试这样做:
#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>
void EnableDebugPriv()
{
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = luid;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL);
CloseHandle(hToken);
}
int main( int, char *[] )
{
EnableDebugPriv();
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry) == TRUE)
{
while (Process32Next(snapshot, &entry) == TRUE)
{
if (stricmp(entry.szExeFile, "target.exe") == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
// Do stuff..
CloseHandle(hProcess);
}
}
}
CloseHandle(snapshot);
return 0;
}
以下代码显示了如何使用toolhelp和OpenProcess来获取进程的句柄。为简洁起见,删除了错误处理。
HANDLE GetProcessByName(PCSTR name)
{
DWORD pid = 0;
// Create toolhelp snapshot.
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
// Walkthrough all processes.
if (Process32First(snapshot, &process))
{
do
{
// Compare process.szExeFile based on format of name, i.e., trim file path
// trim .exe if necessary, etc.
if (string(process.szExeFile) == string(name))
{
pid = process.th32ProcessID;
break;
}
} while (Process32Next(snapshot, &process));
}
CloseHandle(snapshot);
if (pid != 0)
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
}
// Not found
return NULL;
}
有两种基本技术。第一个使用PSAPI; MSDN有使用an example,EnumProcesses
,OpenProcess
和EnumProcessModules
的GetModuleBaseName
。
另一个使用Toolhelp,我更喜欢。使用CreateToolhelp32Snapshot
获取进程列表的快照,使用Process32First
和Process32Next
(提供模块名称和进程ID)遍历它,直到找到所需的为止,然后调用OpenProcess
获取句柄。
退房:MSDN Article
您可以使用GetModuleName
(我想?)来获取名称并进行检查。
来自MSDN:
要打开另一个本地进程的句柄并获取完全访问权限,必须启用SeDebugPrivilege权限。
可以使用以下代码:
DWORD FindProcessId(const std::wstring& processName)
{
PROCESSENTRY32 processInfo;
processInfo.dwSize = sizeof(processInfo);
HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (processesSnapshot == INVALID_HANDLE_VALUE) {
return 0;
}
Process32First(processesSnapshot, &processInfo);
if (!processName.compare(processInfo.szExeFile))
{
CloseHandle(processesSnapshot);
return processInfo.th32ProcessID;
}
while (Process32Next(processesSnapshot, &processInfo))
{
if (!processName.compare(processInfo.szExeFile))
{
CloseHandle(processesSnapshot);
return processInfo.th32ProcessID;
}
}
CloseHandle(processesSnapshot);
return 0;
}
用法:
auto processId = FindProcessId(L"blabla.exe");
获得一个手柄应该是显而易见的,只需要调用OpenProcess()
或类似的东西。
以上是关于如何在C ++中通过其名称获取进程句柄?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Objective C中通过UIView获取UIAlertController?
不确定将代码放在程序中的啥位置。如何在 XCode 中通过触摸生成圆圈。 (目标-C)
如何使用python在selenium中通过其id名称的一部分查找元素
紧急求助,请问如何在android 系统中通过ndk内嵌c版bullet物理引擎???主要是如何编译bullet源代码?...