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

转<wbr><a href="http://www.sj17178.com/64012358.031725.aspx">http://www.sj17178.com/64012358.031725.aspx</a><wbr></wbr></wbr>
《热血三国》好像是比较热,玩的人也挺多的,年前一个朋友希望能让我写一个这个游戏的外挂,也出于无聊,所以去玩了一下,谁知道一玩就有点喜欢这个游戏了,当然玩归玩,东西还是要做地,当然还不能算得上是外挂,最多算是一个辅助工具。
三国,是一个全FLASH制作的网页游戏,使用Flex做架构,使用AMF协议做数据通讯。
首先针对一款FLASH网页游戏大家需要了解他的AMF协议调用模式,就三国而言,服务器返回的消息全为AMF0格式,客户端向服务器提交的是AMF3的格式。
刚开始分析这款游戏的时候想着自己建一个AMF协议解析器,但由于做出来的功能局限性比较大时间仓促,因此从网上找到了FluorineFx开源组件,要做好一款功能强大的网页游戏工具我自己觉得应该做到功能脱机,要能在工具中独立完成各种功能调用,做全点就相当于为游戏的客户端。
但做之前最头痛的问题就是分析协议调用参数及返回参数结构,在做这个工具前我对Flash Flex是一无所知,对AS的编写还只是停留在Flash 5的程度上并且已是近十年未用了。。。
为了方便使用了以下几种工具
SWFDecompiler 的SWF文件反编译工具
Flash网页游戏辅助工具制作简析
Notepad++ 文本编辑工具,主要用来整个目录查找指定文本(用WINDOWS的查找功能太让人失望了)
Flash网页游戏辅助工具制作简析
科来网络分析系统,用来获取网络通讯数据
Flash网页游戏辅助工具制作简析
SocketSniff ,相对科来系统更轻量级的网络监听工具,对于了解基本通讯流程更为方便
Flash网页游戏辅助工具制作简析
以上几种是通过网络能找到的实用工具,再加一自己做的一个AMF协议半自动分析器,主要功能是解析HEX DATA的AMF协议,及跟踪游戏AMF协议通讯过程,并简单解析体现,为更进一步分析调用过程提供参考。
Flash网页游戏辅助工具制作简析
一个AMF通讯过程的分析:
1. 打开网页游戏,并在你需要获取命令的功能前停止操作
2. 打开网络嗅探器,并执行嗅探,在此过程中最好能按IP、端口进行过滤
3. 执行所需要的命令,并等待命令执行返回
4. 停止网络嗅探
5. 去除无关网络通讯数据,AMF协议下必定会有一个业务处理的gateway,像三国的地址为:/server/amfphp/gateway.php,并且HTTP头部的内容格式为application/x-amf,因此只需要过滤相关gateway的通讯对话就可以
6. 获得通讯的HTTP数据体,并交分析工具进行协议解析
7. 查看协议参数结构,并偿试重构协议复本
8. 偿试将协议复本发送至服务器(请求协议)
9. 调试服务器反馈数据,调试完成后即为游戏的实际AMF协议函数
在三国中,使用三种Flex消息:CommandMessage、RemotingMessage、AcknowledgeMessage
CommandMessage 在游戏登录前向服务器发送请求,并返回session等安全信息
RemotingMessage 为客户端向服务器提交的消息格式
AcknowledgeMessage 服务器向客户端反馈的消息格式
目前工具的游戏界面
登录后主界面(可分脱机跟非脱机登录,下面为非脱机登录,其实只不过显示了一个游戏界面而已,里面的处理都是按脱机模式处理)
Flash网页游戏辅助工具制作简析
游戏辅助信息
Flash网页游戏辅助工具制作简析
地图查询工具
Flash网页游戏辅助工具制作简析
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
[回复]
解析出来是doLogin的命令
Flash网页游戏辅助工具制作简析<wbr></wbr>
<wbr></wbr>
[回复]
谢谢了楼主Pvistely,
0A 00 00 00 01 11
按理是个Ojbect但如何解析
<wbr></wbr>
<wbr></wbr>
[回复]
sendStr你或许可以去查下HTTP协议的说明,你可以用AMFSerializer.ToArray()方法获取字节序列。AMF编码都是UTF8格式的,这个在AMF解析器里已经帮你处理了。
<wbr></wbr>
可以用AMFSerializer做序列,因为AMFSerializer是派生于MemoryStream
<wbr></wbr>
[回复]
我遇到跟你一样的问题,
correlationId (String):
faultCode (String): AMFPHP_FILE_NOT_FOUND
faultDetail (String): /bloodwar/server/amfphp/core/shared/app/BasicActions.php on line 33
faultString (String): The class {amfphp} could not be found under the class path {/bloodwar/server/game/amfphp.php}
不知道你找到问题所在了吗?
望指教,谢
<wbr></wbr>
<wbr></wbr>
[回复]
<wbr><wbr><wbr>你是不是没有把Message中的关联ID填写正确,在AMF中消息是对称的</wbr></wbr></wbr>
下面是测试消息对称性的函数
AcknowledgeMessage TestReslutCmdMsg(SocketData pTagSocket,<wbr><span style="color: blue;">object</span><wbr>pRltMsg)</wbr></wbr>
{
<wbr><wbr><wbr>AcknowledgeMessage tmpAckMsg =<wbr><span style="color: blue;">null</span>;</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>AMFMessage tmpRvMsg = (AMFMessage)pRltMsg;</wbr></wbr></wbr>
<wbr><wbr><wbr><span style="color: blue;">if</span><wbr>(tmpRvMsg !=<wbr><span style="color: blue;">null</span><wbr>&amp;&amp;</wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>tmpRvMsg.Bodies.Count &gt; 0 &amp;&amp;</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>tmpRvMsg.Bodies[0].Content !=<wbr><span style="color: blue;">null</span><wbr>&amp;&amp;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>tmpRvMsg.Bodies[0].Content.GetType() ==<wbr><span style="color: blue;">typeof</span>(AcknowledgeMessage))</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>{</wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>tmpAckMsg = (AcknowledgeMessage)tmpRvMsg.Bodies[0].Content;</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><span style="color: blue;">if</span><wbr>(pTagSocket.RequestMessage !=<wbr><span style="color: blue;">null</span><wbr>&amp;&amp;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>pTagSocket.RequestMessage.Bodies.Count &gt; 0 &amp;&amp;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>pTagSocket.RequestMessage.Bodies[0].Content<wbr><span style="color: blue;">is</span><wbr><span style="color: rgb(43, 145, 175);">Array</span><wbr>&amp;&amp;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>((<span style="color: blue;">object</span>[])(pTagSocket.RequestMessage.Bodies[0].Content<wbr><span style="color: blue;">as</span><wbr><span style="color: rgb(43, 145, 175);">Array</span>))[0].GetType() ==<wbr><span style="color: blue;">typeof</span>(RemotingMessage))</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>{</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>RemotingMessage tmpCmdMsg = (RemotingMessage)((<span style="color: blue;">object</span>[])(pTagSocket.RequestMessage.Bodies[0].Content<wbr><span style="color: blue;">as</span><wbr><span style="color: rgb(43, 145, 175);">Array</span>))[0];</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color: blue;">if</span><wbr>(tmpAckMsg.correlationId != tmpCmdMsg.messageId)</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><span style="color: blue;">throw</span><wbr><span style="color: blue;">new</span><wbr><span style="color: rgb(43, 145, 175);">Exception</span>(<span style="color: rgb(163, 21, 21);">"AMF</span><span style="color: rgb(163, 21, 21);">反馈消息与请求不匹配!!"</span>);</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>}</wbr></wbr></wbr>
<wbr><wbr><wbr><span style="color: blue;">return</span><wbr>tmpAckMsg;</wbr></wbr></wbr></wbr>
}
<wbr></wbr>
[回复]
有不少还是用SOCKET进行交互,我这里只是一个AMF协议应用的游戏而已
<wbr></wbr>
[回复]
我用servicecapture抓包,发现里面的发送的数据跟flash发送的都一样,可是不知道为什么返回的数据却不对,而且cookie我也已经设置了,还有可能是什么地方的问题呢?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值