Flash网页游戏辅助工具制作简析

热血三国》好像是比较热,玩的人也挺多的,年前一个朋友希望能让我写一个这个 游戏的外挂,也出于无聊,所以去玩了一下,谁知道一玩就有点喜欢这个游戏了,当然玩归玩,东西还是要做地,当然还不能算得上是外挂,最多算是一个辅助工具。
  
  三国,是一个全 Flash制作的网页游戏,使用Flex做架构,使用AMF协议做数据通讯。
  
  首先针对一款FLASH网页游戏大家需要了解他的AMF协议调用模式,就三国而言, 服务器返回的消息全为AMF0格式,客户端向服务器提交的是AMF3的格式。
  
  刚开始分析这款游戏的时候想着自己建一个AMF协议解析器,但由于做出来的功能局限性比较大时间仓促,因此从网上找到了FluorineFx开源组件,要做好一款功能强大的网页游戏工具我自己觉得应该做到功能脱机,要能在工具中独立完成各种功能调用,做全点就相当于为游戏的客户端。
  
  但做之前最头痛的问题就是分析协议调用参数及返回参数结构,在做这个工具前我对Flash Flex是一无所知,对AS的编写还只是停留在Flash 5的程度上并且已是近十年未用了。。。
  
  为了方便使用了以下几种工具
  
  SWFDecompiler的SWF文件反编译工具
   090219122864068.png
  Notepad++文本编辑工具,主要用来整个目录查找指定文本(用WINDOWS的查找功能太让人失望了)
   090219122864065.png
  科来 网络分析 系统,用来获取网络通讯数据
   090219122864062.png
  SocketSniff,相对科来系统更轻量级的网络监听工具,对于了解基本通讯流程更为方便
   090219122864067.png
  以上几种是通过网络能找到的实用工具,再加一自己做的一个AMF协议半自动分析器,主要功能是解析HEX DATA的AMF协议,及跟踪游戏AMF协议通讯过程,并简单解析体现,为更进一步分析调用过程提供参考。
   090219122864066.png
  一个AMF通讯过程的分析:
  
  1.打开网页游戏,并在你需要获取命令的功能前停止操作
  
  2.打开网络嗅探器,并执行嗅探,在此过程中最好能按IP、端口进行过滤
  
  3.执行所需要的命令,并等待命令执行返回
  
  4.停止网络嗅探
  
  5.去除无关网络通讯数据,AMF协议下必定会有一个业务处理的gateway,像三国的地址为:/server/amf PHP/gateway.php,并且HTTP头部的内容格式为application/x-amf,因此只需要过滤相关gateway的通讯对话就可以
  
  6.获得通讯的HTTP数据体,并交分析工具进行协议解析
  
  7.查看协议参数结构,并偿试重构协议复本
  
  8.偿试将协议复本发送至服务器(请求协议)
  
  9.调试服务器反馈数据,调试完成后即为游戏的实际AMF协议函数
  
  
  
  在三国中,使用三种Flex消息:CommandMessage、RemotingMessage、AcknowledgeMessage
  
  CommandMessage在游戏登录前向服务器发送请求,并返回session等 安全信息
  
  RemotingMessage为客户端向服务器提交的消息格式
  
  AcknowledgeMessage服务器向客户端反馈的消息格式
  
  
  
  目前工具的游戏界面
  
  登录后主界面(可分脱机跟非脱机登录,下面为非脱机登录,其实只不过显示了一个游戏界面而已,里面的处理都是按脱机模式处理)
   090219122864063.png
  游戏辅助信息
   090219122864061.png
  地图查询工具
   090219122864064.png 
   
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以前分享过摩尔庄园、奥比岛等发包例子,后来官方更改了加密手段,这次分享个赛尔号的发送数据例子 切勿用于非法用途,本贴只用于技术交流与学习 赛尔号通信数据的逆向分析与还原(思路篇) 0x01 前言 flash游戏即将淘汰,被称为最强的as加密方式Alchemy被应用于一些主流的页游,很多游戏都转战h5或者手游端。今天闲来没事,就上手一款童年游戏。"赛尔号",应该是全网首发吧 0x02 准备工具 FFDEC(强大的免费开源swf反编译工具) 、 Chrome浏览器 、在线Hex编辑 0x03分析过程 使用 浏览器加载游戏并 通过 开发工具抓取到数据包可以发现一个dll.xml的配置文件此游戏的习惯将核心数据存放于==TaomeeLibraryDLL.swf==文件当中。此时直接将swf文件拖入FFDec会发现,读取失败。需要拖入Hex编辑器搞一下==CWS== 是标识码 具体可以参考 Swf文件头信息,前面则是一些无关紧要的数据。可以看到在Client.swf里对于swf文件的加载是这样处理的 private function onComplete(e:Event) : void         {             var info:DLLInfo = this._dllList[0];             var byteArray:ByteArray = new ByteArray();             if(this._isRelease)             {                 this._stream.readBytes(new ByteArray(),0,7);//相当于设置了位置 前面可以看出到,标识码前面有7个字节是无用的数据 gt;gt;  this._stream.potion=7             }             this._stream.readBytes(byteArray);//             if(this._isRelease)             {                 byteArray.uncompress();//再进行Zlib解压处理             }             this._stream.close();//关闭字节流             //然后就加载             this._loader.loadBytes(byteArray,new LoaderContext(false,ApplicationDomain.currentDomain));         } 思路清晰,可以干代码,这里使用了易语言 导出文件 可以,再将其导入FFdec看看效果。解压后,开始找与通讯的类。一般搜索flash.net.Socke即可==send(param1, param2) #4CAF50==发送数据包的函数 public function send(param1:uint, param2:Array) : uint         {             var loc3_:* = null;             var loc4_:* = null;             if(this.connected)             {                 loc3_ = this.pack(this.userID,param1,param2);                 loc3_.position = 0;                 loc4_ = MessageEncrypt.encrypt(loc3_);//这里就开始加密了                 writeBytes(loc4_);//整个数据丢给                 flush();//这里就是发送数据出去了                 this.sendDataError(param1);                 DebugTrace.show("gt;gt;Socket[" + this.ip + ":" + this.port.toString() + "][cmdID:" + param1 + "]",getCmdLabel(param1),"[data length:" + this._sendBodyLen + "]");                 //这里可以清晰的看出 param1是数据包的命令码,param2为数据的整体                 retur

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值