外挂知识浅析

openmiao

贡献于2012-06-19

字数:8989 关键词: C/C++开发

外挂基础知识浅析 前言: 鉴于很多还没入门的同学除了对游戏本身感兴趣以外,还对游戏外挂技术感兴趣,但大多数同学在对计算机基本知识都一知半解的情况下有很多莫名其妙的见解,这些想法和见解已经影响到大家的正常学习,即影响到对C语言的正确理解。当然还有很多只对游戏本身感兴趣,只被游戏玩的同学也有这种情况出现。我希望通过下面这篇东拼西凑的文章能帮助大家理解游戏外挂,认清当前自身知识体系存在的问题和不足,从基础开始,一步一步做好自己的学习本分,多练习多正确思考当前所学内容。从发文之日起,概不接受任何同学关于游戏外挂的任何问题及超出当前知识体系的问题,亦不做任何解答。除非被我认定过确实对编程及计算机运行体系有过人理解的同学,可以在规定范围内学习超前知识。对本文阅读过后产生的任何不满及消沉因素本人一概不负责任,读到此处的同学若认定自己属于心理承受力较强的,且反复认定自己确实打算在游戏行业内打拼的,可考虑将该文读完,若对此不感兴趣的同学或心理承受力较弱的同学,请就此打住,别为了一篇文章而埋没了自己对游戏的热忱和学习的积极性。 首先,我想说明几点: 第一,这篇文章并不是具体教你如何写外挂,只是带你大致浏览一下网游外挂的制作流程,并就其中的一些关键技术点加以简单说明。大家可以用看故事书的心情来阅读此文,了解一下网游外挂制作过程中的一些基本原理。 第二,网游数据的破解比较麻烦且艰深曲折(首先我自己在此坦诚承认在该领域只是一个连新手都不如的小菜鸟,鄙视我的同学可现在就另寻名师指导,莫让自己青春年华葬身在此。在下才疏学浅,实不堪担负指导阁下之重任),通常一个网游外挂制作团队内都有一名破解高手坐镇。所以碰到破解方面的问题我就只能一笔带过了。 第三,还是那句上课时曾经讲过的老话:错误的知识比无知更可怕,对一些理解力比较强,学习意志比较坚定的同学,看看也就罢了,说不定能让你对游戏之路产生更深层次的理解,提高你的学习积极性和自主学习性,了解自身的知识欠缺程度,专注于去做好眼前的学习之事,今后做好一个合格的游戏人。读这篇文章时,如果觉得不知所云,完全没办法理解的话是很正常的事,毕竟知识体系的完善犹如十年磨一剑,因此完全没必要为此感到灰心和沮丧。但是千万别去钻牛角尖而走进死胡同,妄图凭借现在的知识去臆断和猜测其中的任何一项技术,如果一定要这么做,除了自虐及强X大脑,我实在找不出其他词汇可以形容。对该文中涉及的一些今后3年都不会学习到的名词会用红色字体标示,并在文后的附注里用最浅显的文字加以描述。对于用粗体黑字描述的知识点,后面括号中或做一般说明,或指出在哪个学习时间段能详细学习到,有兴趣的同学不妨留意并记忆下这些敏感关键词,对今后的学习会有所帮助。 第四,文中提到了关于黑客网站,但是大量的所谓黑客及破解网站鱼龙混杂,良莠不齐,并且骗子层出不穷。很多下载的黑客资料或者黑客工具中就包含了大量的病毒或者木马,对计算机尚不能自如操作甚至连操作系统及应用软件都不会安装的同学千万别随意搜索、访问这些网站和使用这些资料、工具,轻则格式化硬盘并重新安装系统,重则机器有可能遭受硬件损坏并无法修复,带来不必要的经济损失。这里务必重点提醒。 一、游戏封包的加密与解密算法的破解   破解封包的加密与解密算法是制作外挂的第一步,是外挂制作中最具技术含量的步骤,同样也是一个十分令人头痛的环节。如果加密与解密算法被成功地破解,那么外挂制作也就完成了一半。破解封包的加密与解密算法的行为同样属于黑客们其中之一的行为,因此我们可以在黑客网站里找到相应的资料,另外网络上也有专门的破解网站为大家提供信息。   在破解封包的加密与解密算法之前我们首先需要知道一些情况。我们知道随着机器性能的提高与网络带宽的提升,新的游戏运行商对游戏封包的加密与解密算法的设计变得越来复杂。那种原先通过分析封包数据就可以得出加密与解密算法的时代已经变成了过去。现在如果再要破解一个游戏的封包的加密与解密算法,那么其必须通过分析程序源代码才能清楚。   1.1 封包的概念 本文所讲的封包是指由sockets协议(该知识将在第3学期Windows编程中网络编程部分详细学到)进行发送与接收的数据包。广义的封包是指计算机之间互相进行通信的数据包,其可以因通信协议的不同而在内容上有所不同。   1.2 破解原理 目前破解封包加密与解密算法的方法主要是通过动态调试技术来实现的。其原理是首先通过动态调试跟踪并取出加密与解密算法的代码段,然后再通过分析这些代码最终得出结论。 那为什么我们可以跟踪并取得这些代码呢?首先我们知道无论游戏程序如何设计,其加密与解密算法的代码永远存在于程序中;其次我们知道在程序流的执行过程中,加密与解密算法的代码段一定会被执行。   1.3 破解需要具备的知识 要能顺利进行破解则必须具备一定的知识,一是熟练掌握汇编原理与汇编语言,二是要熟悉加壳与脱壳原理(虽然很多游戏不需要),三是要熟悉代码结构的知识,四是要熟悉动态调试技术与调试工具的使用,五是具有高级语言知识(譬如C、C++、JAVA等)与较高的编程修为。   1.4 破解的技术与方法 动态调试工具我们可以采用OllyDbg工具或其他工具,不熟悉OllyDbg工具的可以查看它的中文帮助。动态调试主要是跟踪代码的执行,而我们查找加密与解密代码段就是一个跟踪的过程。一般跟踪的起点可以是windows消息、socket中的send与recv等函数(这些知识同样将在第3学期Windows编程中详细学到)。有时程序有可能将发送与接收过程由一个专门的线程(第2学期详细学习到)进行处理,那么这种情况下我们需要找出该处理线程。至于具体如何进行跟踪本文不再进行详述,具体内容可以到相关网站上查看,比如看雪学院、笨冬瓜等网站。这里主要讲一下加密与解密算法代码的特征。   1.5 加密与解密算法代码特征 虽然在未进行分析之前我们很难判断一段代码是否是加密或解密算法,但我们还是可以根据一些特征进行较大概率的猜测。一情况下加密与解密都要进行一系列的异或、移位、加减、乘除(第1学期后期就会提及,并在第2学期的游戏高级特性里重点运用)和重复运算过程,因些一段代码中若具有上述特征,我们可以进行较为肯定的断定。   1.6 代码反推导 代码反推导是进行破解算法的主要方法,代码反推导的水平主要与一个人自身的编程修为相关,但在这里仍有一些基本的方法。代码反推导可以有一定的程式,首先可以将汇编码写成三元表达码(简单的理解就是指一个表达式了,譬如i=i+5;这个式子就是由3个运算单元i,i,5和两个运算符=,+构成的,故称为三元表达码),其次将代码中的转移指令转换为条件语句或循环语句,再次将代码中的变量进行迭代,最后进行变量形式转换与语句形式转换。通过以上的步骤,一般我们可以将汇编语言转换为高级语言,而当我们推导出高级语言后,就能进行较为实义的分析。 接下来的过程就是实际制作了,大致流程为: ①.选择一款目标游戏 制作网游外挂的第一步就是选定一款游戏。目标游戏不是乱选的,里面也有很多讲究。 第一点,选择自己熟悉的游戏类型。如果你之前已经做过网游外挂,那选择一款类似的游戏会给你节省很大的时间,如果是第一次制作的话,那也选一款自己熟悉的游戏类型。 第二点,尽量不要选择热门的游戏,因为热门的游戏往往意味着竞争对手的增多,而且反外挂系统也比较厉害。像梦幻诛仙驱动+反外挂...头疼. 第三点,不要小看玩家人数少的游戏,游戏规模小,一般技术也比较容易突破。如果想销售的话。一款游戏,只要你能形成吃独食的场面,再加上营销搞得好的话,其中的利润将超过你的想象。但要注意,最好不要碰上因为游戏规模过小导致游戏厂商把游戏关闭的衰事。 第四点,尽量选择尚在测试期内的游戏,这使得你有充足的时间制作外挂。 ②.目标游戏初分析 1.确定制作网游外挂的类型. 目标网游选定好之后,你首先要做的第一件事就是确定你要制作的网游外挂类型。 网游外挂虽然统称为外挂,但细分的话可以分为以下二类:内挂和脱机外挂。 内挂就是在游戏内呼出的网游外挂,它依赖于网游客户端,所使用到的技术主要包括鼠标和键盘的模拟,内存特殊变量区域的搜索,或者是挂钩(3学期会略微提及,并尝试写一个CS透明的外挂)游戏的收包函数和模拟游戏的发包函数。 脱机外挂就是指不依赖于客户端,能独立模拟客户端和游戏服务器进行通讯的网游外挂。脱机外挂的实现方式只有一种,就是模拟网游客户端的收包和发包过程。 总体而言,内挂的整体制作难度比脱机外挂要简单一些,但脱机外挂制作要比内挂更有趣,而且用起来也更方便,不必启动庞大的客户端程序。 某些时候脱机比较容易上手,但所有的游戏也不是都是这样。所以以下都是脱机教学为例: 二、游戏指令与数据结构(第3学期重点知识,成为高手的必备知识)的筛查 游戏指令和指令中所携带的数据结构的筛查是外挂制作的第二步,这一步并不是很难,但十分烦锁。游戏指令和其数据结构的筛查并无技巧可言,主要是通过多次重复比较数据而最终确定结果。   在筛查游戏指令和其数据结构之前我们需要对封包截获技术有所了解,同时能对当前流行的几款封包截获工具如FPE、WPE(小小的自大一下,偶非常熟悉的说,哇哈哈哈……)等有所熟练使用。然而由于某些游戏运行商会针对一些问题而制定相应对策,因此有些时候需要我们自己编写封包截获工具。自己编写封包截获工具的好处还在于可以具体针对某一款游戏而编制特定的工具,这之中最重要的是可以事先将加密数据解密成明码,为分析封包提供方便。   2.1 封包截获技术 根据具体的截获原理不同,封包截获技术可分为:一是Hook技术(同样第3学期内容,略微提及并提供给有理解能力的同学原理与源代码 )、一是socket重写技术。无论使用何种截获技术我们最终要跟踪的都是socket中的发送函数与接收函数,如send、recv等。   2.1.1 Hook原理 Hook原理是通过向应用程序中注入dll文件,并改写应用程序函数导入表中的DLL调用函数,Hook技术要求我们对可执行程序的文件即PE文件结构有所了解。   2.1.2 socket重写原理 socket重写原理是通过重写整个socket文件,用新写的socket文件代替原socket文件,并由新socket文件调用原socket文件中的函数,从而截获函数的调用过程(函数指针的应用而已,第1学期就会用到,不过我担心很少有人能正确理解并运用)。socket重写技术要求改写后的socket文件具有跟原socket文件相同的接口,否则程序调用将发生错误。   2.2 封包的分析 封包分析时最重要的就是尽量减少分析时的干扰,干扰越少越有利于我们能针对性地得到结果。因此封包分析时一般是将游戏角色尽量带到一个玩家或怪物比较少的地方,同时在分析出一个后尽量过滤一个。   2.3 分析结果的处理 封包分析完毕后,我们可以为每一个指令定义一个含义比较明确的代码,并为每条指令所携带的结构信息定义相应的数据结构,为指令中的状态码(即程序运行过程中的中间结果)也定义相应的代码。为所有指令与数据结构进行相应的定义,可以使我们在后续的外挂代码书写过程中隐藏掉实现的细节。 1.网络截包工具(Microsoft Network Monitor)的简介 目标网游的初步分析最主要的工作是分析游戏初始阶段网游客户端和服务器之间的数据通讯。这一阶段主要是指从输入用户名和密码开始登录游戏到玩家人物出现在游戏场景中这个阶段。这是开始阶段最关键的一个步骤,如果你能够成功破解网游数据通讯部分的加密,并用Debug程序(在命令控制台下直接输入debug试试)成功模拟整个登录过程,那你几乎就已经成功了一半了。如果无法破解加密的话,那就需要赶快重新选定一款游戏了。或者请高手或者朋友帮你分析。 关于初步分析,首先要确定网游客户端和服务器之间的大致通讯过程,最起码你要知道客户端连接的是哪一个服务器,连接的端口是多少,在登录的过程中发送和接受了几个包?而要了解这些东西,你就要使用到网络截包工具了。 初学者可以使用.Microsoft Network Monitor V3.1(英语实在太烂了就别白费功夫了,目前尚无完整功能的汉化版,即使有也是功能不齐全或者压根无法正常使用的),方便简单。大家可以到下面的网址去下载该软件。http://support.microsoft.com/kb/933741/zh-cn。具体的使用方法在这里就不多费文字了,我想大约到大家毕业的时候,少数的高手能理解并截获某款网络游戏的封包就很不错了。这里仅简单介绍一下。 2. 分析初始阶段C/S网络数据通讯 这里就是整个Microsoft Network Monitor的使用过程,过程繁复冗长,略过,即使详细给出整个分析过程大家也没办法看懂。见谅。 3.游戏加密算法破解 网络游戏所使用的网络通讯函数肯定也是微软操作系统所提供的标准API函数(就是大家平时用的printf,scanf类似的东西),所以通常在接受网络数据的API函数中下一个断点,当接收到第一个7字节包时(技术细节,不解释),断点激活,然后逐渐跟进去,查看游戏客户端是如何处理该段数据的,然后我们在外挂中依样画葫芦,进行同样的处理。整个破解过程相当的枯燥无聊,因为面对的都是汇编代码。 4.Debug版本制作 破解完成之后,就要制作一个能够登录游戏的Debug版本了,用于确认游戏加密算法的破解是否成功。 至于选择何种编程语言和工具制作外挂则没有限定,常用的如VC(我们靠它吃饭的东西,上课见过的),Delphi,等都可以,但是易语言(中国顶尖黑客发明的一种高级面向对象的可视化语言,掌握的前提是理解Windows编程原理)和VB不太推荐,因为局限性太多,但并不是说语言不好,具体的编程在此就不具体说明了,可以根据个人的喜好所选择,下面谈谈网游中数据通讯的基本单位:指令包。 所谓指令包就是代表了一个最基本含义的数据包。比如游戏人物向左移动时,游戏客户端就会向服务器发送一个指令包(人物走路包),通知服务器更新游戏人物的坐标。当游戏人物周围出现一个新的怪物时,服务器会向客户端发送一个指令包(怪物出现包),通知客户端在画面上绘制出该怪物。所以,可以说指令包就是客户端和服务器之间所使用的通讯语言,而外挂的工作就是解析该种语言,然后模拟客户端和服务器端进行通讯。 各个游戏定义的指令包的格式都不一样,但一般一个指令包通常含有以下几个元素: A)指令包的长度。它可能是指整个指令包的长度,也可能是指它余下部分指令的长度,这需要根据游戏的具体情况来确定。之所以专门要用一定空间来说明指令包的长度,这是由SOCKET通讯的机制所决定的。SOCKET连接建立好之后,通过SOCKET连接读取到的数据并不是以指令包为分割的。有可能一个TCP(使用最为广泛的网络通讯协议,第3学期学到)包中正好包含一条指令包,也有可能仅仅包含指令包的一部分。所以这时候就要根据指令包长度将收到的网络数据截取成单个的指令包。 有一点需要指出的是:刚开始的几个数据包不一定遵循一定的规律,这时候就需要进行特殊处理(因为在开头,所以也比较好处理),而之后的数据包肯定是遵循指令包格式的,不然就乱套了。 B)指令包标识,用于说明该指令包是属于哪一种类型。比如怪物攻击包,玩家的移动包……,游戏客户端根据收到的相应指令包采取不同的动作。事实上,在客户端程序的内部就是一个很大的Switch语句(第1学期马上就要学到的东西),用来处理不同的指令包,如下所示: Switch(指令包类型) { Case 移动包: 绘制相关人物的移动; break; Case 攻击包: 绘制A攻击B的画面; break; … } C)指令包详细的信息,该部分随着不同的指令包而有不同的格式。比如,如果是玩家移动包的话,他就会在此部分详细说明是哪个人物在移动,移动点是从哪儿到哪儿。 Debug成功制作完成的话,那我们就已经成功了一小半了。接下去的工作主要分为动态和静态二个方面。动态方面是根据已掌握的指令包格式,逐个分析游戏中的各个基本指令。静态方面则是从游戏客户端中解析出相应的资源(就是游戏中的各种图片、声音、地图文件、模型等)。 ------------------------------------华丽的分割线------------------------------------------------- 到此,对外挂的各种基本概念大概做了一下讲解,对外挂的制作流程的第一阶段也做了一个基本的描述,从这里以后就是外挂程序的详细设计部分了,余下的内容所包括的知识内容让我这个从业6年的游戏人感到无比的羞愧,深感知识的不足与知识体系的缺陷,因为大海之大无从比拟,我胸中所学也仅是沧海一粟。故以此出发点不断鞭策自己不断在游戏领域里学习成长,其中想得最多的就是如果教好我那些渴求游戏知识的学生们。后面就仅对制作内容简单提要。若诸位中有对计算机理解力超强的人,鄙人必将胸中所学倾囊相授,为中国游戏事业做一点力所能及的微薄之事。 游戏外挂制作详细设计大体内容如下: 一、封包的具体解析与应用 1.监控网游客户端的发送包和接受包 2.分析网游指令的通用方法 3.编写程序达到自主控制发送和接收包的目的 二、游戏地图文件的破解与转换 1.地图资源解析 2.其他资源的解析 3.对游戏中的游戏过程进行非法再现 三、外挂中智能AI部件的实现 1.寻路算法 2.外挂配置文件的构造与设计 3.其他算法 4.在不需要官方客户端的情况下达到自动控制角色的目的 四、脚本解析器设计与游戏脚本指令 1.解析该款游戏的脚本所包含的具体游戏动作 2.解析该款游戏的脚本的语法 3.编写脚本程序实现游戏的其他辅助功能 最后的题外话 网游外挂产业真的是一个很有趣的领域,他主要是包含二个方面:技术和营销。 技术方面,网游外挂所涉及的技术之广并不逊色于一款网游所涉及的技术。其中技术难度最大的还是破解方面,据闻中国几大顶尖的破解组织高手大部分都与外挂破解有或多或少的联系。近几年随着大部分的游戏都运用了NProtect(玩DNF的人应该观察得到这个软件,它会在游戏启动过程中自动调用,如果试图强行终止该保护程序,则主游戏程序也会随之崩溃。),在与NProtect的逐渐斗法过程中,战场从RING3层(操作系统应用层称为第3应用层,故称为RING3)逐渐转移到系统内核层,也着实培养出了一批对于Window内核有深刻理解的高手,国人之幸啊。 讨论网游的技术是一个很有趣的话题,但个人认为更有趣的方面在于网游外挂的营销。由于近几年网游外挂制作团队的大量涌现。同一款游戏常常有着好几家外挂在互相竞争。这时候的外挂营销就像一个硝烟弥漫的战场,你不仅要与外挂同行竞争,还要和游戏发行商互相斗法,同时随着近几年相关法律的健全,你还要小心自己不要被相关政府部分盯上。嘿嘿,挺危险的,据报道,因制作和以盈利性质散布发行第3方辅助软件而导致牢狱之灾的近几年屡见不鲜。 在与同行竞争的过程中,不仅要比拼技术(游戏采用了更严密的保护手段,你还要能破解它),比拼反应时间(游戏客户端有了更新,你要迅速反应),更要比拼营销手段,推出各种各样的优惠套餐,尽可能的拉拢住更多的客户,比如,如果外挂单月的收费是20,则半年只要100,全年只要180,这样表面上你好像少收了钱,但实际上你把客户和你牢牢的绑定住了,即使竞争对手推出更好更便宜的外挂,你也不用害怕,因为你有足够的时间来反应。类似的手段还有很多,这主要看你的营销水平了,有良好营销手段的外挂,月盈利过百万也不稀奇。 与此同时还要处理好与竞争对手之间的关系,能很快消灭对手的,则绝不留情。明显不如对手,且对手满怀敌意的,则干脆开放免费版,让大家都不好受,玉石俱焚。势均力敌的,能结成同盟的最好达成价格联盟,避免互相砍价给彼此造成损失。互相敌视的,则要尽量给竞争对手下绊子,比如攻击对手的站点啊,到他的论坛上面捣乱啊……,总之就是想尽办法击败对手,取得一家独大的场面,一旦你能在一款游戏里面吃独食,形成垄断,那外挂的价格就随你定了。够你爽的。 外挂的营销就像一个群雄并起的战国时代,大家各施手段,各凭本事,看谁能笑到最后。这里面发生过很多有趣的故事。不过近几年国内相关法律越来越严格了,所以并不建议大家踏入这个泥水潭。 好了,以上就是关于外挂的全部基本认识了,大家认真读完过这篇文章的人相信能对外挂有了一定层次的基本了解了。如何?有什么深刻的体会没?对以后自己的游戏之路有什么新的认识和看法?我相信真正把游戏当做自己人生目标的人应该会以一种全新姿态对面对新的大学生活了吧。 谭晓昱 于2010年10月24日 12:16 附注: 名词解释: 1、 游戏封包:游戏封包指在游戏过程中,客户端及服务端为了通讯便利和有统一的数据传输标准而设立的一种数据描述方式,即将游戏中的各种数据统一存放在一个数据集合中,这个过程叫做封包,或者打包。然后将打包的数据做为一个整体进行传送和接收。游戏中的封包在发送及接收过程中是可以被某些特殊软件截获的,为了游戏的安全性,通常会将封包内的数据进行加密处理,使之不能被轻易了解封包的数据保存形式和这些数据表达的含义。 2、 动态调试:动态调试指任意程序在运行过程中通过设置断点等方法来了解程序的运行方法、数据流向等的行为,通常动态调试中观察到的程序是以汇编语言及16进制数据表示形式展现的,生涩难懂且难于掌握。 3、 汇编语言:一种广为使用的低级语言,描述形式为直接针对硬件的工作方式,譬如:MOV AX BX,则表示将CPU中BX寄存器的值赋值给AX寄存器,这与高级语言的int i=10类似,但由于是直接操作计算机硬件,独立于操作系统,很少有人能掌握其正确的使用方法,即使能掌握也不能运用自如。 4、 加壳与脱壳:一个程序为了防止随意对其进行修改和调试,在程序执行之前会加上一段特殊的具有迷惑性的代码,而让视图跟踪和调试程序的人找不到正确的程序入口,这个过程被称为加壳,而去除掉这段迷惑性代码则成为脱壳。 5、明码:加密过的数据称为密文,解密过的数据即为明码,例如“Hello,World”是我们能读懂的英文,若给该字符串的每个字符的ASCII编码都加个4,那就看不懂了,大家貌似做过类似的习题的。

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档