WPE封包教程(新手级) 本文关键词:封包,新手,教程,WPE WPE封包教程(新手级) 本文简介:WPE封包教程(新手级)游戏数据格式和存储:在进行我们的工作之前,我们需要掌握一些关于计算机中储存数据方式的知识和游戏中储存数据的特点。本章节是提D5AKOM!`供给菜鸟级的玩家看的,如果你是高手就可以跳过了,如果,你想成为无坚不摧的剑客,那么,这些东西就会花掉你一些0w@~ynW[时间;如果 WPE封包教程(新手级) 本文内容: WPE封包教程(新手级) 游戏数据格式和存储: 在进行我们的工作之前,我们需要掌握一些关于计算机中储存数据方式的知识和游戏中储存数据的特点。本章节是提 D5AKOM!` 供给菜鸟级的玩家看的,如果你是高手就可以跳过了,如果,你想成为无坚不摧的剑客,那么,这些东西就会花掉你一些 0 w@~ynW[ 时间;如果,你只想作个江湖的游客的话,那么这些东西,了解与否无关紧要。是作剑客,还是作游客,你选择吧! 现在我们开始!首先,你要知道游戏中储存数据的几种格式,这几种格式是:字节(BYTE)、字(WORD)和双字(DOUBLEOmKT}D~ 4 WORD),或者说是8位、16位和32位储存方式。字节也就是8位方式能储存0~255的数字;字或说是16位储存方式能储存= 0~***的数;双字即32位方式能储存0~42***295的数。G]q6Ika 为何要了解这些知识呢?在游戏中各种参数的最大值是不同的,有些可能100左右就够了,比如,金庸群侠传中的角 oSy[/Y44a 色的等级、随机遇敌个数等等。而有些却需要大于255甚至大于***,象金庸群侠传中角色的金钱值可达到数百万。所以 UyK|KL,在游戏中各种不同的数据的类型是不一样的。在我们修改游戏时需要寻找准备修改的数据的封包,在这种时候,正确判 i~l0XjQbs 断数据的类型是迅速找到正确地址的重要条件。t ;y>q 在计算机中数据以字节为基本的储存单位,每个字节被赋予一个编号,以确定各自的位置。这个编号我们就称为地址 +J+]P\: })T_D\2M。CQ3;NY=o 在需要用到字或双字时,计算机用连续的两个字节来组成一个字,连续的两个字组成一个双字。而一个字或双字的地 =_Qt2 时我们用到内存地址时,总是用一个8位的16进制数来表示它。 1Qf5H!5vx (lEWnf=2二进制和十六进制又是怎样一回事呢?cWh Aj>?_Q u4+)lvt 简单说来,二进制数就是一种只有0和1两个数码,每满2则进一位的计数进位法。同样,16进制就是每满十六就进一 _ |H]X+| 位的计数进位法。16进制有0--F十六个数字,它为表示十到十五的数字采用了A、B、C、D、E、F六个数字,它们和十进制 0g`WRe 的对应关系是:A对应于10,B对应于11,C对应于12,D对应于13,E对应于14,F对应于15。而且,16进制数和二进制数间 VWbgusxJ 有一个简单的对应关系,那就是;四位二进制数相当于一位16进制数。比如,一个四位的二进制数1111就相当于16进制的 q([email protected]“kD F,1010就相当于A。NIV8 $.z 09C***44R 9TD=qEK 但是您仔细看,您的名字在每个封包中并不是出现在相同的位置上bAW;2 NB -在第2个封包里,名字是出现在第4个位置上-在第4个封包里,名字是出现在第6个位置上B!8]\D 在这种情况下,您就需要使用ADVANCEDMODE-您在搜寻列﹝SEARCH﹞填上:***F77﹝请务必从位置1开 Q2tGe~H 始填﹞-您想要从原来名字Shadow的第一个字母开始置换新名字,因此您要选择从数值被发现的位置开始替代连续数值﹝ Q)Ppx7) fromthepositionofthechainfound﹞。-现在,在修改列﹝MODIFY﹞000的位置填上:6D6F6F6E2020﹝此为 {yfG_J 相对应位置,也就是从原来搜寻栏的+001位置开始递换﹞-如果您想从封包的第一个位置就修改数值,请选择﹝fromthebu$5gGWVf beginningofthepacket﹞-R:1-0I$ 了解一点TCP/IP协议常识的人都知道,互联网是将信息数据打包之后再传送出去的。每个数据包分为头部信息和数据 SmtH2%yI 信息两部分。头部信息包括数据包的发送地址和到达地址等。数据信息包括我们在游戏中相关操作的各项信息。那么在做 c| p eRO. 截获封包的过程之前我们先要知道游戏服务器的IP地址和端口号等各种信息,实际上最简单的是看看我们游戏目录下,是 2{qzCoe 命令中各选项的含义如下:-a显示所有socket,包括正在监听的。-c每隔1秒就重新显示一遍,直到用户中断它。 ~[email protected]~fhu -i显示所有网络接口的信息。-n以网络IP地址代替名称,显示出网络连接情形。-r显示核心路由表,格式同“route- Hm4lR{A e“。-t显示TCP协议的连接情况。-u显示UDP协议的连接情况。-v显示正在进行的工作。 /T_tI R> 三:怎么来分析我们截获的封包?`ORDN|s6 首先我们将WPE截获的封包保存为文本文件,然后打开它,这时会看到如下的数据(这里我们以金庸群侠传里PK店小 (Yw ***C***SEND->0000F4440CE33B***C***SEND->0000F***D27A00V5A7w V3~ ***SEND->0000F***DA01DB6C79F***005SEND->0000F***DB00mV d9(s? 第二个文件:1SEND->0000F4441F306C79F6050***7509SEND->***B0000o= 8yp2vG ***0001A2SEND->0000F4440CE33B***C***SEND->0000F***D***O0Z vbFG ***SEND->0000F***DA01B86C79F***005SEND->[email protected],y Z 哈,这一下两个文件大部分都一样啦,说明我们的推理是正确的,上面就是我们需要的明文!_R8-Hj E 接下来就是搞清楚一些关键的字节所代表的含义,这就需要截获大量的数据来分析。jwE0000F4441F30D475F6050***?vk 吧。4ZSc 9e9 通过在战斗中出现增援截获的数据包,我们会发现服务器端发送了这样一个包:F***E9EB03F***QS\H[?M$ ***0第5-第8个字节为增援NPC的代码(这里我们就简单的以黄狗的代码来举例)。那么,我们就利用 Hj2E-RwG 单机代理技术来同时欺骗客户端和服务器吧!PqKbG“X c 我们确定要打的NPC数量。这个数量不能很大,原因在于网金的封包长度用一个字节表示,那么一个包可以有255个字 v]h^0WU 节,我们上面分析过,增加一个NPC要增加10个字节,所以大家算算就知道,打20个NPC比较合适。~v>3lEGn* 然后我们要把客户端原来的NPC代码分析计算出来,因为增加的NPC代码要加上***哦。再把我们增加的NPC代码计 KOhK#t>[email protected] 算出来,并且组合成新的封包,注意代表包长度的字节要修改啊,然后转发到服务器,这一步在编写程序的时候要注意算 q:cCk#ra 法,不要造成较大延迟。!UzUt=s!^H API函数。第一个参数是说明第二个参数的矩阵的维数的,第二个参数包含了响应事件,这个自己填充就可以,最后 K[i|OZWu 是这个结构的大小,非常简单,这是最简单的方法模拟键盘鼠标了,呵呵。注意,这个函数还有个替代函数:xkkW?[ ULONG_PTRdwExtraInfo //application-definedinformationb ZEyP W 这两个函数非常简单了,我想那些按键精灵就是用的这个吧。上面的是模拟键盘,下面的是模拟鼠标的。这个仅仅是 1f^4J~{ 模拟部分,要和游戏联系起来我们还需要找到游戏的窗口才行,或者包含快捷键,就象按键精灵的那个激活键一样,我们 7J@D})si 可以用GetWindow函数来枚举窗口,也可以用Findwindow函数来查找制定的窗口(注意,还有一个FindWindowEx), `+/xA\X] FindwindowEx可以找到窗口的子窗口,比如按钮,等什么东西。当游戏切换场景的时候我们可以用FindWindowEx来确定一n=NBkq%/! 些当前窗口的特征,从而判断是否还在这个场景,方法很多了,比如可以GetWindowInfo来确定一些东西,比如当查找不 `[b 首先我们要替换WinSock.DLL或者WinSock32.DLL,我们写的替换函数要和原来的函数一致才行,就是说它的函数输出 V2cLwQ 0 什么样的,我们也要输出什么样子的函数,而且参数,参数顺序都要一样才行,然后在我们的函数里面调用真正的 S,m)yh. WinSock32.DLL里面的函数就可以了。bR6.Xdt.n 首先:我们可以替换动态库到系统路径。);V6YE 其次:我们应用程序启动的时候可以加载原有的动态库,用这个函数LoadLibary然后定位函数入口用GetProcAddress,F(nkbt 函数获得每个真正Socket函数的入口地址。jXkz,]Iy 当游戏进行的时候它会调用我们的动态库,然后从我们的动态库中处理完毕后才跳转到真正动态库的函数地址,这样 NS @j`6/U 我们就可以在里面处理自己的数据了,应该是一切数据。呵呵,兴奋吧,拦截了数据包我们还要分析之后才能进行正确的 IlJ6Qk UWQ#h,x~vu 现在拦截API的教程到处都是,我就不列举了,我用的比较习惯的方法是根据输入节进行拦截的,这个方法可以用到 :2]++G 。:b t;[email protected] 网络游戏通讯模型初探 f[email protected] [文章导读]FyleK+D? 本文就将围绕三个主题来给大家讲述一下网络游戏的网络互连实现方法Bv-|#sdxm 序言 LF6PKS 网络游戏,作为游戏与网络有机结合的产物,把玩家带入了新的娱乐领域。网络游戏在中国开始发展至今也仅有3,4 h[eC i 年的历史,跟已经拥有几十年开发历史的单机游戏相比,网络游戏还是非常年轻的。当然,它的形成也是根据历史变化而 Vx 82CIC 产生的可以说没有互联网的兴起,也就没有网络游戏的诞生。作为新兴产物,网络游戏的开发对广大开发者来说更加神秘 Y=G9|7*lO ,对于一个未知领域,开发者可能更需要了解的是网络游戏与普通单机游戏有何区别,网络游戏如何将玩家们连接起来, >qE f991SZ 以及如何为玩家提供一个互动的娱乐环境。本文就将围绕这三个主题来给大家讲述一下网络游戏的网络互连实现方法。Q[PVkZ 网络游戏与单机游戏 I:| case其他玩家/NPC的移动消息: kx?Yin8K { Z|$DchC 根据服务器的反馈信息进行其他玩家或者NPC的移动处理; @R50M (@W } G^#>HE| break; SFd_k9 case新玩家加入游戏: aG^E^^Y { cI@qt> m2jts(stp } A1-,b.Ni break; } O5-GrR^yt break; Ovk=s,a)K . sV,Yz3EH1A 释放游戏数据; m8{8r>6* 离开游戏; _|I8+(~) }uM1$3I= 接收到用户登入信息; #) ~u YQ 分析用户名和密码是否符合; ,3_Sf? if(符合) vq(#Ih2 { T}^3Re`i 发送确认允许进入游戏消息给客户机; d“Zu10 把此玩家进入游戏的消息发布给场景中所有玩家; ?HPAX 把此玩家添加到服务器场景中; ! Ea >tQ| } *`“+J_ else \_,[email protected]]Q { gQ0,KYmI3_ 断开与客户机的连接;1}la )lC } ni{ V4A } J$yq#[email protected] Game() //游戏服务器循环部分 7OmT^jV2 { nktGO .KDTB d 等待场景中玩家的操作输入; !0?o3,of- . k\j[fk/K 接收到某玩家的移动输入或NPC的移动逻辑输入;YRV h[Bqg` //此处只以移动为例 o+{,>t 进行此玩家/NPC在地图场景是否可移动的逻辑判断; /gF)msUF if(可移动) wJ2cAX;“ { Z(|$[GZP[ 对此玩家/NPC进行服务器移动处理; BH {z]a 发送移动消息给客户机; G } ~*1>)P8]# else U AXp;W` 发送不可移动消息给客户机;b>p_w%d[[J } 1 jB0gNe Exit() //游戏服务=器结束 `Z,WKus { #1$4 除,并且把玩家的属性数据保存到服务器数据库中,如:经验值、等级、生命值等。 dY$nw 接下来让我们看看网络游戏的客户端。这时候,客户端不再像单机游戏一样,初始化数据后直接进入游戏,而是在与 W!ug^2“服务器创建连接,并且获得许可的前提下才进入游戏。除此之外,网络游戏的客户端游戏进程需要不断与服务器进行通讯 C\“C12n{ ,通过与服务器交换数据来确定当前游戏的状态,例如其他玩家的位置变化、物品掉落情况。同样,在离开游戏时,客户 k“[AV2UW1 端会向服务器告知此玩家用户离开,以便于服务器做出相应处理。 _^{RtP#= 以上用简单的伪代码给大家阐述了单机游戏与网络游戏的执行流程,大家应该可以清楚看出两者的差别,以及两者间相互 gF9GU5T: 的关系。我们可以换个角度考虑,网络游戏就是把单机游戏的逻辑运算部分搬移到游戏服务器中进行处理,然后把处理结 “(H%m9K 果(包括其他玩家数据)通过游戏服务器返回给连接的玩家。 S]RzB64 wVersionRequestedMAKEWORD(1,1);gs@^u#O if(WSAStartup(wVersionRequested,aO) if(sSocket==INVALID_SOCKET)B)-P#,} { 8wS9%+ Failed(“WinSocketCreateError!“); :~,akX$ }y2C/DyuAY| 这里需要说明,客户端和服务端所需要的Socket连接数量是不同的,客户端只需要一个Socket连接足以满足游戏的需
|