C语言 当另一个进程打开我的进程的句柄时,我如何得到通知?

o0lyfsai  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(129)

我一直在寻找检测其他进程何时打开我的进程的句柄的方法。这是我到目前为止创建的。

程序A

#include <windows.h>
#include <stdio.h>

HANDLE g_hProcess;

VOID CALLBACK WaitCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired) {
    printf("Another process has opened a handle to my process!\n");
}

int main(int argc, char* argv[]) {
    // Get a handle to the current process
    g_hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
    if (g_hProcess == NULL) {
        printf("OpenProcess failed (%d)\n", GetLastError());
        return 1;
    }

    // Register the callback function to be called when the handle is signaled
    HANDLE hWait;
    if (!RegisterWaitForSingleObject(&hWait, g_hProcess, WaitCallback, NULL, INFINITE, WT_EXECUTEONLYONCE)) {
        printf("RegisterWaitForSingleObject failed (%d)\n", GetLastError());
        return 1;
    }

    // Wait for the handle to be signaled
    WaitForSingleObject(g_hProcess, INFINITE);

    // Cleanup
    CloseHandle(g_hProcess);
    UnregisterWait(hWait);

    return 0;
}

然后我创建了另一个程序,将打开此进程。

方案B

#include <Windows.h>
#include <stdio.h>

void main(int argc, char* argv[]) {

    HANDLE p = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 5584);
    if (p == NULL) {
        printf("Failed to open process.\n");
        return;
    }
    return;
}

运行Process A后,我将从进程资源管理器中获取PID。然后我将运行Process B。问题是WaitForSingleObject()从未被触发。我不确定为什么会发生这种情况。
当另一个进程打开我的进程时,我会收到警报吗?这不应该是这样工作的吗?

oxf4rvwz

oxf4rvwz1#

这是行不通的。进程句柄只有在所有线程都停止并且进程结束时才发出信号。
要可靠地检测到有人试图打开句柄,您需要处于内核模式,此时您基本上是防病毒或防恶意软件的。
一种不太可靠的方法是调用未公开的NT API到list handles。您可以在自己的进程中执行此操作。

相关问题