找到句柄所在的位置

时间:2016-04-19 04:00:23

标签: c++ c windows dll hook

我弄乱了手柄/挂钩,并提出了一个问题。现在,我有一个DLL,我注入到我正在玩的过程中。 DLL挂钩CloseHandle()函数。调用CloseHandle时,我会执行以下操作:

int WINAPI DetourCloseHandle(HANDLE hObject)
{
    OutputDebugStringA("CLOSE HADNLE");
    char name[MAX_PATH];
    GetFinalPathNameByHandle(hObject, name, MAX_PATH, FILE_NAME_NORMALIZED);
    OutputDebugStringA(name);

    return oCloseHandle(hObject);
}

我的目标是确定句柄的打开位置,以及句柄是否对某个进程开放,然后使用句柄来读取处理内存。调用CloseHandle时打印出的内容通常是应用程序读取的随机文件的路径,但我也注意到有时会打印随机ASCII字符,如" Name"把手打开的位置。 This can be seen here.

有时我也会注意到某些.exe文件的路径。这并不罕见,因为我注入的应用程序会读取/查看二进制文件。我的问题是,当我看到" name"从GetFinalPathNameByHandle返回作为exe文件的路径,如何知道句柄是否打开到二进制文件本身,或者是否将句柄文件打开到具有该名称的实际运行进程。

我还想了解正在打印的ASCII字符是什么。谢谢!

1 个答案:

答案 0 :(得分:1)

对于您粘贴的随机数据打印,可能是因为它只是名称数组中未初始化的垃圾,在使用名称执行操作之前,应始终检查GetFinalPathNameByHandle的返回值:

DWORD ret = GetFinalPathNameByHandle(hObject, name, MAX_PATH, FILE_NAME_NORMALIZED);
if (ret) {
    OutputDebugStringA(name);
} else {
    OutputDebugStringA("GetFinalPathNameByHandle");
    // check GetLastError()
}

另请注意,GetFinalPathNameByHandle将字符串作为TCHAR字符串,您可以通过OutputDebugStringA打印它。因此,我建议您使用ANSI版本GetFinalPathNameByHandleA,或使用TCHAR name[MAX_PATH];并使用OutputDebugString进行打印。