![]() |
【转帖】关于 Cs外挂的实现
实现功能1:透视
透视是我们做CS作弊器中的重中之重。 在被你用API钩子钩住的glBegin函数里,如果拦截到的参数mode是GL_TRIANGLE_STRIP,或GL_TRIANGLE_FAN,那么CS就有可能是准备画一个模型(人物,武器 等),那么我们可以用glDisable(GL_DEPTH_TEST)来告诉OpenGL:我们想颠倒这个模型的绘制顺序。在游戏中就可以看到,墙壁后背的人物,模型等全跑到了墙壁的前面。这看上去图象顺序有点乱,但这正是我们作弊器“透视”的原理所在! 有些人在绘制所有模型之前调用这个函数,那就会把你的整个游戏画面都打乱了,请大家务必注意。 实现功能2:高亮显示 由于光线的问题,在暗处人物也会显得很暗,那怎样把他变得更亮,以便我们游戏时容易发现目标呢?为了达到这种效果,就得钩住glVertex3f,然后在原有函数(区别于我们钩住的函数)调用前加上这行代码: glColor4f(1.0f, 1.0f, 1.0f, 1.0f) 就这么简单就达到了我们想要的功能。 实现功能3:去除烟幕 烟幕弹发出的灰烟有的时候会挡住我们的视线,使敌人有可乘之机。所以去除烟幕是CS作弊器中必不可少的功能之一。 实现这个功能必须做的就是钩住glBegin 和 glVertex3fv,然后定义一个bool变量bSmoke来作为开关。在钩住的glBegin中,检查当前参数mode的值是否为GL_QUADS。如果是的话,取当前颜色: glGetFloatv(GL_CURRENT_COLOR, &curcol) 现在我们看curcol是否为灰色(灰色就是R=G=B)。然后就是要排除1.0和0.0,因为这样才能不把某些其他物体去除了。 所以如果当前颜色是灰色,并且不是白色(1.0)、黑色(0.0)时,我们就把bSmoke设为true。当然在别的时候或不是绘制烟幕时,要把bSmoke设为false。 现在就可以在glVertex3fv中判断bSmoke是否为true,如果是,直接return不处理它。这样去除烟幕的功能便算完成了。 实现功能4:去除闪光 闪光的影响比烟幕的还大,白屏相信大家都不喜欢。所以去除它是必然的。实现这个功能要钩两个函数:glBegin和glVertex2f。 CS在画控制台和某些文字时也会用到glVertex2f,所以我们在做这个功能时要小心不要把不该屏蔽的东西屏蔽了。其实闪光的原理就是把一张白色方形贴到屏幕上,然后随着时间改变Alpha透明度,所以我们就要检查看有没有白色的QUAD并且覆盖了你的整个屏幕,如果有,那就要留意了。 在glBegin中,检查mode是否为GL_QUADS,如果是,取当前颜色: glGetFloatv(GL_CURRENT_COLOR, &curcol) 现在来看看什么是纯白:纯白就是R=1,G=1,B=1,如果检测到符合这些条件的话,那就很有可能现在画的就是闪光,但是还是不敢确定到底是不是,所以我们要同时从别处入手。 当一个OpenGL程序调用glBegin时,接着将会调用glVertex*来画模型的顶点,绘制完成后将调用glEnd来收尾。我研究发现CS画简单的方型是用glVertex2f,所以同样我们也要钩住这个函数。 为了联系glBegin和glVertex2f,我们用bool变量bFlash来表示是否为一个白色的方型(即是否是烟幕效果)。下一步是获取当前屏幕的尺寸: glGetFloatv(GL_VIEWPORT, &coords) 这样屏幕就保存在了coords里: coords[0] = 0 coords[1] = 0 coords[2] = 宽 coords[3] = 高 现在在我们钩住的glVertex2f里,如果不符合“闪光”的条件,调用回原有的函数,如果符合的话,就比较glVertex2f传给我们的第二个参数y和coords[3](屏幕高度)是否一样,如果是,则表明CS准备绘制白色闪光或全屏模式的控制台,但是这两者实在是不好区分,所以只有把阿尔法值设置得很小,这将不会影响到控制台,同时也把白色闪光去掉了: glColor4f(curcol[0], curcol[1], curcol[2], 0.01f) 大家可以试试。 //////////////////////////////////////////////////////////////////// // 高亮 void __stdcall NEWglEnable( GLenum cap ) { if(cheat_fullbright) { if(cap == GL_TEXTURE_2D) return; } // End Fullbright //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // 自设准心 if(cheat_crosshair) { glGetFloatv(GL_CURRENT_COLOR, color); glPushMatrix(); glLoadIdentity(); glDisable(GL_TEXTURE_2D); glGetIntegerv(GL_VIEWPORT, iDim); glColor4f(1.0f, 1.0f, 0.0f, 0.7f); glLineWidth(1.5f); glBegin(GL_LINES); glVertex2i(iDim[2]/2, (iDim[3]/2)-12); glVertex2i(iDim[2]/2, (iDim[3]/2)-5); glVertex2i(iDim[2]/2, (iDim[3]/2)+5); glVertex2i(iDim[2]/2, (iDim[3]/2)+12); glVertex2i((iDim[2]/2)-12, iDim[3]/2); glVertex2i((iDim[2]/2)-5, iDim[3]/2); glVertex2i((iDim[2]/2)+5, iDim[3]/2); glVertex2i((iDim[2]/2)+12, iDim[3]/2); glEnd(); glColor3f(color[0], color[1], color[2]); glBegin(GL_POINTS); glVertex2i((iDim[2]/2)-3, iDim[3]/2); glVertex2i((iDim[2]/2)+3, iDim[3]/2); glVertex2i(iDim[2]/2, (iDim[3]/2)-3); glVertex2i(iDim[2]/2, (iDim[3]/2)+3); glEnd(); glEnable(GL_TEXTURE_2D); glPopMatrix(); } // End Crosshaircheat //////////////////////////////////////////////////////////////////// glEnable(cap); } // End hole function //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // glDisable function?? Uneeded?? // Keeps track of which settings are enabled. void __stdcall NEWglDisable( GLenum cap ) { glDisable(cap); } // End hole function ////////////////////////// // glBegin function // Here is where the hack really happens. // 透视+地图高亮 void __stdcall NEWglBegin( GLenum e ) { if(cheat_wallhack) { if(wallhack_type == HACK_MODEL) { if(e == GL_TRIANGLE_STRIP) glDisable(GL_DEPTH_TEST); } if(wallhack_type == HACK_WALLS) { glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE); glColor4f(0.5f,0.5f,0.5f,0.5f); glClearColor(0.5f,0.5f,0.5f,0.5f); } } // End Wallhack //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // Fullbright(地图高亮) if(cheat_fullbright) { if(e == GL_QUADS) { (glEnable)(GL_TEXTURE_2D); } if(cheat_white) cheat_white = FALSE; } // End Fullbright //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // 去除烟幕 if(cheat_grenhack) { if(e == GL_QUADS) { glGetFloatv(GL_CURRENT_COLOR, color); // Get color[0]-[2] if(color[0] = color[1] = color[2]) { bSmoke = TRUE; if(color[0] = 0.00f) bSmoke = FALSE; if(color[0] = 1.00f) bSmoke = FALSE; if(color[1] = 0.00f) bSmoke = FALSE; if(color[1] = 1.00f) bSmoke = FALSE; if(color[2] = 0.00f) bSmoke = FALSE; if(color[2] = 1.00f) bSmoke = FALSE; if (bSmoke) { glColor4f(color[0], color[1], color[2], 0.01f); } } } } // End Grenhack //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // if(cheat_wireframe) { if(e == GL_POLYGON) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glLineWidth(1.0); glColor3f(0.0f, 0.7f, 0.0f); } } // //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // 白墙 if(cheat_white) { glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); if(cheat_fullbright) cheat_fullbright = FALSE; } // End Whitewalls //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // 去除天空 1 if(cheat_sky) { if(e == GL_QUADS) { if (bSky = TRUE) return; } } // End Sky Remove 1 //////////////////////////////////////////////////////////////////// glBegin(e); } //////////////////////////////////////////////////////////////////// // 去除天空 2 void __stdcall NEWglOrtho ( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { bSky = FALSE; glOrtho ( left, right, bottom, top, zNear, zFar); } void __stdcall NEWglFrustum ( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { bSky = TRUE; glFrustum ( left, right, bottom, top, zNear, zFar); } // End Sky Remove 2 //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // NewglEnd ?? Uneeded?? void __stdcall NEWglEnd() { glEnd(); } // End hole function //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // 人物高亮 void __stdcall NEWglVertex3f( float x, float y, float z) { if(cheat_lambert) glColor3f(1, 1, 1); glVertex3f(x, y, z); } // End hole function //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // 对glClear函数的一些修正 void __stdcall NEWglClear (GLbitfield mask) { mask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT; glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear (mask); } // End hole function //////////////////////////////////////////////////////////////////// } |
所有的时间均为北京时间。 现在的时间是 03:38 PM. |