amf webgame

article/2025/9/13 18:44:30

一篇来自职业欠钱哥哥的东西,很有帮助。

这两年WebGame比较火,WebGame中,前端用Flash表现比较多,而服务器端依然是Web应用。

不少产品已经开始用AMF(Action Message Format)来取代标准的HTTP交互。(这里描述不严谨,因为AMF仍然是基于标准HTTP协议的,只不过用二进制的方式实现序列化和反序列化) 注1.

 

使用二进制方式实现序列化的好处是数据会得到很好的压缩(对比一下XML、JSON等方式),但缺点是可读性比较差。

我们不再敢奢望使用一个Sniffer从十六进制转换成ASCII码就可以清楚的了解发送了什么信息,获得了什么反馈了。

来看一下AMF协议数据抓包的前后模样吧:

上图是HTTP传输经过gzip压缩后的,直接用sniffer抓包后是没法直接阅读的。看看解压缩后的十六进制内容

可读性已经大大提升了,在FireBug或者是HTTP Watch里可以看到一部分字符串,外加很多乱码,因为二进制内容有很多超出可显示范围的字符。比如下面这个样子:

这时候,我们需要一个能够解析AMF协议的工具(或者是某些开发类库),来做这样的翻译工作。

@CFC4N 同学给我推荐了一款神兵利器——Charles 。

 

Charles 是一个HTTP代理服务器、,HTTP监视器、反转代理服务器。它允许一个开发者查看所有连接互联网的HTTP通信.这些包括request, response现HTTP headers (包含cookies与caching信息)。如果HTTP协议里包含了AMF数据,它会解析成人类看得懂的文本信息,并且允许你修改以后(下断点的情况)再发送,或者是简单的重放。

看看在Charles下数据的原貌吧。

一旦数据“明文化”,协议清晰了,安全问题也就随之而来了。

 

还 记得那句”一切输入都是有害的”吧。

现在我们只要在Charles中下好断点,在每个Request中,仔细端详每个参数,通过变量名猜测其含义和用途,修改值以后再送出。

就可以测试很多以前我们轻车熟路的攻击套路了。

 

以WebGame为例,我们可以做如下尝试:

1. 任务: 反复做/交任务、乱序做任务(之前已做过的、还没接到的)

与某个NPC对话/战斗,修改NPC的ID;修改任务ID乱序测试;重复提交任务完成信息;

2. 战斗: 攻击、治疗效果是本地提交

观察战斗过程中与服务器交互的数据,是否携带过程参数,如有,各种修改各种提交,超大值/负值/游戏里不存在的值/别人的值

3. avatar属性:提交 几率合成性质的结果、绕过CD时间/数量限制提交

几率性的内容往往也是现在游戏里价值最高的核心内容,一个脑残的“保存”设计可能就允许自己“随机”提交一个“几率性的结果”

4. 交易系统: 负值/临界值提交、出售/撤销他人物品、自定义价格

市场里明码标价的物品价格是否出现在购买请求封包中;挂售后取回的物品ID尝试修改为别人的物品ID看看;挂个价格为负数的物品自己买;挂售有最低价格限制?封包里想写多少我说了算;

5. 副本、日常: 绕过次数限制、绕过流程提交最终结果

游戏怕老玩家无聊,总会做一些每日都能进行的日常任务和副本,也往往有个次数限制,看看这个限制是不是纸老虎,抓了完成任务的数据包后重放就知道了;

6. 社交系统: 添加自己为好友、发布富文本信息(伪装系统发言的格式、颜色)、绕过CD限制发言/发信

只有系统公告和GM喊话才是彩色的?未必,在封包里把消息改为<font color=red>我是GM</font>看看;每次发言都要等待一段时间?看我封包的厉害

 

当然,也包括了现代小黑黑们最擅长的SQL注入、畸形数据(D.O.S)攻击。

上述所有的参数,都可以尝试修改为SQL注入语句,或者是十六进制不满足AMF规范协议的一个00,可能就会让服务端程序抛出一个异常,甚至直接crash掉。

 

从偷懒的心理来说,但凡是有了一丁点儿的封装,就必然有一定数量的程序员会认为:这一堆乱七八糟的东西普通用户是看不懂的,没人能够随便修改,所以我也就不必对它们做小心翼翼的处理了。

 

于是,越是表面上看起来复杂的东西,攻击起来的效果可能会更令人意想不到(在了解协议,将信息“明文化”,可自定义提交的场景中)。

 

