一位网友发来的网络游戏 [红月M] 进程名 RedmoonM.exe 调试器加载时, 其中有一个模块名为 [UnityPlayer.dll]
获取路径不正常, (导致后面一系列操作 获取MD5 CRC32 Shell等都失败.)
比如模块路径是 c:\游戏\UnityPlayer.dll 通过 GetMappedFileName 函数获取的却是 c:\UnityPlayer.dll
这样一来, 路径不对, 如果有 open 操作, 都会找不到文件.
后面测试了 yzdbg 也是一样获取错误的路径. 修改并保存这个模块的时候 yzdbg 会提示文件不存在, 点完确定就直接崩溃了
测试的 x64dbg 是正常的, 懒得逆了,下了份源码查看其是调用自己实现的 GetFileNameFromHandle 函数. 里面又调用 PathFromFileHandleW,
PathFromFileHandleW 看起来是一个导出函数, 源码中没有搜到实现, 看来是静态库了.打开 PathFromFileHandleW 所在文件夹,发现
DeviceNameResolver_x64.lib 和 DeviceNameResolver_x86.lib 我下的是 x64dbg_2022.02.24 版本的源码,
在此版本源码中并没有搜到 DeviceNameResolver_xxx.lib 实现, (白下了)
又搜了下电脑上正好之前下的低版本中有一个 DeviceNameResolver.dll 模块.
拖入IDA中, 查看导出函数就能看到. PathFromFileHandleW 的实现里面最终调用了 GetFinalPathNameByHandle 函数.
换成这个函数测试就正常了. GetFinalPathNameByHandle 似乎比 GetMappedFileName 要省事许多.
看来 GetMappedFileName 方法不一定靠谱, 而且还麻烦...
这里先纪录一下, 日后多测一下 GetFinalPathNameByHandle 函数, 没问题再替换.
--------------------------------------------
刚又测了一下, 发现win7 x64没有此问题, 只有win10才有这个函数,
另外 GetFinalPathNameByHandle 函数 低版本系统好像没有.
[Asm] 纯文本查看 复制代码 This parameter can also include one of the following values.
Value Meaning
VOLUME_NAME_DOS
0x0
Return the path with the drive letter. This is the default.
VOLUME_NAME_GUID
0x1
Return the path with a volume GUID path instead of the drive name.
VOLUME_NAME_NONE
0x4
Return the path with no drive information.
VOLUME_NAME_NT
0x2
Return the path with the volume device path.
GetFinalPathNameByHandle(hModule, pszFilename, sizeof pszFilename, VOLUME_NAME_DOS);
|