有群友在讨论外挂的问题,这里一般是指游戏外挂但不限于。有些群友想学习编写游戏外挂但不知道需要具备哪些编程技术和实现原理。
nerror="javascript:errorimg.call(this);" class="" width="" height="" style="" id="" >
要解决这些问题的先来认识一下游戏外挂,那到底什么是外挂,又该需要哪些基本编程知识呢?
什么是外挂
外挂就是一个另外的辅助程序,它能影响、修改、改变目标程序的运行情况。典型的游戏外挂就是可以加速操作过程,修改游戏属性值,加快等级提升等等。最开始的外壳来源于单机游戏文件修改,想想当年玩仙剑的时候,先存储一个游戏进度,再把进度保存的文件用二进制编辑工具打开,查找一下特征值,武力、防御值,然后修改成最大的,再读入进度,瞬间李逍遥变得强悍无比,妖怪根本无法伤害他。。。当然现在单机版游戏很少了,但有的依然可以采用这种原始办法来改。现在的网络游戏基本不能用这种简单办法来完成了,因为它的所有数据都存在于服务器端,那么我们还能修改服务器的数据吗?能,最简单的办法就是联系游戏服务器管理员。。。呵呵开玩笑了!要编写一般通用的外挂需要一下基本编程技术。
模拟键盘和鼠标
很多游戏中需要模拟键盘和鼠标,以便完成自动功能,或者加速操作,比如有些游戏,需要鼠标或键盘来控制出刀、拳击速度,要是模拟鼠标按键,那当然比手工快几百倍都不止吧。这项功能本身不难,对系统编程有一定基础的都能办到。
nerror="javascript:errorimg.call(this);" class="" width="" height="" style="" id="" >
截获消息和快捷键
所有的游戏都会有消息响应和快捷键,我们常常需要在某个事件的时候去分析他们内存数据,这时候就需要截获游戏的消息和快捷键。比如点击鼠标本身就会产生一个游戏动作,如果我们要对后面的动作进行修改,那么一定少不了这个拦截,否则怎么去修改数据呢?另外我们的外挂动态库也需要在特定时候加载进入目标程序,也需要截获消息和鼠标键盘等,windows下常用的钩子函数往往可以完成这个任务。这个对于windows下编程的人来说也不是难事。
nerror="javascript:errorimg.call(this);" class="" width="" height="" style="" id="" >
拦截API和网络数据包要修改游戏中的数据,对网络数据包和API的拦截是必不可少的,其实两个可以合并归结为拦截API的技术,这个技术广泛应用在鼠标取词、实时翻译等软件中。API拦截是一个比较高级的技术,他可以完成很多你想象不大的功能,想想你的程序在调用API时,你拦住它并可以任意修改传入API的参数就知道它的威力有多大了,所以拦截API是外挂程序编写不可或缺的技术。目前拦截API的方法可以分成三类:第一种是修改API函数在内存映射的开始部分,比如将他的代码改为jmp到你自己的函数里面,完了在跳转回来。这种办法有局限性,需要保持原来的函数机器码,并且是硬编码方式,不同版本可能不同。第二种方式修改函数输入表内存镜像,使得系统在调用这个函数的时候自动调用你的函数,让后你自己处理参数后再调用原版的API。这中方法具有通用性,只跟Windows的机制有关,跟版本没有关系,这是一种推荐的方式。第三种方法是偷梁换柱,直接替换API函数所在的动态库,自己写一个dll并把原来API所在的动态库的所有函数都在你的dll中定义一个,包括参数都完全一样,然后你在自己的函数中处理完后再调用原版的API,这个需要把原版的动态库重新命名。这种办法对一些有签名的动态库就无效了,比如要你替换系统的dll,估计会有问题的,一般用于替换第三方的。
内存映射的读写
外挂一定少不了对内存数据的读写,而且很可能是跨进程的操作,所有你需要Windows虚拟内存方面的知识。当然主要的工作Windows的API都已经帮你做了,这个一定少不了ReadProcessMemory和WriteProcessMemory这种API了,但是你要做的事情还是不少,比如虚拟内存的保护,进程地址搜索等等。这些看起来一句话说完,要去用代码实现,事情是少不了的。
nerror="javascript:errorimg.call(this);" class="" width="" height="" style="" id="" >
远程线程注入外挂有时候还少不了需要将自己编写的代码放到目前程序中运行,这就必须将自己的代码注入到目标进程中去,达到获取信息,修改信息的目的。远程线程注入最常见的方法有两大类:一种是采用安装钩子函数将自己的dll注入到目前进程中。第二种办法是采用创建远程线程,让直接的代码运行到目标进程中。
了解网络编程
你需要对网络编程有所了解,至少你要知道socket相关的基本知识,数据包如何发送和接收,最好能编写基本的网络程序收发程序,熟悉这些函数,你才能拦截网络数据包,否则怎么拦截?上面的API和网络包拦截都是空话了,这个对很多熟悉网络编程的人来说都是很简单的。
nerror="javascript:errorimg.call(this);" class="" width="" height="" style="" id="" >
Windows编程和系统知识以上那些看起来可能不难,但是它是建立在你对Windows编程有相当功底的基础上。比如要是你对PE文件格式不了解,谈何完成上面的第二种API方式。要是不了解虚拟内存,怎么完成整个进程地址内去搜索特定内容。所以要编写Windows下游戏外挂,对Windows的了解是必不可少的,比如如何编写动态库,钩子函数使用,各种常见、关键的API函数不但要知道,还有能正确灵活的应用。
具备一定的汇编功底
最后还是少不了汇编的知识,能看懂基本的汇编。对游戏数据的修改,排除少不了调试,而我们并没有这些源码,只能用动态调试工具在运行时调试它的汇编代码,这个跟上一篇破解是一个道理。
需要任性和耐心
外挂同样是一种需要很大耐心的东西,外挂的程度也不同,可以编写简单一点的仅仅改数据,也可以搞成很复杂的,主要就是通过修改关键数据欺骗服务器和本地客户端。跟破解一样,也不是什么程序都能写出好的外挂,现在好的游戏都有防止外挂的功能,像传输数据加密,程序加壳等等。所以这个就像矛与盾的关系,处于斗争和反斗争之中。
如果在学习中遇到困惑可以直接加编程导师微信号coderonline,获取自学指南.
如果对编程感兴趣,想了解更多的编程知识,解决编程问题,以及入门指导,帮你解决编程中遇到的困惑,我们这里有java高手,C++/C高手,windows/Linux高手,android高手,请大家关注微信公众号:程序员互动联盟或者coder_online