gpt4 book ai didi

c++ - 如何关闭 SYSTEM_HANDLE(或另一个进程中打开的文件句柄)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:46 25 4
gpt4 key购买 nike

我正在尝试创建一个关闭其他进程打开的文件句柄的应用程序。除了这会导致应用程序不稳定这一事实之外,我想继续进行此练习。我已使用 this example 成功枚举具有打开句柄或锁定特定文件的进程。 (download link)。简而言之,我得到了一个 SYSTEM_HANDLE 对象或其拷贝(HANDLE 类型):

SYSTEM_HANDLE handle = handleInfo->Handles[i];
HANDLE dupHandle = NULL;
if (!NT_SUCCESS(NtDuplicateObject(processHandle, (HANDLE)handle.Handle, GetCurrentProcess(), &dupHandle, 0, 0, 0)))
{
continue;
}

我曾尝试关闭 SYSTEM_HANDLE 但没有成功:

wcout << "Found " << fullPath << " in process " << process << "." << endl;
if (CloseHandle((HANDLE)handle.Handle))
{
wcout << "Closed handle successfully." << endl;
}

SYSTEM_HANDLE 结构定义为:

typedef struct _SYSTEM_HANDLE
{
ULONG ProcessId;
BYTE ObjectTypeNumber;
BYTE Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE, *PSYSTEM_HANDLE;

该应用程序对我撒谎,因为它打印出 “成功关闭句柄。”,但是当我再次枚举它的打开句柄时,这个句柄出现了。例如,如果我使用类似 LockHunter 的应用程序关闭 handle ,如果我再次枚举它,它不会出现。我怎样才能关闭这个句柄?

最佳答案

我应该更好地阅读我自己的链接,正如 wj32 明确指出的那样:

(Step 3: Closing remote handles) To close handles opened by other processes, you simply call DuplicateHandle with DUPLICATE_CLOSE_SOURCE (1) specified in the options parameter (it's documented on the MSDN page for DuplicateHandle, so go read it). You can specify NULL for the target process handle and target handle parameters. For example:

DuplicateHandle(handleToTheRemoteProcess, theRemoteHandle, NULL, NULL, 0, FALSE, 0x1);

虽然在我的例子中,从代码来看,NtDuplicateObject如果我传入 DUPLICATE_CLOSE_SOURCE,应该做同样的事情。

关于c++ - 如何关闭 SYSTEM_HANDLE(或另一个进程中打开的文件句柄),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26645584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com