最后,AMF也已经有了不少类库可以直接识别、书写了,

再加上Flash本身可以被SWF Decompiler之类的工具反编译(虽然看不到原始的代码,但基本的资源、变量名、AS脚本还是看的比较清楚的),那些做webgame脱机外挂的朋友应该是再熟悉不过了。

 

所以,基于Flash+AMF+Web后台的WebGame,应该还有很大的发挥空间。

 

参考资料:

1. 伟大的@CFC4N同学,还有当初没看过AMF协议硬生生从十六进制摸索出了协议规律的neptune同学

2. AMF  http://www.cnblogs.com/studyzy/archive/2008/04/09/1143685.html

 

注解1. 关于序列化和反序列化

我一直觉得那些专业的XX百科、XX WiKi,都是喜欢用专业术语解释专业术语,对小白用户来说,往往看2眼会更加不知所云。

不过我相信,亲自操作过Charles之后,会对这个概念理解的很形象的。

转载于:https://www.cnblogs.com/axyz/p/5663944.html


http://chatgpt.dhexx.cn/article/Ey6O2aiV.shtml

相关文章

webgame《天龙诀》完整网页游戏源码

webgame 天龙诀源码&#xff0c;网页端使用了Flash游戏引擎&#xff0c;服务端c开发&#xff0c;解压后488mb&#xff0c;仅供学习参考&#xff0c;请勿用于商业用途。 天龙诀剧情情节扣人心弦&#xff0c;让各位玩家身临其境&#xff0c;化身门派高手经历艰难险阻、感受受生死…

[转]用python来开发webgame服务端(4)

