从零开始制作游戏外挂

 一:什么叫外挂?

现在的网络游戏多是基于Internet上客户/服务器模式,服务端程序运行在游戏服务器上,游戏的设计者在其中创造一个庞大的游戏空间,各地的玩 家可以通过运行客户端程序同时登录到游戏中。简单地说,网络游戏实际上就是由游戏开发商提供一个游戏环境,而玩家们就是在这个环境中相对自由和开放地进行 游戏操作。那么既然在网络游戏中有了服务器这个概念,我们以前传统的修改游戏方法就显得无能为力了。记得我们在单机版的游戏中,随心所欲地通过内存搜索来 修改角色的各种属性,这在网络游戏中就没有任何用处了。因为我们在网络游戏中所扮演角色的各种属性及各种重要资料都存放在服务器上,在我们自己机器上(客 户端)只是显示角色的状态,所以通过修改客户端内存里有关角色的各种属性是不切实际的。那么是否我们就没有办法在网络游戏中达到我们修改的目的?回答是" 否"。我们知道Internet客户/服务器模式的通讯一般采用TCP/IP通信协议,数据交换是通过IP数据包的传输来实现的,一般来说我们客户端向服 务器发出某些请求,比如移动、战斗等指令都是通过封包的形式和服务器交换数据。那么我们把本地发出消息称为SEND,意思就是发送数据,服务器收到我们 SEND的消息后,会按照既定的程序把有关的信息反馈给客户端,比如,移动的坐标,战斗的类型。那么我们把客户端收到服务器发来的有关消息称为RECV。 知道了这个道理,接下来我们要做的工作就是分析客户端和服务器之间往来的数据(也就是封包),这样我们就可以提取到对我们有用的数据进行修改,然后模拟服 务器发给客户端,或者模拟客户端发送给服务器,这样就可以实现我们修改游戏的目的了。 目前除了修改游戏封包来实现修改游戏的目的,我们也可以修改客户端的有关程序来达到我们的要求。我们知道目前各个服务器的运算能力是有限的,特别在游戏 中,游戏服务器要计算游戏中所有玩家的状况几乎是不可能的,所以有一些运算还是要依靠我们客户端来完成,这样又给了我们修改游戏提供了一些便利。比如我们 可以通过将客户端程序脱壳来发现一些程序的判断分支,通过跟踪调试我们可以把一些对我们不利的判断去掉,以此来满足我们修改游戏的需求。 在下几个章节中,我们将给大家讲述封包的概念,和修改跟踪客户端的有关知识。大家准备好了吗?

 


二:什么是封包?

怎么截获一个游戏的封包? 怎么去检查游戏服务器的ip地址和端口号?

Internet用户使用的各种信息服务,其通讯的信息最终均可以归结为以IP包为单位的信息传送,IP包除了包括要传送的数据信息外,还包含有信 息要发送到的目的IP地址、信息发送的源IP地址、以及一些相关的控制信息。当一台路由器收到一个IP数据包时,它将根据数据包中的目的IP地址项查找路 由表,根据查找的结果将此IP数据包送往对应端口。下一台IP路由器收到此数据包后继续转发,直至发到目的地。路由器之间可以通过路由协议来进行路由信息 的交换,从而更新路由表。

那么我们所关心的内容只是IP包中的数据信息,我们可以使用许多监听网络的工具来截获客户端与服务器之间的交换数据,下面就向你介绍其中的一种工具:WPE。

WPE使用方法: 执行WPE会有下列几项功能可选择:

SELECT GAME 选择目前在记忆体中您想拦截的程式,您只需双击该程式名称即可。

TRACE 追踪功能。用来追踪撷取程式送收的封包。 WPE必须先完成点选欲追踪的程式名称,才可以使用此项目。 按下Play键开始撷取程式收送的封包。 您可以随时按下 | | 暂停追踪,想继续时请再按下 | | 。 按下正方形可以停止撷取封包并且显示所有已撷取封包内容。 若您没按下正方形停止键,追踪的动作将依照OPTION里的设定值自动停止。 如果您没有撷取到资料,试试将OPTION里调整为Winsock Version 2。 WPE 及 Trainers 是设定在显示至少16 bits 颜色下才可执行。

FILTER 过滤功能。用来分析所撷取到的封包,并且予以修改。

SEND PACKET 送出封包功能。能够让您送出假造的封包。

TRAINER MAKER 制作修改器。

OPTIONS 设定功能。让您调整WPE的一些设定值。

 


关于封包解密,加密 算法的一点东西


封包的解密加密,最简单的方法就是
异或 XOR 运算! 估计不是在服务器端,就是在客户端产生 私钥! 还有可能游戏一个共钥
2次加密一个私钥,要加密的私钥在去加密和解密数据!

 

就是说每次进入游戏的时候同样的操作都会产生不同数据!

