2011-04-16 124 views
2

我试图获取在GetModuleFileNameA的另一个进程中加载​​的模块的名称。
我已经使用dbgHelp加载了一个符号,并得到了它的模块基址,但发生了两件奇怪的事情:
1.有时GetModuleFileNameA返回系统错误代码5:访问被拒绝。
2.它返回错误的模块名称。对于我知道在模块A中的函数,我得到模块B的名称...:/GetModuleFileNameA返回奇怪的结果

有人能帮助我吗?
谢谢:)

+1

为什么世界上仍然使用该函数的ANSI版本? – 2011-04-16 07:01:06

+1

是什么?为什么不? :) – Idov 2011-04-16 07:01:39

+2

哈哈,函数名称末尾的'A'表示它是函数的ANSI版本。 Windows操作系统在一段时间内转向使用Unicode。这些函数的Unicode版本在名称后面有'W',而不是'A'。但是,如果你包含windows头文件('windows.h'),你所要做的就是使用函数的名字('GetModuleFileName'),并且头文件负责将它定义为正确的变体。如果您仍然定位*真正*旧版本的Windows,则应该在没有定义_UNICODE的情况下进行编译的唯一原因。 – 2011-04-16 07:05:36

回答

3

请阅读文档。它在GetModuleFileName的页面上表示

要找到由另一个进程加载的模块的文件,请使用GetModuleFileNameEx函数。

GetModuleFileName仅适用于您的过程中的模块。即使两个进程都加载了模块,它也可能位于不同的基地址。你有效地喂养GetModuleFileName垃圾。只需重申一下,您需要使用GetModuleFileNameEx

+0

好吧,我试过了,但它返回了“INVALID HANDLE”错误。我用“DEBUG_PROCESS”创建了这个过程,但我确定这个句柄是好的。我不知道我是否可以在DEBUG_PROCESS中使用“PROCESS_QUERY_INFORMATION”和“PROCESS_VM_READ”,我试过并且程序崩溃了。 – Idov 2011-04-16 09:07:53

+0

hmm ...我在LOAD_DLL_DEBUG_EVENT中捕获到模块的基址,可能为时过早。 – Idov 2011-04-16 09:55:45

0

如果你的进程想访问另一个进程,它需要有权这样做。这意味着您的流程需要较高的权利,或者它必须是其他流程的所有者。

如果您得到错误的名称,您可能使用了错误的句柄。这也可以解释为什么你有时会遇到拒绝访问。如果将句柄传递给错误的模块,即使您有权访问您想知道其名称的模块,也可能无法访问该模块。

+0

但是,一些模块的名称是好的,它可以仍然是一个权限问题?并从“SymGetModuleBase”获取模块基址,它怎么会出错? – Idov 2011-04-16 07:18:18

+0

我刚刚将模块基地址与“Process Hacker”输出的内容进行了比较,结果很好...... – Idov 2011-04-16 08:07:23