前些日子的几篇笔记,分享了如何快乐Ctrl+F9定位游戏功能Call,和处理游戏在这方面设置的障碍,有没有学废了呢? 然后.... 张三就开始快乐的测试功能Call了,嗯 正当张三同学最快乐的时候,客户端弹出了一个小窗口...第三方检测了..张三同学被封号了。 (PS:初次了解封包,最好先看完之前的三篇笔记) 上面的故事真是闻者伤心听者落泪啊,不管是重写发包函数还是线程发包,虽然技法巧妙 但是只要清楚原理 细细分析,总会有漏网之鱼。 所以龙门前不会只有这些困难,后面也是布防甚多.. 比如,功能Call的检测有什么变量检测 堆栈检测,恐怕是层层套娃 MV众多,解决起来更是烦躁无比啊!(欲扬先抑,先夸张一下) 那我们学废之前的技巧有啥子用罗?和上面那些花里胡哨的东西 中路对线? 当然不是,所谓黄河之水宜疏不宜堵,之前的三篇笔记都是铺垫 我们一开始的根本目的完全不是为了快乐的Ctrl+F9。 在揭晓谜底之前我们来观察一个珍贵无比的示例: 捕捉用户键盘消息——》技能相关的几个函数——》告诉服务器我要释放某某技能 一款网络游戏角色释放一个技能,大概就是上面这种流程。那比如我们找到了游戏的技能Call 调用它释放技能,会是什么样子? 会变成这样: 技能相关的几个函数——》告诉服务器我要释放某某技能 同学们,有没有看出来什么?哦,张三同学看出来了,同时它还有一个大胆的想法。 其实归根结底就是告诉服务器我干了啥,那我们能不能中间砍一刀 直接告诉服务我要释放啥啥技能,然后达到释放技能的目的? 当然可以,游戏实际上就是这样释放技能嘛,我们自然也可以这样做,以至于80%的功能 我们基本都能直接自己发送封包实现它。 哇哦!那这样做有什么具体的好处? 通过自己发包,试探变态功能这里就不讲了,我想FZ通常大家有一个很关心的点(小声:嘿~~兄弟gua稳吗?) 如果把游戏检测比作地雷,那么游戏代码游戏领空就是雷区,想调用游戏功能call免不了遇到有埋雷的情况,而就算是排雷老手也免不了会踩上几颗。所谓究极的排雷方法,就是不走雷区到目的地,你那有雷我绕着走不就是了么。 这里也是同样的道理,我们走自己的代码通过send()系统发包函数发送封包实现功能,这样就避开了游戏领空的地雷,所以只要是完美的封包FZ90%稳稳的很安心。 既然说到了“完美”二字,当然就有不那么完美的。毕竟自己发包实习功能,可不是说说就完成了。 让我们来观察一个珍贵无比的示例: 组包--》加密--》发包 游戏要发送一个封包,通常都要走这么一个流程。组包:把你做的坏事打包成小报告;加密:这是你和服务器的小秘密不能让别人知道;发包:把小报告邮寄给服务器。 明显的我们要想完美的达到目的主要有三大难点: 1. 分析封包 2. 寻找明文封包 3. 寻找加密函数 分析封包:客户端告诉服务端我释放了某某技能,总不可能写得汉字吧,所以我们需要分析封包,知道释放技能应该以什么形式描述。 找明文包:系统发包函数上下断确实可以获得封包内容,但是多半是加密的,而且加密的密钥可能随时会发生变化,加密后的内容基本就是一团乱码无从下手没法分析,所以我们得找到内容还未被加密的地方。 加密函数:我们找到明文包了,也分析了放什么技能该发什么包。但是服务器可是要被加密后的封包啊,直接发送一个明文过去 服务器不认事小,第三方就不好了。我们要学客户端,把明文包加密一下,当然 得按游戏的加密方式,那么我们就得找到游戏的加密函数。 找明文包
(一)理论 明文包的寻找是我们的首要任务,以此为跳板才能分析封包 和 定位 加密函数,如何寻找?不如再来欣赏一下这个珍贵无比的示例: 组包--》加密--》发包 我们可以观察到,从组包完成到加密的这段过程,封包内容是明文的未加密的。通过面对对象的编程原则,我们可以猜测这几个步骤在代码中的表现形式,就是几个对应的函数。 或者说组包完成后,封包数据会通过函数一层一层传递,函数怎么传递数据到另外一个函数?没错,当然是通过参数。那么我们是不是能够在发包处下断,使用传统手艺Ctrl+F9逐层返回所有经过的Call(函数),通过分析他们的参数内容,来找到明文的封包内容? 正确!不过在准备撸起袖子加油干之前,我们还有一个问题需要解决,我们怎么分辨出明文封包内容?要知道这些东西可不会写着I is 明文包,它们在内存之中的形式就是一串数字,而堆栈中所有函数的任何参数也都是一堆数字,怎么办? 想象一下你在茫茫人海中,光凭一个模糊的照片去寻找一个人,这该有多么困难~但是如果那个人的长相特立独行...比如头上长个角?再顶两只猫耳朵..是不是就简单多了?我相信眼尖的你肯定一眼就认出他了。 道理是一样的,那封包里面会不会有这种引起围观的奇异种?我想大多数游戏都是有的,也就是喊话功能 或者 说聊天功能,你想想看在游戏中你和队友聊天,客户端是不是一定需要发送一个装有聊天内容的封包给服务器,这样服务器才能更新到其他玩家的客户端上。我想大家应该都知道吧,实际上电脑只能储存数字...而字符是通过一张表把一些数字定义为字符,如图: 通过表图我们可以看到,字符 1 的对应数字是49,以十六进制表示 0x31。那么我们喊话一串“11111111111111”断下,它在封包内容里面就是一串 31 31 31 31 31 31.... Nice~ 纸上谈兵不如真刀真枪的干一架,请出我们的老伙计私服版的幻想神域2 带来一段珍贵无比的简单实例。
(二)实战 先在上面笔记说到的跳出线程发包代码段下断,可以当发包下断可以断到功能函数,当然我们并是要Ctrl+F9去找Call,而是返回上一层寻找未加密的封包内容。 喊话“1111111111”断下.
Nice~! 封包吃药成功~!(使用药水这几个字可不是我P上去的啊,游戏嗑药就这特性) 麻雀虽小,五脏俱全 ; 经历千辛万苦我们终于达成了目标!虽然只有一个简单的嗑药功能,但是这却是一个货真价实的封包FZ!!! 总结: 封包FZ也并不多神秘和神奇,只是省去了中间的过程,直接联系服务器。 优点: 不走游戏代码,相当于避开了所有的本地检测,极其稳定。 缺点: 需要做很多前期工作,实现麻烦、分析封包费时费力。 屈尊调用游戏功能函数“内存FZ”研究速度快,认真逆向分析封包内容“封包FZ”快乐而稳定!
|