GetModuleHandle返回空值及相关API使用问题求助
问题分析与解决办法
1. GetModuleHandle((LPCWSTR)"mono-2.0-bdwgc.dll")返回NULL的原因
GetModuleHandle仅在当前进程的地址空间内查找已加载模块,你要操作的是独立的目标游戏进程,模块是加载在目标进程而非当前进程中,所以直接调用这个函数必然返回NULL。该函数不支持跨进程获取模块句柄。
2. 模块句柄与baseModule相同是否正常
这种情况完全正常,常见于Unity的特殊打包场景:
- 当游戏采用单文件打包(包括Mono或IL2CPP的单文件发布模式)时,
mono-2.0-bdwgc.dll的代码会被合并到主程序模块(baseModule)中,不会以独立DLL的形式加载,因此两者的模块基地址(即你拿到的句柄)完全一致。
3. GetProcAddress返回NULL的解决办法
(1)核对导出函数名的准确性
部分Mono模块的导出函数可能带有名称修饰,或者你存在拼写错误。可以用dumpbin /exports <目标模块路径>命令,或PE Explorer、x64dbg等工具查看模块实际导出的函数名,确保传入GetProcAddress的字符串与实际导出名完全匹配。
(2)跨进程获取导出地址的正确姿势
你拿到的模块句柄是目标进程的内存基地址,当前进程无法直接用GetProcAddress(该函数依赖当前进程地址空间)。正确的两种思路:
- 手动解析PE导出表:通过
ReadProcessMemory读取目标进程中模块的PE头、导出表数据,自行计算目标函数的内存地址。 - 远程注入代码:将你的逻辑代码注入到目标游戏进程中,在目标进程的上下文内调用
GetModuleHandle和GetProcAddress,此时就能正常获取到函数地址。
(3)针对Unity单文件打包的特殊处理
如果是单文件打包的游戏,mono-2.0-bdwgc.dll的导出函数已合并到主模块,你需要直接在主程序模块的导出表中查找对应的Mono函数(比如mono_get_root_domain、mono_image_open_from_data等)。
内容的提问来源于stack exchange,提问作者Ahmed Jihad
相关产品推荐
相关产品推荐

