我弄乱了手柄/挂钩,并提出了一个问题。现在,我有一个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字符是什么。谢谢!
答案 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
进行打印。