分享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;
}

代码讲解:

  1. 打开B进程

    HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, processID);

    这行代码尝试打开B进程,并获取其句柄。PROCESS_DUP_HANDLE 权限允许复制句柄。

  2. 复制句柄

    if (!DuplicateHandle(hProcess, (HANDLE)handleValue, GetCurrentProcess(), &hHandle, 0, FALSE, DUPLICATE_SAME_ACCESS)) {

    这行代码尝试复制B进程中的句柄44到当前进程中。

  3. 查询句柄信息

    DWORD handleTypeLength = 0;
    TCHAR handleType[256];
    if (!GetHandleInformation(hHandle, &handleTypeLength)) {

    这行代码尝试获取句柄的信息。GetHandleInformation 函数可以获取句柄的类型等信息。

  4. 输出句柄类型

    std::cout << "Handle type: " << handleType << std::endl;

    这行代码输出句柄的类型。

  5. 进一步查询进程信息

    if (_tcscmp(handleType, _T("Process")) == 0) {
        DWORD targetProcessID = GetProcessId(hHandle);
        std::cout << "Handle points to process ID: " << targetProcessID << std::endl;
    }

    如果句柄类型是进程句柄,这行代码进一步查询句柄指向的进程ID。

注意事项

  • 这个方法需要管理员权限,因为访问其他进程的句柄通常需要较高的权限。

  • 使用这些方法时要小心,因为不正确的操作可能会导致系统不稳定或其他问题。