none
ZwQueryInformationFile没能获得文件路径 RRS feed

  • 问题

  • 目的:hook另一个进程,在它进程里从文件句柄(hFile)获知文件路径
    方法:主要使用 GetFilePathFromHandle 的代码(http://www.cppblog.com/free2000fly/archive/2009/07/16/90244.html)。
    1. 我自己写了个demo,在自己的进程的源代码里执行GetFilePathFromHandle是正常的。
    2. 但是通过dll注入,在其它进程里执行GetFilePathFromHandle就不正常。
    3. 异常的地方在于ZwQueryInformationFile得到的是'\0''\0'"indows\\Temp\\......"。如果没有dll注入,在进程原先的代码里执行就是"\\Windows\\....."。
    也就是说通过dll注入,获得的文件路径的头两个字符都是'\0',后边的都正常。
    所以不知道为什么ZwQueryInformationFile获得的是空字符串。盼予指点。谢谢!
    2018年7月27日 7:42

答案

  • Hi,

    感谢在MSDN论坛发帖。

    >>1. 我自己写了个demo,在自己的进程的源代码里执行GetFilePathFromHandle是正常的。
    2. 但是通过dll注入,在其它进程里执行GetFilePathFromHandle就不正常。
    3. 异常的地方在于ZwQueryInformationFile得到的是'\0''\0'"indows\\Temp\\......"。如果没有dll注入,在进程原先的代码里执行就是"\\Windows\\....."。
    也就是说通过dll注入,获得的文件路径的头两个字符都是'\0',后边的都正常。
    所以不知道为什么ZwQueryInformationFile获得的是空字符串。盼予指点。谢谢!

    据我所知, 如果在用户模式下调用此函数,则应使用名称“NtQueryInformationFile”而不是“ZwQueryInformationFile”。

    有关NtXxx和ZwXxx版本例程之间关系的更多信息, 可以参考下面的文档。

    https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/using-nt-and-zw-versions-of-the-native-system-services-routines

    希望对你有所帮助。

    Best Regards,

    Baron Bi


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 sculida 2018年8月8日 2:09
    2018年7月30日 6:28
  • 谢谢!

    换成NtQueryInformationFile,依然得到两个'\0'。

    估计是我使用mhook替换了WriteFile,但是mhook有bug,导致覆盖了两个'\0'。

    现在换成ReplaceIAT的方法,无论是Nt还是Zw,都能正常获得文件路径。

    另外:

    GetFilePathFromHandle 的代码里并没有进入内核态。

    据说ntdll.dll的Nt和Zw函数实质没有差别。



    • 已编辑 sculida 2018年7月31日 8:51 补充说明
    • 已标记为答案 sculida 2018年8月8日 2:09
    2018年7月31日 3:46

全部回复

  • Hi,

    感谢在MSDN论坛发帖。

    >>1. 我自己写了个demo,在自己的进程的源代码里执行GetFilePathFromHandle是正常的。
    2. 但是通过dll注入,在其它进程里执行GetFilePathFromHandle就不正常。
    3. 异常的地方在于ZwQueryInformationFile得到的是'\0''\0'"indows\\Temp\\......"。如果没有dll注入,在进程原先的代码里执行就是"\\Windows\\....."。
    也就是说通过dll注入,获得的文件路径的头两个字符都是'\0',后边的都正常。
    所以不知道为什么ZwQueryInformationFile获得的是空字符串。盼予指点。谢谢!

    据我所知, 如果在用户模式下调用此函数,则应使用名称“NtQueryInformationFile”而不是“ZwQueryInformationFile”。

    有关NtXxx和ZwXxx版本例程之间关系的更多信息, 可以参考下面的文档。

    https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/using-nt-and-zw-versions-of-the-native-system-services-routines

    希望对你有所帮助。

    Best Regards,

    Baron Bi


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 sculida 2018年8月8日 2:09
    2018年7月30日 6:28
  • 谢谢!

    换成NtQueryInformationFile,依然得到两个'\0'。

    估计是我使用mhook替换了WriteFile,但是mhook有bug,导致覆盖了两个'\0'。

    现在换成ReplaceIAT的方法,无论是Nt还是Zw,都能正常获得文件路径。

    另外:

    GetFilePathFromHandle 的代码里并没有进入内核态。

    据说ntdll.dll的Nt和Zw函数实质没有差别。



    • 已编辑 sculida 2018年7月31日 8:51 补充说明
    • 已标记为答案 sculida 2018年8月8日 2:09
    2018年7月31日 3:46