[刺鸟原创文章&#xff0c;转载请注明出处] 前面的工作都已准备就绪&#xff0c;现在我们得来看看服务端怎么和客户端之间进行通信了&#xff0c;Python和FLASH之间的通信&#xff0c;我整理为以下3种&#xff1a; 1、用现成的协议及类库处理&#xff0c;比如&#xff1a;py…

[转]用python来开发webgame服务端(2)

[刺鸟原创文章&#xff0c;转载请注明出处] 就在刚才&#xff0c;我们用基于python下的Twisted库写了一个简单的socket服务器&#xff0c;不知道它的性能和基本的承载到底如何呢&#xff1f;接下来&#xff0c;我们作一个简单的测试。 说是简单的测试&#xff0c;一点也不假…

转:: 刺鸟:用python来开发webgame服务端(1)

来源&#xff1a;http://ciniao.me/article.php?id9 --------------- 刺鸟原创文章&#xff0c;转载请注明出处 在开始之前&#xff0c;先简单描述一下项目的特点&#xff1a;我要实现的是一个mmorpg的webgame&#xff0c;地图上需要看到其他的玩家&#xff0c;战斗系统采用…

转:: 刺鸟:用python来开发webgame服务端(4)

来源&#xff1a;http://ciniao.me/article.php?id14 --------------- 刺鸟原创文章&#xff0c;转载请注明出处 前面的工作都已准备就绪&#xff0c;现在我们得来看看服务端怎么和客户端之间进行通信了&#xff0c;Python和FLASH之间的通信&#xff0c;我整理为以下3种&am…

[转]用python来开发webgame服务端(3)

[刺鸟原创文章&#xff0c;转载请注明出处] 在之前的准备工作中&#xff0c;我们已经建立了一个socket服务器&#xff0c;并且经过了简单的测试&#xff0c;得到的结论是python可以满足我们的需求&#xff0c;那么接下来&#xff0c;我们要解决的是身为webgame服务端必须的几个…

转:: 刺鸟:用python来开发webgame服务端(2)

来源&#xff1a;http://ciniao.me/article.php?id10 --------------- 刺鸟原创文章&#xff0c;转载请注明出处 就在刚才&#xff0c;我们用基于python下的Twisted库写了一个简单的socket服务器&#xff0c;不知道它的性能和基本的承载到底如何呢&#xff1f;接下来&#…

转:: 刺鸟:用python来开发webgame服务端(3)

来源&#xff1a;http://ciniao.me/article.php?id11 --------------- 刺鸟原创文章&#xff0c;转载请注明出处 在之前的准备工作中&#xff0c;我们已经建立了一个socket服务器&#xff0c;并且经过了简单的测试&#xff0c;得到的结论是python可以满足我们的需求&#x…

用python来开发webgame服务端(4)

http://ciniao.me/article.php?id14 前面的工作都已准备就绪&#xff0c;现在我们得来看看服务端怎么和客户端之间进行通信了&#xff0c;Python和FLASH之间的通信&#xff0c;我整理为以下3种&#xff1a; 1、用现成的协议及类库处理&#xff0c;比如&#xff1a;pyamf …

用python来开发webgame服务端(2)

http://ciniao.me/article.php?id10 刺鸟原创文章&#xff0c;转载请注明出处 就在刚才&#xff0c;我们用基于python下的Twisted库写了一个简单的socket服务器&#xff0c;不知道它的性能和基本的承载到底如何呢&#xff1f;接下来&#xff0c;我们作一个简单的测试。 …

用python来开发webgame服务端(3)

刺鸟原创文章&#xff0c;转载请注明出处 在之前的准备工作中&#xff0c;我们已经 建立了一个socket服务器 &#xff0c;并且经过了 简单的测试 &#xff0c;得到的结论是python可以满足我们的需求&#xff0c;那么接下来&#xff0c;我们要解决的是身为webgame服务端必须…

用python来开发webgame服务端

刺鸟原创文章&#xff0c;转载请注明出处 在开始之前&#xff0c;先简单描述一下项目的特点&#xff1a;我要实现的是一个mmorpg的webgame&#xff0c;地图上需要看到其他的玩家&#xff0c;战斗系统采用半回合制的模式&#xff0c;所谓的半回合制&#xff0c;即是&#xff1a;…

用python来开发webgame服务端(1)

http://ciniao.me/article.php?id9 刺鸟原创文章&#xff0c;转载请注明出处 在开始之前&#xff0c;先简单描述一下项目的特点&#xff1a;我要实现的是一个mmorpg的webgame&#xff0c;地图上需要看到其他的玩家&#xff0c;战斗系统采用半回合制的模式&#xff0c;所谓…

server: WebGame服务端架构分析

MMORPG服务器架构 一.摘要 1.网络游戏 MMORPG 整体服务器框架&#xff0c;包括早期,中期&#xff0c;当前的一些主流架构 2.网络游戏网络层,包括网络 协议 , IO 模型&#xff0c;网络框架&#xff0c;消息编码等。 3.网络游戏的 场景 管理, AI &#xff0c; 脚本 的应用等。 4.…

WebGame服务端架构分析(一)

做webgame也有段时间了,最近上线的游戏还处于起步阶段,第二个月收入突破100万了,跟市面上大的webgame比起来,根本不算什么,但有收入总比没有好,呵呵,以后还需更加努力。现在总结一下自己webgame的架构设计,总结的目的一方面是为了共享给网上的朋友,也希望网友给我提出…

Webgame服务端分布式架构设计

Webgame服务端分布式架构设计 ——By King 最近在设计实现Webgame服务端游戏架构&#xff0c;跟大家分享下。 以下对架构的几点说明&#xff1a; 1&#xff0e; DB&#xff1a;数据库层。使用MongoDB, 可以作分布式&#xff0c;按webgame的需求&#xff0c;基本应该是不需…

Vue3之获取DOM元素

简介 我们一般用ref函数来获取DOM元素 使用步骤 使用ref函数创建容器在需要获取的dom元素上写refdom元素保存在容器的value属性上 代码 <script setup> import {ref,onMounted} from "vue"const inputRef ref() onMounted(() > {console.log(inputRef…

vue中动态获取dom元素进行操作

这几天我远程面试了一家公司,期间问题我都回答上来了 但有一个问题我很纳闷 就是你说下vue中获取dom元素的方法吧 我说大体上俩中吧 1.vue中 ref的方法 给元素起一个ref名称 通过 this.$refs.ref名称获取 2.第二个无非是 原生dom操作了 document.getElement // document…

Vue笔记四:Vue获取DOM元素和组件元素的方法

文章目录 Vue获取组件元素ref获取组件元素 Vue获取组件元素 如果想使用哪个DOM元素&#xff0c;就给它加上ref属性&#xff0c;然后用$refs属性获取它的元素对象&#xff0c;示例如下&#xff1a; 全部代码&#xff1a; <!DOCTYPE html> <html><head><m…

Vue.js中$refs{}获取DOM元素

如果我们想获取DOM元素&#xff0c;一般使用js中的document.querySelector来获取这个dom节点&#xff0c;然后在获取元素的值&#xff0c;现在Vue提供给我们一种更便捷的方式来获取DOM元素-----$refs{} $refs{}----获取标签元素 说明&#xff1a;一个对象&#xff0c;持有注册…