我一直在寻找检测其他进程何时打开我的进程的句柄的方法。这是我到目前为止创建的。
程序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()
从未被触发。我不确定为什么会发生这种情况。
当另一个进程打开我的进程时,我会收到警报吗?这不应该是这样工作的吗?
1条答案
按热度按时间oxf4rvwz1#
这是行不通的。进程句柄只有在所有线程都停止并且进程结束时才发出信号。
要可靠地检测到有人试图打开句柄,您需要处于内核模式,此时您基本上是防病毒或防恶意软件的。
一种不太可靠的方法是调用未公开的NT API到list handles。您可以在自己的进程中执行此操作。