比如说:
  你要对AAAAAAAAAAAAA 进行加密 你的密钥是this is hack
   
  加密后生成为 5)(2a(2a) "*5
而你产生的数据就!也就是说有些游戏为什么同样的数据都不一样
  如果你有耐心,可以在游戏中反复拦截send数据,因为你已经知道明文和密文

  明文 = 你发送的话
  密文 = 你拦截的数据风暴
  
  多比较,要是游戏采用共用的加密算法的话,就可以解开数据了

  如果知道明文 和 密文 ,那私钥就肯定能破解了

知道了加密的方式就可以把自己的数据随意的发送到服务器了!


常用的加密算法

Blowfish http://www.counterpane.com/blowfish.html
DES Data Encryption Standard http://csrc.nist.gov/fips/fips46-3.pdf
EncryptGost http://www.jetico.sci.fi/index.htm#/gost.htm
EncryptXOR http://tuath.pair.com/docs/xorencrypt.html
EncryptRC4 http://www.rsasecurity.com/rsalabs/faq/3-6-3.html
EncryptSkipJack http://csrc.nist.gov/encryption/skipjack-kea.htm
EncryptTEA TEA, A Tiny Encryption Algorithm http://www.cl.cam.ac.uk/Research/Papers/djw-rmn/djw-rmn-tea.html
Twofish http://www.counterpane.com/twofish.html


其他的还有什么凯撒加密什么。。。。在大学的时候都应该学的到

 

 

WPE实际经验和实例
1.虎卫版的破解 2.WPE系列教程之封包用法篇
3.WPE系列教程之刷钱封包制作资料篇 4.WPE系列教程之祝福油和幽灵手套篇
5.WPE系列教程之神秘封包制作篇 6.WPE系列教程之攻击代码篇


虽然好多外挂都被封了,可是现在回头看看,对我们的学习使用wpe还是有很大的帮助,以下的几篇文章都是实际的经验,而且里面的方法更是值得我们学习,如 何分析问题,如何查找关键数据,从何处入手,等等。这些文章都是从网站上抄来的,首先向他们的作者致歉,因为经过好多次的转载,有些作者都找不到了,因此 没有署名。下面让我们一起来看看:

虎卫版的破解

虎卫版更新了mir.dat文件,在我们进入游戏时会有一个验证身份的过程,类似答考卷。举个例子:服务器给mir.dat文件的试卷题目是“天王 盖地虎”然后虎卫的mir.dat答案是“宝塔镇蛇妖”,这样,服务器就知道了mir.dat是合法的。而半月看血的那个mir.dat文件并不知道正确 的答案是什么,只有硬着头皮随便说了个答案。所以它的身份很快就被揭穿了。最终的结果就是,我们被服务器踢出来了!

    现在,我们需要做的就是----欺骗服务器,让它认为半月看血的mir.dat文件是合法的。我们知道,软件WPE的主要功能之一就是更换发送给服务器的 数据包。只要在服务器没有收到半月看血的mir.dat文件提交的答案之前,利用WPE将答案修改成正确的,服务器就会认为半月看血的mir.dat文件 是合法的。这样,挥半月,全屏看血,一步起跑,超负重等功能就又可以实现了。

    下面就是具体的做法。(所需工具:WPE)

    准备工作:将patch这个文件改个名,这样可以避免服务器将半月版的mir.dat文件自动更新成虎卫版的(两个版本的mir.dat文件大小不一样),这样做的话进入游戏的时候会提示patch.exe程序不能使用,别管他,点OK就可以了。

    最关键的一步,是要知道合法的mir.dat文件所提交的试卷中的正确答案。在每次进入游戏前,我们需要做的是选择自己的游戏帐号在哪个服务器、选择人物 等等。这里的每次选择,都会向服务器发送相应的封包。虎卫版和半月版在进入游戏之前所进行的前几个步骤并没有太大的区别。在最后选择人物,点“开始”以后 就有区别了----使用半月看血的会被服务器踢出来。所以,我们可以初步认定,正是这一步在提交试卷。所以我们可以使用不同的mir.dat进入游戏,在 点开始之前用WPE截一下数据就可以知道正确的答案和错误的答案都是什么了。

    注意:在使用WPE之前最好先对这个软件进行一下设置,让它只截取我们发送给服务器的封包。这样的封包才是我们能够随意修改的。下面是我截取的数据

使用半月mir.dat

SEND-> 0000 23 35 3C 3C 3C 3C 3C 42 58 3C 3C 3C 3C 3C 3C 3C #5<<<<<BX<<<<<<<

SEND-> 0010 3C 3C 56 62 61 5D 57 63 5D 65 57 5F 3C 6C 49 6E <<Vba]Wc]eW_<lIn

SEND-> 0020 7B 47 7A 58 47 5A 6C 78 53 52 67 68 63 5B 21 {GzXGZlxSRghc[!

SEND-> 0000 23 36 46 5E 65 66 56 52 41 6A 5A 42 61 6A 48 3F #6F^efVRAjZBajH?

SEND-> 0010 3C 73 47 78 6B 75 6C 69 77 3F 6D 59 56 6A 6E 59 <sGxkuliw?mYVjnY

SEND-> 0020 78 6B 48 4F 4C 70 4A 3F 58 70 47 6F 44 6C 48 3F xkHOLpJ?XpGoDlH?

SEND-> 0030 40 6D 48 3F 3C 72 47 6F 3C 21 @mH?<rGo<!

SEND-> 0000 23 37 3C 3C 3C 3C 3C 4B 64 3F 3C 3C 3C 3C 3C 3C #7<<<<<Kd?<<<<<<

SEND-> 0010 3C 3C 21 <<!

SEND-> 0000 2A *

SEND-> 0000 23 38 3C 3C 3C 3C 3C 41 40 3C 3C 3C 3C 3C 3C 3C #8<<<<<A@<<<<<<<

SEND-> 0010 3C 3C 21 <<!

使用虎卫mir.dat

SEND-> 0000 23 34 3C 3C 3C 3C 3C 42 58 3C 3C 3C 3C 3C 3C 3C #4<<<<<BX<<<<<<<

SEND-> 0010 3C 3C 56 62 61 5D 57 63 5D 65 57 5F 3C 6C 49 6E <<Vba]Wc]eW_<lIn

