当钩子应用程序绘制到屏幕时,Opengl钩子渲染不会在视图中呈现

时间:2018-05-25 18:44:26

标签: opengl hook dll-injection

我已经设置了一个dll注入来挂钩gdi32.dll中的swapbuffers。

注入效果很好,并触发了我的hook_swapbuffers()函数。

我希望hook_swapbuffers在受害者进程的顶部放置一个叠加层(现在是一个红色半透明四边形) - 在这种情况下是一个基于opengl的游戏。

hook_swapbuffers()调用以下内容:

//初始化gl状态

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClearDepth(1.0f);
glDisable(GL_DEPTH_TEST);
glDepthFunc(GL_ALWAYS);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glDisable(GL_TEXTURE_2D);

//绘制

glClear( GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

glPushMatrix(); // store current matrix settings
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// set the limits of our ortho projection
glOrtho(-1.0, 1.0, -1.0, 1.0, 0.1, 100);

glBegin(GL_QUADS);

glColor4f(1.0f, 0.0f, 0.0f, 0.5f);     // Red

glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);

glEnd();

glPopMatrix(); // restore original matrix

//清理gl状态

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

然后调用正常的SwapBuffers函数。

如果我评论我的游戏绘制调用,钩子绘制效果很好,我得到一个红色半透明屏幕对齐四边形渲染我的游戏(因为所有绘制被注释掉,游戏实际上是一个黑色的画布,现在黑暗红色与我的四边形叠加)。

不幸的是,当我把我的游戏拉回来时,我的屏幕对齐四边形不再呈现???我可以设置glClear来清除颜色缓冲区并且正确发生,因此钩子正在工作,而opengl正在接受来自钩子的命令。

我认为我在游戏中有一些流氓状态影响了钩子函数的绘制。可能是视口/摄像头或某些绑定数据,我的钩子测试不需要存在。

任何帮助或指示都将受到极大的欢迎。

1 个答案:

答案 0 :(得分:2)

hook_swapbuffers中,投影矩阵堆栈已正确设置,但缺少模型视图矩阵堆栈的初始化。
因此,模型视图矩阵可以具有从先前渲染中剩余的任何状态。这导致以下任意结果。

按下初始化并弹出模型视图矩阵堆栈,就像使用投影矩阵堆栈一样:

glClear( GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// set the limits of our ortho projection
glOrtho(-1.0, 1.0, -1.0, 1.0, 0.1, 100);

glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

....

// glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION); 
glPopMatrix();

注意,在OpenGL中,每种矩阵模式都有一个矩阵堆栈(参见glMatrixMode)。矩阵模式为GL_MODELVIEWGL_PROJECTIONGL_TEXTURE 如果要在" hook"中绘制纹理,则必须初始化纹理矩阵堆栈。