在Windows DLL注入场景下可靠获取OpenGL函数指针的方案咨询
在Windows DLL注入场景下可靠获取OpenGL函数指针的方案咨询
我正在为一款采用**OpenGL核心配置文件(版本>3.3)**的应用开发DLL注入工具,目的是拦截几何数据。我需要在注入的DLL中调用glDrawElements、glGetIntegerv这类OpenGL函数。
最开始我采用了硬编码nvoglv64.dll内偏移的方式,代码大致如下:
typedef void(APIENTRY *FP_glDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); // nvoglv64.dll中的函数偏移 static const DWORD_PTR glDrawElements_OFFSET = 0x8625A0; static FP_glDrawElements real_glDrawElements = nullptr; // 后续逻辑 const char *NAME = "nvoglv64.dll"; HMODULE h_mod = GetModuleHandleA(NAME); MODULEINFO mod_info; if (h_mod == 0) { debug_output("Fail to get module."); } if (!GetModuleInformation(GetCurrentProcess(), h_mod, &mod_info, sizeof(mod_info))) { debug_output("Fail to get module information."); } char path[MAX_PATH]; GetModuleFileNameA(h_mod, path, MAX_PATH); debug_output(std::format("OpenGL module found: {}", path)); DWORD_PTR actual_base = (DWORD_PTR)mod_info.lpBaseOfDll; real_glDrawElements = (FP_glDrawElements)(actual_base + glDrawElements_OFFSET);
这种方式对大部分函数有效,但glGetIntegerv失效了——因为它的实现是在opengl32.dll而非厂商驱动DLL里。
我尝试过用GLAD:
gladLoadGL(); // 没有上下文相关的加载器
但因为缺少glfwGetProcAddress这类加载器回调,这个方法也失败了。
现在想请教:在以下约束条件下,如何可靠获取OpenGL函数指针?
- 函数可能存在于
opengl32.dll(代理库)或厂商DLL(比如nvoglv64.dll)中 - 处于DLL注入场景,没有GLFW/GLUT这类库
- 目标应用使用现代OpenGL(核心配置文件)
内容来源于stack exchange
相关产品推荐
相关产品推荐

