分享Windows R3层 检测当前进程被哪些第三方进程所操作。(可用于游戏反作弊和进程保护)
C++源码示例:
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
void QueryHandle(DWORD processID, DWORD handleValue) {
HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, processID);
if (hProcess == NULL) {
std::cerr << "Failed to open process: " << GetLastError() << std::endl;
return;
}
HANDLE hHandle;
if (!DuplicateHandle(hProcess, (HANDLE)handleValue, GetCurrentProcess(), &hHandle, 0, FALSE, DUPLICATE_SAME_ACCESS)) {
std::cerr << "Failed to duplicate handle: " << GetLastError() << std::endl;
CloseHandle(hProcess);
return;
}
// 查询句柄类型
DWORD handleTypeLength = 0;
TCHAR handleType[256];
if (!GetHandleInformation(hHandle, &handleTypeLength)) {
std::cerr << "Failed to get handle information: " << GetLastError() << std::endl;
CloseHandle(hHandle);
CloseHandle(hProcess);
return;
}
// 输出句柄类型
std::cout << "Handle type: " << handleType << std::endl;
// 如果句柄类型是进程句柄,可以进一步查询进程信息
if (_tcscmp(handleType, _T("Process")) == 0) {
DWORD targetProcessID = GetProcessId(hHandle);
std::cout << "Handle points to process ID: " << targetProcessID << std::endl;
}
CloseHandle(hHandle);
CloseHandle(hProcess);
}
int main() {
DWORD BProcessID = 1234; // 替换为B进程的ID
DWORD handleValue = 44; // 替换为句柄值
QueryHandle(BProcessID, handleValue);
return 0;
}
代码讲解:
打开B进程:
HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, processID);
这行代码尝试打开B进程,并获取其句柄。
PROCESS_DUP_HANDLE
权限允许复制句柄。复制句柄:
if (!DuplicateHandle(hProcess, (HANDLE)handleValue, GetCurrentProcess(), &hHandle, 0, FALSE, DUPLICATE_SAME_ACCESS)) {
这行代码尝试复制B进程中的句柄44到当前进程中。
查询句柄信息:
DWORD handleTypeLength = 0; TCHAR handleType[256]; if (!GetHandleInformation(hHandle, &handleTypeLength)) {
这行代码尝试获取句柄的信息。
GetHandleInformation
函数可以获取句柄的类型等信息。输出句柄类型:
std::cout << "Handle type: " << handleType << std::endl;
这行代码输出句柄的类型。
进一步查询进程信息:
if (_tcscmp(handleType, _T("Process")) == 0) { DWORD targetProcessID = GetProcessId(hHandle); std::cout << "Handle points to process ID: " << targetProcessID << std::endl; }
如果句柄类型是进程句柄,这行代码进一步查询句柄指向的进程ID。
注意事项
这个方法需要管理员权限,因为访问其他进程的句柄通常需要较高的权限。
使用这些方法时要小心,因为不正确的操作可能会导致系统不稳定或其他问题。