四种网络游戏外挂的设计方法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

在几年前我看到别人玩网络游戏用上了外挂,做为程序员的我心里实在是不爽,想搞清楚这到底是怎么回事。就拿了一些来研究,小有心得,拿出来与大家共享,外挂无非就是分几种罢了(依制作难度):)R/Z9q/z$O3^(L4T/w'D:z(R:]3S1、动作式,所谓动作式,就是指用API发命令给窗口或API控制鼠标、键盘等,使游戏里的人物进行流动或者攻击,最早以前的“石器”外挂就是这种方式。(这种外挂完全是垃圾,TMD,只要会一点点API的人都知道该怎么做,不过这种外挂也是入门级的好东东,虽然不能提高你的战斗力,但是可以提高你的士气)*I$R)R7q9g0v!|H%|:s-g)e3s-ZN0o2、本地修改式,这种外挂跟传统上的一些游戏修改器没有两样,做这种外挂在编程只需要对内存地址有一点认识并且掌握API就可以实现,“精灵”的外挂这是这种方式写成的,它的难点在于找到那些地址码,找地址一般地要借助于别人的工具,有的游戏还有双码校验,正正找起来会比较困难。(这种外挂,比上一种有一点点难度,但是这种外挂做起来能够用,也是有一定难度的啦~~,这种外挂可以很快提升你对内存地址的理解及应用,是你编程技术提高的好东东)3、木马式,这种外挂的目的是帮外挂制作者偷到用户的密码(TMD,“烂”就一个字,不过要知已知彼所以还是要谈一下啦~~),做这种外挂有一定的难度,需要HOOK或键盘监视技术做底子,才可以完成,它的原理是先首截了用户的帐号或密码,然后发到指定邮箱。(我以前写过这样的东东,但是从来没有用过,我知道这种东东很不道德,所以以后千万别用呀!)4、加速式,这种外挂可以加快游戏的速度……(对不起大家,这种东东我没有实际做过,所以不能妄自评,惭愧)1v4K%H1t-w-\$A0B3q3T:o;l'n%z这几种外挂之中,前三种可以用VB,Delphi等语言比较好实现,后两种则要用VC等底层支持比较好的编程工具才好实现。6F1Y2X!S9Q*E8I4Q'S动作式外挂'y/M7k,C*o#Q首先,先来谈一下动作式的外挂,这也是我第一次写外挂时做的最简单的一种。记得还在“石器”时代的时候,我看到别人挂着一种软件(外挂)人物就可以四外游走(当时我还不知道外挂怎么回事),于是找了这种软件过来研究(拿来后才听别人说这叫外挂),发现这种东东其实实现起来并不难,仔佃看其实人物的行走无非就是鼠标在不同的地方点来点去而已,看后就有实现这功能的冲动,随后跑到MSDN上看了一些资料,发现这种实现这几个功能,只需要几个简单的API函数就可以搞定:;h;E.Y!Y9i0h1、首先我们要知道现在鼠标的位置(为了好还原现在鼠标的位置)所以我们就要用到API函数GetCursorPos,它的使用方法如下:3z5j(_6^IBOOLGetCursorPos(LPPOINTlpPoint//addressofstructureforcursorposition0^/Y1n(V2~#]);2、我们把鼠标的位置移到要到人物走到的地方,我们就要用到SetCursorPos函数来移动鼠标位置,它的使用方法如下:BOOLSetCursorPos(&`%N2H)e'k%r8s;sp'R5t$G)_intX,//horizontalpositionintY//verticalposition);*w(x%^'?'e3、模拟鼠标发出按下和放开的动作,我们要用到mouse_event函数来实现,具休使用方法用下:;}-s`i'Z&I)j4`$N3c7w-U(t9A)yVOIDmouse_event(DWORDdwFlags,//flagsspecifyingvariousmotion/clickvariantsd+SD%\%d]4W$v!uDWORDdx,//horizontalmousepositionorpositionchange!c;I$q#f-C%?/IDWORDdy,//verticalmousepositionorpositionchangeDWORDdwData,//amountofwheelmovement&V;w0G#o4}DWORDdwExtraInfo//32bitsofapplication-definedinformation5J%c1X-V5U0Y3c-v0r8K4b);1X%p-z;}#r#n$}在它的dwFlags处,可用的事件很多如移动MOUSEEVENTF_MOVE,左键按下MOUSEEVENTF_LEFTDOWN,左键放开MOUSEEVENTF_LEFTUP,具体的东东还是查一下MSDN吧~~~~~(o*i/f1o9['n好了,有了前面的知识,我们就可以来看看人物移走是怎么实现的了:getcursorpos(point);setcursorpos(ranpoint(80,windowX),ranpoint(80,windowY));//ranpoint是个自制的随机坐标函数'F2A:z6s:G~9Emouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);n0A0V,O&r#Q%Hsetcursorpos(point.x,point.y);(_3A1u2V4V8p看了以上的代码,是不是觉得人物的游走很简单啦~~,举一仿三,还有好多好东东可以用这个技巧实现(我早就说过,TMD,这是垃圾外挂的做法,相信了吧~~~),接下来,再看看游戏里面自动攻击的做法吧(必需游戏中攻击支持快捷键的),道理还是一样的,只是用的API不同罢了~~~,这回我们要用到的是keybd_event函数,其用法如下:#M.A2~#B8b9|:N(_2G(G-rd+F0E;Wl6S2Q0FVOIDkeybd_event(BYTEbVk,//virtual-keycodeBYTEbScan,//hardwarescancode&hF$G!f)Oe9dDWORDdwFlags,//flagsspecifyingvariousfunctionoptionsDWORDdwExtraInfo//additionaldataassociatedwithkeystroke'c%V3q9]9M3C/u);0P9{0h#R%e/z7i8o我们还要知道扫描码不可以直接使用,要用函数MapVirtualKey把键值转成扫描码,MapVirtualKey的具体使用方法如下:UINTMapVirtualKey(UINTuCode,//virtual-keycodeorscancodeUINTuMapType//translationtoperform4Az;Z)Z2d/s1H/_2T);/I&b!Z^)Y({-O5N好了,比说此快接键是CTRL+A,接下来让我们看看实际代码是怎么写的:keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),0,0);&C1@9T,r,M#c.L:Z3Mkeybd_event(65,mapvirtualkey(65,0),0,0);7Y7Q0fKmkeybd_event(65,mapvirtualkey(65,0),keyeventf_keyup,0);-V6hy,@&b8J;j5Zkeybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),keyeventf_keyup,0);/E,C*],k(^%l首先模拟按下了CTRL键,再模拟按下A键,再模拟放开A键,最后放开CTRL键,这就是一个模拟按快捷键的周期。0|){1k6{*I(看到这里,差不多对简易外挂有了一定的了解了吧~~~~做一个试试?如果你举一仿三还能有更好的东东出来,这就要看你的领悟能力了~~,不过不要高兴太早这只是才开始,以后还有更复杂的东东等着你呢~~)/q:AA2w1|1~1o5|'m(P本地修改式外挂/T5G9P,Z#E0H;C.H,^2n9D1b)r4T5C现在我们来看看,比动作式外挂更进一步的外挂——本地修改式外挂的整个制作过程进行一个详细的分解。)e9i,B%M7W&p具我所知,本地修改式外挂最典型的应用就是在“精灵”游戏上面,因为我在近一年前(“精灵”还在测试阶段),我所在的公司里有很多同事玩“精灵”,于是我看了一下游戏的数据处理方式,发现它所发送到服务器上的信息是存在于内存当中(我看后第一个感受是:修改这种游戏和修改单机版的游戏没有多大分别,换句话说就是在他向服务器提交信息之前修改了内存地址就可以了),当时我找到了地址于是修改了内存地址,果然,按我的想法修改了地址,让系统自动提交后,果然成功了~~~~~,后来“精灵”又改成了双地址校检,内存校检等等,在这里我就不废话了~~~~,OK,我们就来看看这类外挂是如何制作的:9[/p0X)l|0`+|)p#j'~2v6T在做外挂之前我们要对Windows的内存有个具体的认识,而在这里我们所指的内存是指系统的内存偏移量,也就是相对内存,而我们所要对其进行修改,那么我们要对几个WindowsAPI进行了解,OK,跟着例子让我们看清楚这种外挂的制作和API的应用(为了保证网络游戏的正常运行,我就不把找内存地址的方法详细解说了):1、首先我们要用FindWindow,知道游戏窗口的句柄,因为我们要通过它来得知游戏的运行后所在进程的ID,下面就是FindWindow的用法::i2r3r#W*u3z5\!d2d#{-K7r*M8?4i.A%c+n.l0^%hw8f+c1J&S!H8`+~HWNDFindWindow(7h3J7T9_1@-^&L+|#LLPCTSTRlpClassName,//pointertoclassnameLPCTSTRlpWindowName//pointertowindowname'z-~0~.U-{#`!R);2`5y5lE%N1`(`7k)x%r-w6@/U2v'f#f2、我们GetWindowThreadProcessId来得到游戏窗口相对应进程的进程ID,函数用法如下:2^+U&]V;B:CDWORDGetWindowThreadProcessId(#L:^%o)p.U/a*y$U%f3{HWNDhWnd,//handleofwindow.r0y(x;m]iLPDWORDlpdwProcessId//addressofvariableforprocessidentifier);];r9`,Y%x3、得到游戏进程ID后,接下来的事是要以最高权限打开进程,所用到的函数OpenProcess的具体使用方法如下:*J+L9A5R9l;b1W9g6d#K-|.^Y:S?0j;L9@8}$~9v%p;\.}1e'T-T.^2n8R0p9_6m'OHANDLEOpenProcess(DWORDdwDesiredAccess,//accessflag#v#A9E,`6W%o)UBOOLbInheritHandle,//handleinheritanceflag6]5[9O6r9~!M:_DWORDdwProcessId//processidentifier8H.^0Q:C3y/c)z#H6l1R);+z8pa%@(F&B%[$u0R5G$L8v(q1D_:D)S*o4b*W9I#W#h3j:z在dwDesiredAccess之处就是设存取方式的地方,它可设的权限很多,我们在这里使用只要使用PROCESS_ALL_ACCESS来打开进程就可以,其他的方式我们可以查一下MSDN。*s#q9d(E/q*p;j(D9?0P4、打开进程后,我们就可以用函数对存内进行操作,在这里我们只要用到WriteProcessMemory来对内存地址写入数据即可(其他的操作方式比如说:ReadProcessMemory等,我在这里就不一一介绍了),我们看一下WriteProcessMemory的用法::r;K6V3z#j1P!j2D:v,ka5F+r$E&i.S6q5F*V+A2A/[{;EBO

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功