SEND-> 0020 7B 47 7A 58 47 5A 6C 78 53 52 67 68 63 5B 21 {GzXGZlxSRghc[!

SEND-> 0000 23 35 46 5E 65 66 56 52 41 6A 5A 42 61 6A 48 3F #5F^efVRAjZBajH?

SEND-> 0010 3C 73 47 78 6B 75 6C 69 77 3F 6D 59 56 6A 6E 59 <sGxkuliw?mYVjnY

SEND-> 0020 78 6B 48 4F 4C 73 48 4F 40 6F 47 6F 44 6C 48 3F xkHOLsHO@oGoDlH?

SEND-> 0030 44 6C 49 4F 44 6E 47 6F 3C 21 DlIODnGo<!

SEND-> 0000 23 36 3C 3C 3C 3C 3C 4B 64 3F 3C 3C 3C 3C 3C 3C #6<<<<<Kd?<<<<<<

SEND-> 0010 3C 3C 21 <<!

SEND-> 0000 2A *

SEND-> 0000 23 37 3C 3C 3C 3C 3C 41 40 3C 3C 3C 3C 3C 3C 3C #7<<<<<A@<<<<<<<

SEND-> 0010 3C 3C 21 <<!

SEND-> 0000 2A *

SEND-> 0000 2A *

    可以看到,半月版截到了5组封包,虎卫版是7组。在这里我们大可不必理会数据的多少,对比的时候以半月版为准。虎卫版数据多的原因是因为我们已经正常进入 游戏了。多出来的数据可能是客户端告诉服务器自己已经正常进入了,这样服务器才会告诉客户端,他有什么物品,等级是多少……

    没得到我是神的指点前,我前半夜的时间就是浪费在这里了。

    再观察这些数据可以看到,每组数据大多以23开头,紧跟在后面的是3x(x代表0-9的数字),这些是数据包编号信息,可以不理会它。右边是这些16进制 数据对应的符号,我们对比右边的符号就能知道两个版本同一组包里面的信息有什么不同了。可以发现,两个版本所发送的第二组包差别最大。所以,这组数据成了 重点!

    那天,我利用WPE的滤镜功能,(教程里有滤镜的使用说明),把半月版的除了数据编号以外的所有信息写到了滤镜的正确值里,又把虎卫的信息写到了伪造值中,运行滤镜。满以为这次会成功,结果服务器照踢不误。在这里我又浪费掉了后半夜时间~~~~~~

    后来得到我是神的指点,才知道即使是用同一个ID,使用同一个版本的mir.dat文件登陆,所得到的第二组数据也会有所不同,个人认为那些不同的数据可 能和登陆的时间,服务器的状态有关。知道了这些,就可以把随机变化的不同部分排除掉。然后再对比两个版本截到的数据中其他部分,发现只有 SEND-> 0030这一行的第1-6个数值是不一样的。把半月版的这6个数值填到滤镜中的正确值里,再把虎卫版相同位置上的6个数值填到伪造值里就可以欺骗服务器 了。

    在使用滤镜的时候应该用它的“递进模式”,并且选上“自定位修改”,(这样设置后,WPE只要发现连续的这6个正确数值,就会连续的把这6个数值替换成为 伪造值)滤镜的“查找长度最大值”(我理解成在多长的一组包里查找相关数据)默认是40,可是我们知道我们要修改的那组数值所在的封包长度已经超过40个 字节了,所以我们可以将“查找长度最大值”设置成大于封包长度的值。(我是神设的是80,我自己设的是64)另外,当我们选上“递进模式”并且选上“自定 位修改”后,伪造值的范围变成了-124到+124,应该从000处开始填入伪造值才能使滤镜真正生效。

    好了,运行滤镜吧,试着使用半月版进入传奇,结果是----成功。到了这一步,我高兴的不得了,终于成功了!

    可是好景不长,休息了几个小时后这个滤镜竟然失效了。重新按前面的方法截获数据,发现和以前截获的数据不一样了。我倒,原来服务器考试还分A、B卷啊。于 是照改不误,多做了两个滤镜----这回彻底把服务器摆平了。(做成能够脱离WPE单独运行的封包后就可以给朋友用了)

    由于要将patch解决掉才能使用这个封包,没了自动更新的功能,换成其他区的用户登陆就会出现ID不存在的错误提示。好多朋友发表了解决这个问题的方 法,有手工修改mir.ini文件的、有用WIN2000做模拟FTP服务器的、还有用防火墙截住patch不让它自动更新的。个人认为在网吧使用以上方 法还是有点费事。

    我是在家里上网的,那个patch文件改名后进入游戏会出现“patch.exe程序不能使用”的提示,每次都要点“OK”,太罗嗦了。我把半月版的 mir.dat设成只读属*了,所以那个patch就没法把它更新成虎卫版了。不过,换其它区的ID登陆还是有问题。大家想想办法把这个问题彻底解决。

WPE系列教程之封包用法篇

    由于不同区不同服务器的的数据不同,一个封包要想在每个服务器都能使用是不可能的。这就需要我们对原有的封包进行修改。
    大家不必要一味的要这个封包,要那个封包,学会了修改封包,就能自己动手了. 大家在发封包之前,都会和NPC说话,然后进行搜寻,得到一批数据,就是16进制代码我们要做的是打开所要发送的封包,然后选择要发送的命令 如:Packet n 1,发送。现在一个封包命令就发出去了,这就是WPE的用法,我要说的是怎么修改,大家继续看:
    现在,我们双击左边的Packet n 1,会出来一条对话框,里面也有16进制代码我所需要做的是把第一排第3。4。5。6。4组数据修改成你刚才搜索的相应数据(注意:他的相应数据是在搜索的时候,左边带S符号的那几排数据)
    如果在搜索的时候,出现了许多带S符号的数据排,则证明,有地方出错,你退出传奇再进或者再次搜索一遍,一般只会出现2-3排的S,而其他带R的不用管他。你现在已经把其他服务器的封包改成你这个服务器能用的封包了。
    比如赌场封包,在1号房搜索并修改1号封包数据后发送,撒6到了7号房,再搜索并修改2号封包数据后发送,依次类推就可以到40号房间。注意,修改9号封 包也就是拿钱封包的时候必须等你出来与NPC对话出现成功字样的时候才能修改,如果你拿不到钱,你所修改的封包则无任何用处,所以要修改拿钱封包,必须你 先得拿到一次钱,但是如果成功了和NPC说话后立即开始修改,而且要一次成功,慢点都无所谓,想想修改步骤,否则你失败了再点NPC就会送你回去。
    那么,现在虽然赌场的封了,你们还可以去试试神秘商店或者未知暗殿的封包,一样能改好了。

WPE系列教程之刷钱封包制作资料篇

第一位23 表示 # 是 开头
第二位 是数据传递的id从0-9(ascii码)
第三四位是你放在物品篮的数据
后面不变的则为此物品的数据

请大家自己研究!

WPE系列教程之祝福油和幽灵手套篇

现在让你站在比奇的人给新人2捆随机(随机带多少,随便,看你自己了),4000gold
现在开始长征,我随机.......(此处省略若干过程),进比奇找老兵,给他4000到盟重!
在跑!跑到仓库旁边的客栈里面!找到林小姐......,切出传奇,现在使用封包

    打开wpe如果大家有找不到我说明里面点击的地方在那里的!请下载此版本对照.

    双击 SELECT 选择 mir.dat(现在你的传奇应该是打开的哦,别告诉我你关了)

    双击 trace 选择 开始,就是哪个箭头标志

    切回传奇 点林小姐

    切出传奇,停止截取,就是哪个方的按纽

    现在开始用脑袋,你应该可以看到你刚才打开wpe哪一大片空白的地方有数据了吧! 看看数据最前面,看到以S或者以R开头的小按纽了吗?现在找到以S开头的这样一段数据
xx xx yy yy yy yy oo xx xx xx xx xx xx xx xx xx
xx xx xx
ok,现在继续

    双击你看到的任意一个S或者R的小按纽,你会看到跳一个窗口出来,里面写了个数字,这个数字不固定,但是一般是 44 或者 56

    双击 SEND PACKET,看到<<封包列出>>下面的哪本打开的小书没有?,对了,点他选择祝福油AND幽灵手套封包,然后点<>右边的哪个垃圾箱

    双击 <<封包列出>> 下面的 packet n 1
    又开始用脑袋,你应该可以看到如下数据
xx xx zz zz zz zz oo xx xx xx xx xx xx xx xx xx
xx xx xx xx xx xx xx xx xx xx xx xx xx

现在继续

    把 zz zz zz zz 用yy yy yy yy替换掉!看清楚!为什么要替换掉!因为每个服务器的林小姐的代码是不一样的

   写完了点离开就可以可!现在把 packet n 1 点一下!你会发现 packet n 1 变蓝色了哦!对了,现在点哪个有3层的,有立体感的,画了个向右指的尖头的按纽,你会看到 <>,变成了1%,而且右边也有了个 packet n 1 ,ok,.你已经接近成功了!

    如果你用的我告诉你的哪个wpe版本的话,你可以看到在 <<开启插座我>> 右边有个数字,如果没有的话就不对!如果没有,重复第6 步.

    点击 阜 右边的那个 画了个黑色箭头的按纽,开始发送!现在切换回传奇,你就会看到一个对话框了!选择3,就是幽灵手套了!

    注意!在你没有退出整个传奇的情况下!你新人一走到!只需要执行第13步就可以了

    我们7个人!一个盟重,一个比奇,剩下的5个都在跑新人.............. 好累!如果还有人不会用的话!我就没有话说了

WPE系列教程之神秘封包制作篇

大家先到这里看看 (既然有现成的东西,何乐而不为,CC )

    再来说说我们现在玩的传奇。我这里就举个神秘商店的例子说明吧。

    1,进入传奇跑到兽人2F刘老头那
    2,打开WPE点选SELECT GAME双击MIR.DAT
    3,点选WPE上的TRACE按钮(此时出现一个3角的播放键和4方的停止键)点播放键开始截取数据
    4,立刻切换回传奇点击刘老头,出现对话框(刘老头对你说XXX很厉害的字样)后切换回WPE点4方型的停止键。

    这样我们就截取一组S和R数据(发给服务器点击刘老头和从服务器接收到的数据)
排除掉接收数据我们就会看到一组发送数据类下
23 3? ?? ?? ?? ?? 3F 4B 48 3F 3C 3C 3C 3C 3C 3C 3C 3C 21
(具体多少自己看了,都那个样)

    接着我们点选SEND PACKET按钮。打开(下载或者别人提供)进神秘的封包。查看刘老头的数据,抄下或者用截图程序截下。关闭SEND PACKET窗口。回到WPE主窗口点选FILTER按钮,(这里用NORMAL模式即可)把你自己截取到的刘老头的数据填入第一行然后开始对比自己截取 的数据与封包内的数据的差别。。。找到不同的数据就填入第2行相同位置。

比如: 位置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
原 数据 23 3? ?? ?? ?? ?? 3F 4B [48] 3F 3C 3C 3C 3C 3C 3C 3C 3C [21]
修改数据 23 3? ?? ?? ?? ?? 3F 4B [44] 3F 3C 3C 3C 3C 3C 3C 3C 3C [4C] ?? ?? ??

    这样你只需在第2行的第9位置填入44和19位置填入4C即可,如果修改数据长度超过原数据, 就把他当做不同数据在19位置后继续填入。但是在右边的封包长度框内必须自定义封包长度,不然FILTER只过滤1-19位置的数据。封包长度要看你修改 数据的长度了,大与修改数据长度也可以。

    如何实现全区通用---在传奇版本相同的情况下,各区封包是相同的。不同的只是位置代码而已,大家看一下上面的2排数据,第一位 23 是开始代码,第 2位是 31-39的数字,是数据编号,3-6位就是位置代码。在FILTER中把原数据行的3-6位清空不进行过滤,就能简单的实现全区通用。

    再检查一次看看有没有错误,如果可以的话按QUIT推出FILTER编辑框。回到FILTER控制窗口,勾上刚才修改的FILTER,启动FILTER(从左到右第5个按钮)进入传奇,点刘老头,如果正常的话刘老头会拿走你5000块钱跟你说起废话

    回到WPE的FILTER控制框保存刚才修改的FILTER为FLT文件

WPE系列教程之攻击代码篇

特殊修理:点普通修理,有时候(特别第一次点击)会出不来什么什么“正好有材料,价格是3倍什么什么的废话,你需要点返回再点修理到一直出来为止,基本上第2次就可以了。

    传奇出错:(个人想法)主要是封包长度问题。进行封包过滤的时候由于过滤封包长度要大于待过滤封包。导致传奇非法。出错。目前还没解决,希望高手们能多发发帖子。。。

    攻击方式:战士在传奇里攻击方式有空放3种(按住SHIFT打空),打怪4种(基本,攻杀,刺杀,烈火),攻击方向有8个,代码 3C,3D,3E,3F,41,42等。攻杀代码是64,刺杀是68,放出攻杀和刺杀是由客户机随即决定的。刺杀是有条件的(也是客户机根据条件决定 的)。所以只要对截取到的封包过滤攻击方式那一字节就可以放出。

 


三:怎么来分析我们截获的封包?

首先我们将WPE截获的封包保存为文本文件,然后打开它,这时会看到如下的数据(这里我们以金庸群侠传里PK店小二客户端发送的数据为例来讲解):

第一个文件: SEND-> 0000 E6 56 0D 22 7E 6B E4 17 13 13 12 13 12 13 67 1B SEND-> 0010 17 12 DD 34 12 12 12 12 17 12 0E 12 12 12 9B SEND-> 0000 E6 56 1E F1 29 06 17 12 3B 0E 17 1A SEND-> 0000 E6 56 1B C0 68 12 12 12 5A SEND-> 0000 E6 56 02 C8 13 C9 7E 6B E4 17 10 35 27 13 12 12 SEND-> 0000 E6 56 17 C9 12

第二个文件: SEND-> 0000 83 33 68 47 1B 0E 81 72 76 76 77 76 77 76 02 7E SEND-> 0010 72 77 07 1C 77 77 77 77 72 77 72 77 77 77 6D SEND-> 0000 83 33 7B 94 4C 63 72 77 5E 6B 72 F3 SEND-> 0000 83 33 7E A5 21 77 77 77 3F SEND-> 0000 83 33 67 AD 76 CF 1B 0E 81 72 75 50 42 76 77 77 SEND-> 0000 83 33 72 AC 77

我们发现两次PK店小二的数据格式一样,但是内容却不相同,我们是PK的同一个NPC,为什么会不同呢? 原来金庸群侠传的封包是经过了加密运算才在网路上传输的,那么我们面临的问题就是如何将密文解密成明文再分析了。

因为一般的数据包加密都是异或运算,所以这里先讲一下什么是异或。 简单的说,异或就是"相同为0,不同为1"(这是针对二进制按位来讲的),举个例子,0001和0010异或,我们按位对比,得到异或结果是0011,计 算的方法是:0001的第4位为0,0010的第4位为0,它们相同,则异或结果的第4位按照"相同为0,不同为1"的原则得到0,0001的第3位为 0,0010的第3位为0,则异或结果的第3位得到0,0001的第2位为0,0010的第2位为1,则异或结果的第2位得到1,0001的第1位为 1,0010的第1位为0,则异或结果的第1位得到1,组合起来就是0011。异或运算今后会遇到很多,大家可以先熟悉熟悉,熟练了对分析很有帮助的。

下面我们继续看看上面的两个文件,按照常理,数据包的数据不会全部都有值的,游戏开发时会预留一些字节空间来便于日后的扩充,也就是说数据包里会存 在一些"00"的字节,观察上面的文件,我们会发现文件一里很多"12",文件二里很多"77",那么这是不是代表我们说的"00"呢?推理到这里,我们 就开始行动吧!

我们把文件一与"12"异或,文件二与"77"异或,当然用手算很费事,我们使用"M2M 1.0 加密封包分析工具"来计算就方便多了。得到下面的结果:

第一个文件: 1 SEND-> 0000 F4 44 1F 30 6C 79 F6 05 01 01 00 01 00 01 75 09 SEND-> 0010 05 00 CF 26 00 00 00 00 05 00 1C 00 00 00 89 2 SEND-> 0000 F4 44 0C E3 3B 13 05 00 29 1C 05 08 3 SEND-> 0000 F4 44 09 D2 7A 00 00 00 48 4 SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00 5 SEND-> 0000 F4 44 05 DB 00

第二个文件: 1 SEND-> 0000 F4 44 1F 30 6C 79 F6 05 01 01 00 01 00 01 75 09 SEND-> 0010 05 00 70 6B 00 00 00 00 05 00 05 00 00 00 1A 2 SEND-> 0000 F4 44 0C E3 3B 13 05 00 29 1C 05 84 3 SEND-> 0000 F4 44 09 D2 56 00 00 00 48 4 SEND-> 0000 F4 44 10 DA 01 B8 6C 79 F6 05 02 27 35 01 00 00 5 SEND-> 0000 F4 44 05 DB 00

哈,这一下两个文件大部分都一样啦,说明我们的推理是正确的,上面就是我们需要的明文!

接下来就是搞清楚一些关键的字节所代表的含义,这就需要截获大量的数据来分析。

首先我们会发现每个数据包都是"F4 44"开头,第3个字节是变化的,但是变化很有规律。我们来看看各个包的长度,发现什么没有?对了,第3个字节就是包的长度! 通过截获大量的数据包,我们判断第4个字节代表指令,也就是说客户端告诉服务器进行的是什么操作。例如向服务器请求战斗指令为"30",战斗中移动指令 为"D4"等。 接下来,我们就需要分析一下上面第一个包"F4 44 1F 30 6C 79 F6 05 01 01 00 01 00 01 75 09 05 00 CF 26 00 00 00 00 05 00 1C 00 00 00 89",在这个包里包含什么信息呢?应该有通知服务器你PK的哪个NPC吧,我们就先来找找这个店小二的代码在什么地方。 我们再PK一个小喽罗(就是大理客栈外的那个咯): SEND-> 0000 F4 44 1F 30 D4 75 F6 05 01 01 00 01 00 01 75 09 SEND-> 0010 05 00 8A 19 00 00 00 00 11 00 02 00 00 00 C0 我们根据常理分析,游戏里的NPC种类虽然不会超过65535(FFFF),但开发时不会把自己限制在字的范围,那样不利于游戏的扩充,所以我们在双字里 看看。通过"店小二"和"小喽罗"两个包的对比,我们把目标放在"6C 79 F6 05"和"CF 26 00 00"上。(对比一下很容易的,但你不能太迟钝咯,呵呵)我们再看看后面的包,在后面的包里应该还会出现NPC的代码,比如移动的包,游戏允许观战,服务 器必然需要知道NPC的移动坐标,再广播给观战的其他玩家。在后面第4个包"SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00"里我们又看到了"6C 79 F6 05",初步断定店小二的代码就是它了! (这分析里边包含了很多工作的,大家可以用WPE截下数据来自己分析分析)

第一个包的分析暂时就到这里(里面还有的信息我们暂时不需要完全清楚了)

我们看看第4个包"SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00",再截获PK黄狗的包,(狗会出来2只哦)看看包的格式: SEND-> 0000 F4 44 1A DA 02 0B 4B 7D F6 05 02 27 35 01 00 00 SEND-> 0010 EB 03 F8 05 02 27 36 01 00 00

根据上面的分析,黄狗的代码为"4B 7D F6 05"(100040011),不过两只黄狗服务器怎样分辨呢?看看"EB 03 F8 05"(100140011),是上一个代码加上100000,呵呵,这样服务器就可以认出两只黄狗了。我们再通过野外遇敌截获的数据包来证实,果然如 此。

那么,这个包的格式应该比较清楚了:第3个字节为包的长度,"DA"为指令,第5个字节为NPC个数,从第7个字节开始的10个字节代表一个NPC的信息,多一个NPC就多10个字节来表示。

大家如果玩过网金,必然知道随机遇敌有时会出现增援,我们就利用游戏这个增援来让每次战斗都会出现增援的NPC吧。

通过在战斗中出现增援截获的数据包,我们会发现服务器端发送了这样一个包: F4 44 12 E9 EB 03 F8 05 02 00 00 03 00 00 00 00 00 00 第5-第8个字节为增援NPC的代码(这里我们就简单的以黄狗的代码来举例)。 那么,我们就利用单机代理技术来同时欺骗客户端和服务器吧!

好了,呼叫NPC的工作到这里算是完成了一小半,接下来的事情,怎样修改封包和发送封包,我们下节继续讲解吧。

 

 

进制的转换


进制的转换
十进制 二进制 八进制  十六进制
  0   0000   0     0
  1   0001   1     1
  2   0010   2     2
  3   0011   3     3
  4   0100   4     4
  5   0101   5     5
  6   0110   6     6
  7   0111   7     7
  8   1000   10    8
  9   1001   11    9
 10   1010   12    A
 11   1011   13    B
 12   1100   14    C
 13   1101   15    D
 14   1110   16    E
 15   1111   17    F

 


这里我只说十进制转换成任意进制数的方法:

十进制数转任意进制数方法是:十进制数整数转换成任意进制数用除基取余法,

十进制小数转换成任意进制小数用乘基取余法.

例:把十进制小数205.7转换成十六进制

整数部分:十进制数/16-------------十六进制数位系数=余数

205/16=12 --------------------- K0=13 K0=D

12/16=0 ----------------------- K1=12 K1=C

小数部分:十进制小数*16 --------- 十六进制小数的数位系数=乘积整数部分

0.7*16=11.2 ------------------- K-1=11 K-1=B

0.2*16=3.2 ---------------------- K-2=3 K-2=3

略 ---------------------------- 略

转换结果是:205.7约等于CD.B3H

 

 

位运算基础(菜鸟看的)(有点像课本)

 


&  按位与    |  按位或
 ∧  按位异或   ~  取反
 << 左移     >> 右移

 

说明:

1、 位运算符中除了~以外,均为二目运算符。
2、运算量只能是整型或字符型的数据,不能为实型数据。

一、“按位与”运算符:

规则:

参加运算的两个运算量,如果两个相应位都为1, 则该位结果值为1,否则为0。

例如: X=10001001 Y=11101110


     X & Y=10001000

按位与的特殊用途:

1、清零。

方法: 与一个各位都为零的数值相与,结果为零。


2、取一个数x中某些指定位。

方法: 找一个数,此数的各位是这样取值的:对应x数要取各位,该数对应位为1,其余位为零。此数与x相就可以得到x中的某些位。

例:设X=10101110

(1)取X的低4位


(2)取X的bit2、bit4、bit6位


二、“按位或”运算符

规则:

参加运算的两个运算量,如果两个相应位中有个为1,则该位结果值为1,否则为0。

例如 X=10001001 Y=11101110


X | Y=11101111

按位或的特殊用途: 常用来对一个数据的某些位置1。

方法:找一个数,此数的各位是这样取值的,对应x数要置1的位,该数对应位为1,其余位为零。此数与x相或就可使x中的某些位置1。

例:使 x=10100000 的低4位为1。


三、“异或”运算符

规则:参加运算的两个运算量,如果两个相应位为“异” (值不同),则该位结果值为1,否则为0。

例如 X=10001001 Y=11101110


    X^Y=01100111

异或运算的应用:

(1)使特定位翻转: 找一个数,此数的各位是这样取值的:对应x数要转的各位,该数对应位为1,其余位为零。此数与x相或即可。

例:x=10101110, 使x低4位翻转


(2)与0相异或,保留原值。 例、


四、“取反”运算符 ~

对一个二进制数按位取反,即将0变为1,1变为0。

例: 0100001110010111 取反 1011110001101000

注意:~运算符的优先级别比算术运算符、关系运算符、逻辑运符和其它运算符都高。

例:使一个数a的最低位为零,可以表示成:

   a & ~ 1

因为,~1=1111111111111110。

五、左移运算符《

将一个数的各二进制全部左移若干位。(左丢弃,右补0)

例:a=a<<2 将a的二进制数左移2位,右补0。

若左移时舍弃的高位不包含1,则数每左移一位,相当该数乘以2。

六、右移运算符》

将一个数的各二进制位全部右移若干位。(正数左补0/负数左补1,右丢弃)

例:a=a>>2 将a的二进制数右移2位。

将一操作数左移一位,相当于将其乘2。将一操作数右移一位,相当于将其除以2。
因此,可以用移位操作代替部分乘除操作,只要不产生溢出,这种代替是正确的。
(用CF标志判别无符号数运算是否溢出,CF=1,表示溢出。
 用OF标志判别有符号数运算是否溢出,OF=1,表示溢出)。

七、位运算符与赋值运算符结合,组成展的赋值运算符。

&=, 例:a&=b 相当于 a=a&b
|=, 例:a|=b 相当于 a=a|b
>>=, 例:a >>=b 相当于 a=a>>b
<<=, 例:a<<=b 相当于 a=a<<b
∧=, 例:a∧=b a = a∧b

 


如何写游戏外挂


1 游戏外挂的原理
外挂现在分为好多种,比如模拟键盘的,鼠标的,修改数据包的,还有修改本地内存的,但好像没有修改服务器内存的哦,呵呵!其实修改服务器也是有办法的,只是技术太高一般人没有办法入手而已!(比如请GM去夜总会,送礼,收黑钱等等办法都可以修改服务器数据,哈哈)
修改游戏无非是修改一下本地内存的数据,或者截获api函数等等,这里我把所能想到的方法都作一个介绍,希望大家能做出很好的外挂来使游戏厂商更好的完善 自己的技术.我见到一片文章是讲魔力宝贝的理论分析,写的不错,大概是那个样子.下来我就讲解一下技术方面的东西,以作引玉之用

 

2 技术分析部分
1 模拟键盘或鼠标的响应
我们一般使用
UINT SendInput(
UINT nInputs, // count of input events
LPINPUT pInputs, // array of input events
int cbSize // size of structure
);api函数
第一个参数是说明第二个参数的矩阵的维数的,第二个参数包含了响应事件,这个自己填充就可以,最后是这个结构的大小,非常简单,这是最简单的方法模拟键盘鼠标了,呵呵
注意:这个函数还有个替代函数:
VOID keybd_event(
BYTE bVk, // 虚拟键码
BYTE bScan, // 扫描码
DWORD dwFlags,
ULONG_PTR dwExtraInfo // 附加键状态
);和
VOID mouse_event(
DWORD dwFlags, // motion and click options
DWORD dx, // horizontal position or change
DWORD dy, // vertical position or change
DWORD dwData, // wheel movement
ULONG_PTR dwExtraInfo // application-defined information
);
这两个函数非常简单了,我想那些按键精灵就是用的这个吧,呵呵,上面的是模拟键盘,下面的是模拟鼠标的.
这个仅仅是模拟部分,要和游戏联系起来我们还需要找到游戏的窗口才行,或者包含快捷键,就象按键精灵的那个激活键一样,我们可以用GetWindow函数 来枚举窗口,也可以用Findwindow函数来查找制定的窗口(注意还有一个FindWindowEx),FindwindowEx可以找到窗口的子窗 口,比如按钮,等什么东西.当游戏切换场景的时候我们可以用FindWindowEx来确定一些当前窗口的特征,从而判断是否还在这个场景,方法很多了, 比如可以GetWindowInfo来确定一些东西,比如当查找不到某个按钮的时候就说明游戏场景已经切换了,等等办法.有的游戏没有控件在里面,这是对 图像做坐标变换的话,这种方法就要受到限制了.这就需要我们用别的办法来辅助分析了.
至于快捷键我们要用动态连接库实现了,里面要用到hook技术了,这个也非常简单,大家可能都会了,其实就是一个全局的hook对象然后 SetWindowHook就可以了,回调函数都是现成的,而且现在网上的例子多如牛毛,这个实现在外挂中已经很普遍了.如果还有谁不明白,那就去看看 msdn查找SetWindowHook就可以了.
这个动态连接库的作用很大,不要低估了哦,它可以切入所有的进程空间,也就是可以加载到所有的游戏里面哦,只要用对,你会发现很有用途的!
这个需要你复习一下win32编程的基础知识了,呵呵,赶快去看书吧!

2截获消息
有些游戏的响应机制比较简单,是基于消息的,或者用什么定时器的东西,这个时候你就可以用拦截消息来实现一些有趣的功能了.
我们拦截消息使用的也是hook技术,里面包括了键盘消息,鼠标消息,系统消息,日志等,别的对我们没有什么大的用处,我们只用拦截消息的回调函数就可以了,这个不会让我写例子吧,其实这个和上面的一样,都是用SetWindowHook来写的,看看就明白了很简单的.
至于拦截了以后做什么就是你的事情了,比如在每个定时器消息里面处理一些我们的数据判断,或者在定时器里面在模拟一次定时器,那么有些数据就会处理两次, 呵呵,后果嘛,不一定是好事情哦,呵呵,不过如果数据计算放在客户端的游戏就可以真的改变数据了,呵呵,试试看吧!用途还有很多,自己想也可以想出来的, 呵呵!

3拦截socket包
这个技术难度要比原来的高很多哦,要有思想准备.
首先我们要替换winSock.dll或者winsock32.dll,我们写的替换函数要和原来的函数一致才行,就是说它的函数输出什么样的,我们也要 输出什么样子的函数,而且参数,参数顺序都要一样才行,然后在我们的函数里面调用真正的winSock32.dll里面的函数就可以了
首先:我们可以替换动态库到系统路径
其次:我们应用程序启动的时候可以加载原有的动态库,用这个函数LoadLibary
然后定位函数入口用GetProcAddress函数获得每个真正socket函数的入口地址
当游戏进行的时候它会调用我们的动态库,然后从我们的动态库中处理完毕后才跳转到真正动态库的函数地址,这样我们就可以在里面处理自己的数据了,应该是一切数据.呵呵!
兴奋吧,拦截了数据包我们还要分析之后才能进行正确的应答,不要以为这样工作就完成了,呵呵!还早呢,等分析完毕以后我们还要仿真应答机制来和服务器通信,一个不小心就会被封号,呵呵,呜~~~~~~~~我就被封了好多啊!
分析数据才是工作量的来源呢,游戏每次升级有可能加密方式会有所改变,因此我们写外挂的人都是亡命之徒啊,被人娱乐了还不知道,呵呵!(声明我可没有赚钱,我是免费的)
socket源代码下载

4截获api
上面的技术如果可以灵活运用的话我们就不用截获api函数了,其实这种技术是一种补充技术.比如我们需要截获socket以外的函数作为我们的用途,我们就要用这个技术了,其实我们也可以用它直接拦截在socket中的函数,这样更直接.
现在拦截api的教程到处都是,我就不列举了,我用的比较习惯的方法是根据输入节进行拦截的,这个方法可以用到任何一种操作系统上,比如98/2000 等,有些方法不是跨平台的,我不建议使用.这个技术大家可以参考windows核心编程里面的545页开始的内容来学习,如果是98系统可以用 window系统奥秘那个最后一章来学习.
好了方法就是这么多了,看大家怎么运用了,其它的一些针对性的技巧这里我就不说了,要不然会有人杀了我的,呵呵!

记住每个游戏的修改方法都不一样,如果某个游戏数据处理全部在服务器端,那么你还是别写外挂了,呵呵,最多写个自动走路的外挂,哈哈!
数据分析的时候大家一定要注意,不要轻易尝试和服务器的连接,因为那有很危险,切忌!等你掌握了大量的数据分析结果以后,比较有把握了在试试,看看你的运气好不好,很有可能会成功的哦,呵呵!


下面给个VB例子吧。
自己加几个checkbox试试。
传说中的一个传奇的外挂
功能是让魔法像跟踪弹一样。
原理是让鼠标快速移动,让人名标签还在屏幕上。实际上只是改一下鼠标位置。
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long

Private Function MyHotKey(vKeyCode) As Boolean
MyHotKey = GetAsyncKeyState(vKeyCode) < 0
End Function
Private Sub Timer1_Timer()
Dim i As Integer
For i = 0 To 7
If MyHotKey(112 + i) And Check1(0).value = 1 Then
If Option1.value = True Then
SetCursorPos 0, 599
End If
If Option2.value = True Then
SetCursorPos 0, 767
End If
End If
Next i
End Sub

  • 6
    点赞
  • 2
    评论
  • 16
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 2 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

shijizhisheng

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值