医软号

热血三国辅助工具制作:从入门到功能脱机的全过程分享

十年之前,有个程序员,因为无聊,竟然把《热血三国》玩成了代码拆解之地,他所做的并非外挂,然而却比外挂更为硬核,直接揭开了Flash游戏的通讯协议,打造了一个半脱机客户端。这件事放到如今依旧值得思索:游戏辅助与深度学习的界限,究竟在哪里呢?

拆解三国先从看懂AMF下手

《热血三国》这款游戏全由Flash制作而成,其底层运用了Flex框架所用的方式,前后端交流依靠的是AMF协议这种模式。这和普通网页借助JSON的情况全然不同,AMF属于二进制格式,直接进行抓包所看到的全部都是乱码。

这位开发者察觉到,呈现给其的服务器返回状态为AMF0,然而客户端发送出去的时候却变成了AMF3,仅仅是弄明白这种对应关系,便足以令人大费周章。由于不存在现成的解析库,他尝试着自行编写解析器,结果却发觉工作量过于庞大,最终寻觅到FluorineFx开源组件来加以利用。

反编译和嗅探是两大命门

对于分析一个Flash游戏而言,SWFDecompiler属于必备工具,它可将编译好的SWF文件直接拆分成源代码,虽说变量名会变得混乱,不过逻辑脉络却是存在的。Notepad++能够在全目录中搜索关键词,相较于Windows自带的搜索要靠谱许多。

于网络的层面之上,运用科来以及SocketSniff这两者同时展开举措,其中一者去抓取大包以进行全局的过滤工作,另一者作为轻量级的工具去盯守单个会话,他自身另外还撰写了一个AMF半自动分析器,专门用于解析十六进制的数据,将二进制流拆解成为可以读取的参数结构。

九个步骤摸清一次协议调用

他自打开游戏起便开始卡位,于要执行的命令跟前停住,而后打开嗅探器,着手过滤gateway.php这个关键地址,在执行游戏里的操作之后,仅保留HTTP头带有application/x-amf的数据包。

在取得数据体之后,将其投放到自行编写的工具当中予以拆解,查看内里的参数到底是如何拼凑而成的,接着尝试运用相同的结构组装出一个请求发送回归原处,以此观察服务器是否予以认可,倘若认可了那么就算是摸索清楚了一个函数接口。这一整套流程并不依赖于游戏界面,全然是基于逆向工程的基础。

Flex消息体系就是三道门

《热血三国》的AMF通讯仅采用三种消息类型,CommandMessage用于登录前的握手,将session以及加密令牌谈妥当,RemotingMessage乃客户端发送指令所使用,全部操作皆被打包成此格式抛出去。

服务器回应的格式是AcknowledgeMessage,成功或者失败的情况都通过它,弄明白这三种消息的字段构成,那就如同拿到了服务器的门禁卡,不借助点击网页按钮,直接运用工具发送指令,服务器对于这种情况同样会全部接收。

半脱机界面只是个幌子

他所制作的工具,在登录之后,的确会嵌入一个游戏界面。然而,那层表面之下,全部充斥着以代码形式直接相连的内容其登录存在脱机与非脱机两种状态。非脱机状态仅仅是展示一下画面而已,而涉及内部处理的逻辑,完全呈现为脱机模式。

他把地图查询功能,在工具里重新实现了一回,又将资源操作功能,同样在工具里重新搞了一遍,还把将领派遣功能,也于工具里再度弄了一次。界面是供人观看用的,代码则是和服务器交流对话的真正关键所在。这可不单单是辅助脚本了,而是重新建造了一个开发版本的客户端。

开源组件降低了逆向门槛

十年之前,若想玩AMF协议,要么去啃Flex官方文档,要么反编译查看AS代码,这两条路都很慢。FluorineFx这套开源实现,将其从底层解析之中捞了出来,能直接借助现成库搭建自己的调用框架。

若于今儿回过头去瞧,眼下AMF的使用频次已然降低不少,不过往昔那种予以拆解的思路却并未过时。无论游戏更换何等模样的外壳,诸如协议分析、报文重放以及接口调用等,其底层逻辑历经几十年始终未曾改变。工具是会进行换代的,然而方法论却能够一直沿用。

在你玩网页游戏之际,可曾有过自己去编写一个辅助工具的想法?是被卡在了不懂得抓包这一环节上,抑或是没办法搞定协议方面的问题?欢迎于评论区去谈论一下你那折腾的经历,当你觉得这篇内容着实有用之时那就记得点赞并且分享。

热血三国辅助工具制作:从入门到功能脱机的全过程分享

admin
admin
这个人很神秘