- 牛云
-
随着网络游戏的日益火爆很多玩家都投身到游戏中目前很多玩家都依赖于一些游戏的外挂程序来进行游戏那么做一个游戏的外挂程序是否是一件很困难的事呢回答是"否"诚然编写一些程序是需要一些基本知识的所以我们想以最简单的语言来给你讲授编写外挂程序的一些技巧一些方法并提供给你一些基本的辅助工具即使你是一个菜鸟看了我们的教程并技巧地使用我们提供给你的工具你完全能够编写出一个完全属于你自己的外挂在本教程内我们提供了金庸群侠传以及网络三国这两个游戏的修改实际例子因为这两款游戏都是对封包进行过加密运算的如果你对这两个游戏的修改有了一定的了解后相信你在其他游戏中也能非常好地做出属于自己的外挂我们提供了金庸打增援20个NPC和网络三国在PK中自动吃药自动发镖这两个实际的例子让你上手更容易我们会在教程内讲授给你怎么去破解封包的加密算法怎么利用我们提供给你工具来伪造和发送封包本教程除了文字教程外我们还会提供金庸群侠和三国的外挂程序另外还提供6个外挂制作工具以供你使用希望在以后的游戏中每一个玩家都能够在游戏中成长起来不但游戏玩的出色修改游戏也同样出色做一个真正的游戏DIY
要想在修改游戏中做到百战百胜是需要相当丰富的计算机知识的有很多计算机高手就是从玩游戏修改游戏中逐步对计算机产生浓厚的兴趣逐步成长起来的不要在羡慕别人能够做到的因为别人能够做的你也能够!我相信你们看了本教程后会对游戏有一个全新的认识呵呵因为我是个好老师(别拿鸡蛋砸我呀救命啊#¥%……*)
不过要想从修改游戏中学到知识增加自己的计算机水平可不能只是靠修改游戏呀!
要知道修改游戏只是一个验证你对你所了解的某些计算机知识的理解程度的场所只能给你一些发现问题解决问题的机会只能起到帮助你提高学习计算机的兴趣的作用而决不是学习计算机的捷径
一:什么叫外挂
现在的网络游戏多是基于Internet上客户/服务器模式服务端程序运行在游戏服务器上游戏的设计者在其中创造一个庞大的游戏空间各地的玩家可以通过运行客户端程序同时登录到游戏中简单地说网络游戏实际上就是由游戏开发商提供一个游戏环境而玩家们就是在这个环境中相对自由和开放地进行游戏操作那么既然在网络游戏中有了服务器这个概念我们以前传统的修改游戏方法就显得无能为力了记得我们在单机版的游戏中随心所欲地通过内存搜索来修改角色的各种属性这在网络游戏中就没有任何用处了因为我们在网络游戏中所扮演角色的各种属性及各种重要资料都存放在服务器上在我们自己机器上(客户端)只是显示角色的状态所以通过修改客户端内存里有关角色的各种属性是不切实际的那么是否我们就没有办法在网络游戏中达到我们修改的目的回答是"否"我们知道Internet客户/服务器模式的通讯一般采用TCP/IP通信协议数据交换是通过IP数据包的传输来实现的一般来说我们客户端向服务器发出某些请求比如移动战斗等指令都是通过封包的形式和服务器交换数据那么我们把本地发出消息称为SEND意思就是发送数据服务器收到我们SEND的消息后会按照既定的程序把有关的信息反馈给客户端比如移动的坐标战斗的类型那么我们把客户端收到服务器发来的有关消息称为RECV知道了这个道理接下来我们要做的工作就是分析客户端和服务器之间往来的数据(也就是封包)这样我们就可以提取到对我们有用的数据进行修改然后模拟服务器发给客户端或者模拟客户端发送给服务器这样就可以实现我们修改游戏的目的了
目前除了修改游戏封包来实现修改游戏的目的我们也可以修改客户端的有关程序来达到我们的要求我们知道目前各个服务器的运算能力是有限的特别在游戏中游戏服务器要计算游戏中所有玩家的状况几乎是不可能的所以有一些运算还是要依靠我们客户端来完成这样又给了我们修改游戏提供了一些便利比如我们可以通过将客户端程序脱壳来发现一些程序的判断分支通过跟踪调试我们可以把一些对我们不利的判断去掉以此来满足我们修改游戏的需求
在下几个章节中我们将给大家讲述封包的概念和修改跟踪客户端的有关知识大家准备好了吗
游戏数据格式和存储:
在进行我们的工作之前我们需要掌握一些关于计算机中储存数据方式的知识和游戏中储存数据的特点本章节是提供给菜鸟级的玩家看的如果你是高手就可以跳过了呵呵!
如果你想成为无坚不摧的酵那么这些东西就会花掉你一些时间;如果你只想作个江湖的游客的话那么这些东西了解与否无关紧要是作酵还是作游客你选择吧!
现在我们开始!首先你要知道游戏中储存数据的几种格式这几种格式是:字节(BYTE)字(WORD)和双字(DOUBLE
WORD)或者说是8位16位和32位储存方式字节也就是8位方式能储存0~255的数字;字或说是16位储存方式能储存0~65535的数;双字即32位方式能储存0~4294967295的数
为何要了解这些知识呢在游戏中各种参数的最大值是不同的有些可能100左右就够了比如金庸群侠传中的角色的等级随机遇敌个数等等而有些却需要大于255甚至大于65535象金庸群侠传中角色的金钱值可达到数百万所以在游戏中各种不同的数据的类型是不一样的在我们修改游戏时需要寻找准备修改的数据的封包在这种时候正确判断数据的类型是迅速找到正确地址的重要条件
在计算机中数据以字节为基本的储存单位每个字节被赋予一个编号以确定各自的位置这个编号我们就称为地址
在需要用到字或双字时计算机用连续的两个字节来组成一个字连续的两个字组成一个双字而一个字或双字的地址就是它们的低位字节的地址
现在我们常用的Windows9x操作系统中地址是用一个32位的二进制数表示的而在平时我们用到内存地址时总是用一个8位的16进制数来表示它
二进制和十六进制又是怎样一回事呢
简单说来二进制数就是一种只有0和1两个数码每满2则进一位的计数进位法同样16进制就是每满十六就进一位的计数进位法16进制有0--F十六个数字它为表示十到十五的数字采用了ABCDEF六个数字它们和十进制的对应关系是:A对应于10B对应于11C对应于12D对应于13E对应于14F对应于15而且16进制数和二进制数间有一个简单的对应关系那就是;四位二进制数相当于一位16进制数比如一个四位的二进制数1111就相当于16进制的F1010就相当于A
了解这些基础知识对修改游戏有着很大的帮助下面我就要谈到这个问题由于在计算机中数据是以二进制的方式储存的同时16进制数和二进制间的转换关系十分简单所以大部分的修改工具在显示计算机中的数据时会显示16进制的代码而且在你修改时也需要输入16进制的数字你清楚了吧
在游戏中看到的数据可都是十进制的在要寻找并修改参数的值时可以使用Windows提供的计算器来进行十进制和16进制的换算我们可以在开始菜单里的程序组中的附件中找到它
现在要了解的知识也差不多了!不过有个问题在游戏修改中是需要注意的在计算机中数据的储存方式一般是低位数储存在低位字节高位数储存在高位字节比如十进制数41715转换为16进制的数为A2F3但在计算机中这个数被存为F3A2
看了以上内容大家对数据的存贮和数据的对应关系都了解了吗好了接下来我们要告诉大家在游戏中封包到底是怎么一回事了来!大家把袖口卷起来让我们来干活吧!
二:什么是封包
怎么截获一个游戏的封包
怎么去检查游戏服务器的ip地址和端口号
Internet用户使用的各种信息服务其通讯的信息最终均可以归结为以IP包为单位的信息传送IP包除了包括要传送的数据信息外还包含有信息要发送到的目的IP地址信息发送的源IP地址以及一些相关的控制信息当一台路由器收到一个IP数据包时它将根据数据包中的目的IP地址项查找路由表根据查找的结果将此IP数据包送往对应端口下一台IP路由器收到此数据包后继续转发直至发到目的地路由器之间可以通过路由协议来进行路由信息的交换从而更新路由表
那么我们所关心的内容只是IP包中的数据信息我们可以使用许多监听网络的工具来截获客户端与服务器之间的交换数据下面就向你介绍其中的一种工具:WPE
WPE使用方法:
执行WPE会有下列几项功能可选择:
selectGAME
选择目前在记忆体中您想拦截的程式您只需双击该程式名称即可
TRACE
追踪功能用来追踪撷取程式送收的封包
WPE必须先完成点选欲追踪的程式名称才可以使用此项目
按下Play键开始撷取程式收送的封包
您可以随时按下||暂停追踪想继续时请再按下||
按下正方形可以停止撷取封包并且显示所有已撷取封包内容
若您没按下正方形停止键追踪的动作将依照OPTION里的设定值自动停止
如果您没有撷取到资料试试将OPTION里调整为WinsockVersion2
WPE及Trainers是设定在显示至少16bits颜色下才可执行
FILTER
过滤功能用来分析所撷取到的封包并且予以修改
SENDPACKET
送出封包功能能够让您送出假造的封包
TRAINERMAKER
制作修改器
OPTIONS
设定功能让您调整WPE的一些设定值
FILTER的详细教学
-当FILTER在启动状态时ON的按钮会呈现红色
-当您启动FILTER时您随时可以关闭这个视窗FILTER将会保留在原来的状态直到您再按一次on/off钮
-只有FILTER启用钮在OFF的状态下才可以勾选Filter前的方框来编辑修改
-当您想编辑某个Filter只要双击该Filter的名字即可
NORMALMODE:
范例:
当您在StreetFighterOnline〔快打旋风线上版〕游戏中您使用了两次火球而且击中了对方这时您会撷取到以下的封包:
SEND->0000081421060104
SEND->00000209870067FFA4AA112200000000
SEND->0000038411091109
SEND->00000A09C1100000FF5244
SEND->00000A09C1100000665244
您的第一个火球让对方减了16滴〔16=10h〕的生命值
而您观察到第4跟第5个封包的位置4有10h的值出现应该就是这里了
您观察10h前的0A09C1在两个封包中都没改变可见得这3个数值是发出火球的关键
因此您将0A09C1
10填在搜寻列〔SEARCH〕然后在修改列〔modify〕的位置4填上FF如此一来当您再度发出火球时FF会取代之前的10也就是攻击力为255的火球了!
ADVANCEDMODE:
范例:
当您在一个游戏中您不想要用真实姓名您想用修改过的假名传送给对方在您使用TRACE后您会发现有些封包里面有您的名字出现假设您的名字是Shadow换算成16进位则是〔53
6861646F77〕;而您打算用moon〔6D6F6F6E2020〕来取代他
1)SEND->0000081421060104
2)SEND->0000010699536861646F77000105
3)SEND->0000038411091109
4)SEND->00000A09C11000536861646F770011
5)SEND->00000A09C1100000665244
但是您仔细看您的名字在每个封包中并不是出现在相同的位置上
-在第2个封包里名字是出现在第4个位置上
-在第4个封包里名字是出现在第6个位置上
在这种情况下您就需要使用ADVANCEDMODE
-您在搜寻列〔SEARCH〕填上:536861646F77〔请务必从位置1开始填〕
-您想要从原来名字Shadow的第一个字母开始置换新名字因此您要选择从数值被发现的位置开始替代连续数值〔fromthepositionofthe
chainfound〕
-现在在修改列〔modify〕000的位置填上:6D6F6F6E2020〔此为相对应位置也就是从原来搜寻栏的+001位置开始递换〕
-如果您想从封包的第一个位置就修改数值请选择〔fromthebeginningofthepacket〕
了解一点TCP/IP协议常识的人都知道互联网是将信息数据打包之后再传送出去的每个数据包分为头部信息和数据信息两部分头部信息包括数据包的发送地址和到达地址等数据信息包括我们在游戏中相关操作的各项信息那么在做截获封包的过程之前我们先要知道游戏服务器的IP地址和端口号等各种信息实际上最简单的是看看我们游戏目录下是否有一个SERVER.INI的配置文件这个文件里你可以查看到个游戏服务器的IP地址比如金庸群侠传就是如此那么除了这个我们还可以在DOS下使用NETSTAT这个命令
NETSTAT命令的功能是显示网络连接路由表和网络接口信息可以让用户得知目前都有哪些网络连接正在运作或者你可以使用木马客星等工具来查看网络连接工具是很多的看你喜欢用哪一种了
NETSTAT命令的一般格式为:
NETSTAT[选项]
命令中各选项的含义如下:
-a显示所有socket包括正在监听的
-c每隔1秒就重新显示一遍直到用户中断它
-i显示所有网络接口的信息
-n以网络IP地址代替名称显示出网络连接情形
-r显示核心路由表格式同"route-e"
-t显示TCP协议的连接情况
-u显示UDP协议的连接情况
-v显示正在进行的工作
三:怎么来分析我们截获的封包
首先我们将WPE截获的封包保存为文本文件然后打开它这时会看到如下的数据(这里我们以金庸群侠传里PK店小二客户端发送的数据为例来讲解):
第一个文件:
SEND->0000E6560D227E6BE417131312131213671B
SEND->00101712DD341212121217120E1212129B
SEND->0000E6561EF1290617123B0E171A
SEND->0000E6561BC0681212125A
SEND->0000E65602C813C97E6BE417103527131212
SEND->0000E65617C912
第二个文件:
SEND->0000833368471B0E8172767677767776027E
SEND->00107277071C777777777277727777776D
SEND->000083337B944C6372775E6B72F3
SEND->000083337EA5217777773F
SEND->0000833367AD76CF1B0E8172755042767777
SEND->0000833372AC77
我们发现两次PK店小二的数据格式一样但是内容却不相同我们是PK的同一个NPC为什么会不同呢
原来金庸群侠传的封包是经过了加密运算才在网路上传输的那么我们面临的问题就是如何将密文解密成明文再分析了
因为一般的数据包加密都是异或运算所以这里先讲一下什么是异或
简单的说异或就是"相同为0不同为1"(这是针对二进制按位来讲的)举个例子0001和0010异或我们按位对比得到异或结果是0011计算的方法是:0001的第4位为00010的第4位为0它们相同则异或结果的第4位按照"相同为0不同为1"的原则得到00001的第3位为00010的第3位为0则异或结果的第3位得到00001的第2位为00010的第2位为1则异或结果的第2位得到10001的第1位为10010的第1位为0则异或结果的第1位得到1组合起来就是0011异或运算今后会遇到很多大家可以先熟悉熟悉熟练了对分析很有帮助的
下面我们继续看看上面的两个文件按照常理数据包的数据不会全部都有值的游戏开发时会预留一些字节空间来便于日后的扩充也就是说数据包里会存在一些"00"的字节观察上面的文件我们会发现文件一里很多"12"文件二里很多"77"那么这是不是代表我们说的"00"呢推理到这里我们就开始行动吧!
我们把文件一与"12"异或文件二与"77"异或当然用手算很费事我们使用"M2M1.0加密封包分析工具"来计算就方便多了得到下面的结果:
第一个文件:
1SEND->0000F4441F306C79F6050101000100017509
SEND->00100500CF260000000005001C00000089
2SEND->0000F4440CE33B130500291C0508
3SEND->0000F44409D27A00000048
4SEND->0000F44410DA01DB6C79F605022735010000
5SEND->0000F44405DB00
第二个文件:
1SEND->0000F4441F306C79F6050101000100017509
SEND->00100500706B000000000500050000001A
2SEND->0000F4440CE33B130500291C0584
3SEND->0000F44409D25600000048
4SEND->0000F44410DA01B86C79F605022735010000
5SEND->0000F44405DB00
哈这一下两个文件大部分都一样啦说明我们的推理是正确的上面就是我们需要的明文!
接下来就是搞清楚一些关键的字节所代表的含义这就需要截获大量的数据来分析
首先我们会发现每个数据包都是"F444"开头第3个字节是变化的但是变化很有规律我们来看看各个包的长度发现什么没有对了第3个字节就是包的长度!
通过截获大量的数据包我们判断第4个字节代表指令也就是说客户端告诉服务器进行的是什么操作例如向服务器请求战斗指令为"30"战斗中移动指令为"D4"等
接下来我们就需要分析一下上面第一个包"F4441F306C79F60501010001000175090500CF
260000000005001C000000
89"在这个包里包含什么信息呢应该有通知服务器你PK的哪个NPC吧我们就先来找找这个店小二的代码在什么地方
我们再PK一个小喽罗(就是大理客栈外的那个咯):
SEND->0000F4441F30D475F6050101000100017509
SEND->001005008A1900000000110002000000C0
我们根据常理分析游戏里的NPC种类虽然不会超过65535(FFFF)但开发时不会把自己限制在字的范围那样不利于游戏的扩充所以我们在双字里看看通过"店小二"和"小喽罗"两个包的对比我们把目标放在"6C
79F605"和"CF2600
00"上(对比一下很容易的但你不能太迟钝咯呵呵)我们再看看后面的包在后面的包里应该还会出现NPC的代码比如移动的包游戏允许观战服务器必然需要知道NPC的移动坐标再广播给观战的其他玩家在后面第4个包"SEND->
0000F44410DA01DB6C79F605022735010000"里我们又看到了"6C79F6
05"初步断定店小二的代码就是它了!
(这分析里边包含了很多工作的大家可以用WPE截下数据来自己分析分析)
第一个包的分析暂时就到这里(里面还有的信息我们暂时不需要完全清楚了)
我们看看第4个包"SEND->0000F44410DA01DB6C79F6050227350100
00"再截获PK黄狗的包(狗会出来2只哦)看看包的格式:
SEND->0000F4441ADA020B4B7DF605022735010000
SEND->0010EB03F805022736010000
根据上面的分析黄狗的代码为"4B7DF605"(100040011)不过两只黄狗服务器怎样分辨呢看看"EB03F8
05"(100140011)是上一个代码加上100000呵呵这样服务器就可以认出两只黄狗了我们再通过野外遇敌截获的数据包来证实果然如此
那么这个包的格式应该比较清楚了:第3个字节为包的长度"DA"为指令第5个字节为NPC个数从第7个字节开始的10个字节代表一个NPC的信息多一个NPC就多10个字节来表示
大家如果玩过网金必然知道随机遇敌有时会出现增援我们就利用游戏这个增援来让每次战斗都会出现增援的NPC吧
通过在战斗中出现增援截获的数据包我们会发现服务器端发送了这样一个包:
F44412E9EB03F80502000003000000000000
第5-第8个字节为增援NPC的代码(这里我们就简单的以黄狗的代码来举例)
那么我们就利用单机代理技术来同时欺骗客户端和服务器吧!
好了呼叫NPC的工作到这里算是完成了一小半接下来的事情怎样修改封包和发送封包我们下节继续讲解吧
四:怎么冒充"客户端"向"服务器"发我们需要的封包
这里我们需要使用一个工具它位于客户端和服务器端之间它的工作就是进行数据包的接收和转发这个工具我们称为代理
如果代理的工作单纯就是接收和转发的话这就毫无意义了但是请注意:所有的数据包都要通过它来传输这里的意义就重大了我们可以分析接收到的数据包或者直接转发或者修改后转发或者压住不转发甚至伪造我们需要的封包来发送
下面我们继续讲怎样来同时欺骗服务器和客户端也就是修改封包和伪造封包
通过我们上节的分析我们已经知道了打多个NPC的封包格式那么我们就动手吧!
首先我们要查找客户端发送的包找到战斗的特征就是请求战斗的第1个包我们找"F4441F30"这个特征这是不会改变的当然是要解密后来查找哦
找到后表示客户端在向服务器请求战斗我们不动这个包转发
继续向下查找这时需要查找的特征码不太好办我们先查找"DA"这是客户端发送NPC信息的数据包的指令那么可能其他包也有"DA"没关系我们看前3个字节有没有"F4
44"就行了找到后我们的工作就开始了!
我们确定要打的NPC数量这个数量不能很大原因在于网金的封包长度用一个字节表示那么一个包可以有255个字节我们上面分析过增加一个NPC要增加10个字节所以大家算算就知道打20个NPC比较合适
然后我们要把客户端原来的NPC代码分析计算出来因为增加的NPC代码要加上100000哦再把我们增加的NPC代码计算出来并且组合成新的封包注意代表包长度的字节要修改艾然后转发到服务器这一步在编写程序的时候要注意算法不要造成较大延迟
上面我们欺骗服务器端完成了欺骗客户端就简单了^-^
发送了上面的封包后我们根据新增NPC代码构造封包马上发给客户端格式就是"F44412E9NPC代码02000003000000
000000",把每个新增的NPC都构造这样一个包按顺序连在一起发送给客户端客户端也就被我们骗过了很简单吧
以后战斗中其他的事我们就不管了尽情地开打吧呵呵
上面讲的需要一定的编程基船但是不难即使你不会编程相信你继续看下去就会有收获了
四:怎么冒充"客户端"向"服务器"发我们需要的封包
这里我们需要使用一个工具它位于客户端和服务器端之间它的工作就是进行数据包的接收和转发这个工具我们称为代理
如果代理的工作单纯就是接收和转发的话这就毫无意义了但是请注意:所有的数据包都要通过它来传输这里的意义就重大了我们可以分析接收到的数据包或者直接转发或者修改后转发或者压住不转发甚至伪造我们需要的封包来发送
下面我们继续讲怎样来同时欺骗服务器和客户端也就是修改封包和伪造封包
通过我们上节的分析我们已经知道了打多个NPC的封包格式那么我们就动手吧!
首先我们要查找客户端发送的包找到战斗的特征就是请求战斗的第1个包我们找"F4441F30"这个特征这是不会改变的当然是要解密后来查找哦
找到后表示客户端在向服务器请求战斗我们不动这个包转发
继续向下查找这时需要查找的特征码不太好办我们先查找"DA"这是客户端发送NPC信息的数据包的指令那么可能其他包也有"DA"没关系我们看前3个字节有没有"F4
44"就行了找到后我们的工作就开始了!
我们确定要打的NPC数量这个数量不能很大原因在于网金的封包长度用一个字节表示那么一个包可以有255个字节我们上面分析过增加一个NPC要增加10个字节所以大家算算就知道打20个NPC比较合适
然后我们要把客户端原来的NPC代码分析计算出来因为增加的NPC代码要加上100000哦再把我们增加的NPC代码计算出来并且组合成新的封包注意代表包长度的字节要修改艾然后转发到服务器这一步在编写程序的时候要注意算法不要造成较大延迟
上面我们欺骗服务器端完成了欺骗客户端就简单了^-^
发送了上面的封包后我们根据新增NPC代码构造封包马上发给客户端格式就是"F44412E9NPC代码02000003000000
000000",把每个新增的NPC都构造这样一个包按顺序连在一起发送给客户端客户端也就被我们骗过了很简单吧
以后战斗中其他的事我们就不管了尽情地开打吧呵呵
教育 初中教育 计算机等级考试 司法考试 德语 专业英语 PETS
我 们 的 学 习 方式 以 会 员 制 为主 包 括 :一 年 期、二 年 期、 三 年 期、半 年 期、 VIP 金 卡。
报 名 期 间 内,不限 课 程,时 间,课 程 均 采 用 单 元 制,不 必 等候 开 课,而 且 若 无法 上 课 时 还 可以 保 留 课 程 喔!
现 因 庆 分 校 成 立,所 有 课程 均 6.5 ~8.5 折 优 惠。 试 听 时间 每 周 二 ,周 四 ,周六 晚 上 6:30。
北京 欧 卡 语 言 培训 中 心
热 线: 586083 93 58608 394 5 8608395 5860 8396
北京市 昌 平 区 东 小 口 镇立 汤 路 188 号 北 方明 珠 大厦 一 号 楼 九 层 901 室
上面讲的需要一定的编程基船但是不难即使你不会编程相信你继续看下去就会有收获了
五:怎么用计算机语言去写一个单机代理
在上一章我们已经对于代理的原理进行了讲解大家对于代理已经有了一个初步的认识现在我教大家如何用计算机语言编写一个自己的代理我们考虑到简单明了我们选用VB因为用VB编写代理只需要很少的代码
代码如下:
PrivateSubform_Load()
DaiLi.LocalPort="1234"
Server.RemotePort="1234"
Server.RemoteHost="211.100.20.26"
DaiLi.Listen
EndSub
PrivateSubDaiLi_ConnectionRequest(ByValrequestIDAsLong)
Server.Connect
内容太多写不下
我这有本教程挺不错和我联系我给你
- 小白
-
基础概念问题,
不会当然觉得难了