级别: 班长
UID: 27576
精华:
0
发帖: 105
金币: 1166 枚
威望: 46 点
贡献值: 0 点
在线时间: 316(时)
注册时间: 2011-04-09
最后登录: 2013-09-20
|
cs作弊器的制作原理与方法
管理提醒:
本帖被 潇洒人身 执行锁定操作(2012-08-10)
本部分内容设定了隐藏,需要回复后才能看到 先唠叨几句吧,最近豆客作弊器泛滥,连续升了几级豆不管用了,看来是要歇菜咯。其实作为一个CS爱好者对此很是气氛,好好的一个CS就这样被那些别有用心的人弄得乌烟瘴气的,还有那些作弊的真不知道在想些什么,有意思么??难到真的是以前被高手虐待了,现在就要来找感觉么。
现在有很多网站都在做能过豆客的作弊器其实我们自己动手都能做(昨天晚上在一个网站上看见了斑竹说的话,呵呵过不了就是过不了,还说什么要休息下)其CS作弊器原理相对的也很简单(也就是数据拦截)呵呵只要你懂点程序的钩子技术的话要做一个作弊器就手到擒来了。
首先制作作弊器我们要用到以下一些东西
1 VC++6.0 编程工具 2 作弊器 源代码DLL ( DLL部分主要是实现以下功能:我们 应该知道,一个作弊器从功能方面来说大致可以分成2块:一部分负责显示方面的,比如透视、防闪、显示人物名字武器等信息;另一部分则是控制本地玩家的动作,比如自动瞄准、开火、加速、冲刺等。而这些功能则全部是由CS作弊器的主文件(DLL)实现的。) 3 注入器源码EXE { EXE部分是负责启动或监视CS游戏进程 和在创建或检测到游戏进程后,将作弊器的主文件(DLL)注入到CS游戏进程中(注入的意思是让运行中的CS游戏进程主动加载我们的作弊器主文件(DLL),就象这个文件本身就是CS游戏的一部分一样) }当然你如果想要在平台上运行(比如豆客)你就必须先把豆客的反作弊代码搞道,不过貌似现在豆客连续的升了几次级豆是在给它的那个东东加密,呵呵不好破啊,连服务器都弄到黑卡了,。要的话就自己去解吧,我都是把电脑开了1天一夜才弄到的。
好了现在让我们开始吧,先来说说作弊器要实现的第一个功能:透视
首先你要用你的API钩子去钩住glBegin函数,在被你钩住的glBegin函数里,如果拦截到的参数mode是GL_TRIANGLE_STRIP,或GL_TRIANGLE_FAN,那么CS就有可能是准备画一个模型(人物,武器等),那么我们可以用glDisable(GL_DEPTH_TEST)来告诉OpenGL:我们想颠倒这个模型的绘制顺序。在游戏中就可以看到,墙壁后背的人物,模型等全跑到了墙壁的前面。这看上去图象顺序有点乱,但这正是我们作弊器“透视”的原理所在!
有些人在绘制所有模型之前调用这个函数,那就会把你的整个游戏画面都打乱了,请大家务必注意。
void APIENTRY my_glBegin( GLenum mode )
{
if((mode==GL_TRIANGLE_STRIP||mode==GL_TRIANGLE_FAN))
glDisable(GL_DEPTH_TEST);
glBegin(mode);
}
实现功能2:高亮显示(不过这个一般拿着也没什么用) 由于光线的问题,在暗处人物也会显得很暗,那怎样把他变得更亮,以便我们游戏时容易发现目标呢?为了达到这种效果,就得钩住glVertex3f,然后在原有函数(区别于我们钩住的函数)调用前加上这行代码: glColor4f(1.0f, 1.0f, 1.0f, 1.0f)
就这么简单就达到了我们想要的功能。
void APIENTRY my_glVertex3f(GLFloat x, GLFloat y, GLFloat z)
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glVertex3f(x, y, z);
}
实现功能3:去除烟幕: (想加就加吧)
实现这个功能必须做的就是钩住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不处理它。这样去除烟幕的功能便算完成了。
void APIENTRY my_glBegin( GLenum mode )
if(mode==GL_QUADS) {
float curcol[4];
glGetFloatv(GL_CURRENT_COLOR, curcol);
if((curcol[0]==curcol[1])&&(curcol[1]==curcol[2])&&(curcol[0]!=1.0f)&&(curcol[0]!=0.0f))bSmoke=true;
else bSmoke=false;
glBegin(mode);
}
void APIENTRY my_glVertex3fv(const GLfloat *v)
{
if(bSmoke)return;
else glVertex3fv(v);
}
实现功能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 APIENTRY my_glBegin( GLenum mode )
if(mode==GL_QUADS)
float curcol[4];
glGetFloatv(GL_CURRENT_COLOR, curcol);
glGetFloatv(GL_VIEWPORT, coords);
if((curcol[0]==1)&&(curcol[1]==1)&&(curcol[2]==1))bFlash=true;
void APIENTRY my_glVertex2f(GLfloat x, GLfloat y)
float curcol[4];
glGetFloatv(GL_CURRENT_COLOR, curcol);
if(bFlash &&(y==coords[3]))
glColor4f(curcol[0], curcol[1], curcol[2], 0.01f);
glVertex2f(x, y);本部分内容设定了隐藏,需要回复后才能看到 [sell=3][/sell][ 此帖被亚希在2012-04-08 16:52重新编辑 ]
|