【发布时间】:2015-06-22 22:41:17
【问题描述】:
我扫描我的进程打开的句柄并在控制台中打印它们。
- 我开始我的进程
- 我附上了作弊引擎
- 我运行打开句柄的枚举
- 我看到哪个进程拥有我的进程的句柄
此时奇怪的问题如下,查看代码:
array<Accessor^>^ AntiCheat::ScanHandles()
{
List<Accessor^>^ accessorList = gcnew List<Accessor^>();
if (!EnableDebugPrivilege(true))
printf("EnableDebugPrivilege failed: %d\n", GetLastError());
tNtQuerySystemInformation oNtQuerySystemInformation = (tNtQuerySystemInformation)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQuerySystemInformation");
PSYSTEM_HANDLE_INFORMATION handleInfo = new SYSTEM_HANDLE_INFORMATION;
SYSTEM_INFORMATION_CLASS infoClass = (SYSTEM_INFORMATION_CLASS)16; // SystemHandleInformation
DWORD size = sizeof(SYSTEM_HANDLE_INFORMATION);
DWORD needed = 0;
NTSTATUS status = oNtQuerySystemInformation(infoClass, handleInfo, size, &needed);
while (!NT_SUCCESS(status))
{
if (needed == 0)
return nullptr;
// The previously supplied buffer wasn't enough.
delete handleInfo;
size = needed + 1024;
handleInfo = (PSYSTEM_HANDLE_INFORMATION)new BYTE[size];
status = oNtQuerySystemInformation(infoClass, handleInfo, size, &needed);
}
HANDLE currentProcess = GetCurrentProcess();
DWORD currentProcessId = GetProcessId(currentProcess);
for (DWORD i = 0; i < handleInfo->dwCount; i++)
{
//printf(".");
SYSTEM_HANDLE handle = handleInfo->Handles[i];
HANDLE procHandle = OpenProcess(PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, handle.dwProcessId);
if (GetLastError() == ERROR_ACCESS_DENIED)
continue;
HANDLE dupl = 0;
if (!DuplicateHandle(procHandle, (HANDLE)handle.wValue, currentProcess, &dupl, 0, false, DUPLICATE_SAME_ACCESS))
continue;
DWORD procId = GetProcessId(dupl);
if (procId == currentProcessId)
{
printf("accessing us\n");
char processName[MAX_PATH];
GetModuleFileNameEx((HMODULE)procHandle, NULL, processName, MAX_PATH);
accessorList->Add(gcnew Accessor(gcnew String(processName), handle.GrantedAccess));
}
CloseHandle(dupl);
}
return accessorList->ToArray();
}
如果我用 printf("."); 取消注释该行,我会看到 3 个打开的进程句柄(作弊引擎)。如果它被注释(运行速度更快),则没有打开的句柄。但是我不知道为什么这会影响我的代码。我很惊讶,有人知道为什么会这样吗?或者如何在没有我的 printf("."); 的情况下找出如何找到句柄;行吗?
另一个问题是:每次我调用函数时,分配的字节数都会重复。我不知道为什么。
【问题讨论】:
-
也许第一次调用 C IO 函数会导致它打开标准输入、输出和错误的句柄?
-
您不会忽略
handle.dwProcessId等于currentProcessId的数组项,因此您最终会为自己的进程打开一个新句柄。您只对handle.dwProcessId不等于currentProcessId的其他进程感兴趣。 -
@RemyLebeau 假设 Handle 是一个进程句柄,GetProcessId 获取句柄的 id,如果它等于我的进程,我看到它是我的进程的句柄,这就是我正在寻找的为了。无论如何,另一个问题是:分配的字节数重复每次调用(NtQuerySystemInformation 返回 ERROR_INFO_LENGTH_MISMATCH)。