find一个句柄开放的地方

我弄乱了把手/挂钩,并有一个问题。 现在,我有一个注入到我正在玩的过程中的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时,打印的内容通常是指向应用程序读取的随机文件的path,但是我也注意到有时会打印出随机的ASCII字符,就像打开句柄的“名称”一样。 这可以在这里看到。

有时我也注意到某些.exe文件的path。 这并不罕见,因为我正在注入的应用程序读取/查看二进制文件。 我的问题是,当我看到从GetFinalPathNameByHandle返回的“名称”作为一个exe文件的path,我怎么知道句柄是否打开到二进制文件本身,或者如果句柄文件打开到实际运行的进程那个名字。

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

对于你粘贴的随机数据打印,这可能是因为它只是名称数组中的未初始化的垃圾,你应该总是检查GetFinalPathNameByHandle的返回值,然后用name做一些事情:

 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来代替打印。