最近开发了一款AG自动软件,抛开界面绘制,登录等常规业务,核心就是基于websocket协议,按照规定的数据格式,向AG的服务器发送操作指令,获取返回数据,按照AG解密函数对返回数据进行解密,最后对解密后的明文数据进行后续的业务操作。
本文将会详细介绍加密解密过程。全文所有操作基于windows操作系统,浏览器为谷歌Chrome,开发语言为JavaScript,代码开发工具为vscode。主要分为以下几个步骤:
Chrome开发工具使用
协议源码分析
协议加密、解密分析
对关键函数,以及获取关键参数的API进行抽取
1.1 Chrome工具面板说明
我们的核心诉求,是基于编码,向服务器下达操作指令,对平常只能通过人工点击操作的行为进行流程分解,来达到自动化操作的目的。所有客户端与服务端的数据交互,必然会经过网络协议,向服务器发送数据,并解析服务器的返回数据,经过对返回数据的解析,再根据编码的逻辑判断,看是否需要执行下一个操作请求。有网页的客户端,直接就可以通过谷歌浏览器开发者工具network模块进行抓包解析,手机浏览器也一样可以通过Chrome远程协议,在电脑端抓包解析,app则通过抓包工具,例如fiddler,wireshark等,对手机网络请求进行拦截分析。本文主要讲解电脑端网页客户端与服务器交互,其他工具不进行赘述。
登陆游戏,打开Chrome调试工具,windows电脑快捷键F12,得到如下界面
对其中红框内常用到的几个模块简单说明一下,第一排的每个模块都可以用鼠标左键按住不动进行左右拖动,自定义显示顺序。
Network:当前页面所有网络相关的模块都显示在这里。
All:显示network模块的全部信息,网络请求,js资源,图片资源加载等等
XHR:显示所有htt请求,api调用相关的信息
WS:显示所有websocket相关的请求信息
Console:控制面板,通常在开发js,对开发过程中的数据内容进行调试输出
Source:当前网站的所有html,js,css等前端网站的资源信息,所有通过js加密解密的源码都在这个模块找
Elements:当前页面的html代码,主要是html布局,js逻辑处理,css样式三大块。
分析阶段主要使用Network模块。如果你不是在打开游戏的第一时间打开谷歌浏览器的开发者调试工具,会导致network模块内的请求信息没有抓全,如果需要全新的请求信息,开发者工具界面按快捷键Ctrl+R,强制刷新当前网页,重新获取所有请求。
1.2 操作命令定位 开发工具准备完毕,接下来需要判断常规的手动下单指令,是通过具体的哪一个js函数发出的。常规的增删改查都可以在network下的XHR查看,先定位到XHR页面,点击clear按钮,对当前页面的请求进行清空。单后切换到游戏网页,进行下单,得到如下页面
可以看到,都是flv,mp3等游戏影音资源的请求和加载,并没有相关操作请求的指令。可见关键函数不在这里。只能进入WS模块重新进行分析,websocket基本概念与操作自行百度。
打开WS模块,Ctrl+R,游戏加载完毕后,得到如下页面,相关信息已经在图片标注,需要说明的是,只有一个5000端口的链接,一直在与服务器进行交互,其他几个全部是5035端口,交互消息内容很少。
切换游戏界面,进入房间,发送下单指令,切回WS,发现多出了3个wss连接,消息内容同样是经过加密,切换游戏,不断进入其他房间,观察wss连接,进入每个房间都会重新建立三个wss连接,其中5030,和5075不变,5241这个端口随着房间不同,会有相应的变化。
经过上述步骤得到如下结论:
1: 游戏下单指令通过wss协议向服务器发送
2: 每个房间对应固定端口号
1.3 函数调用栈分析
回到WS模块最初界面,先从端口为5000的wss连接调用栈开始分析,函数调用栈结构如下:
在右下调用栈面板最底部,点击show more *** frames,显示左右,调用栈就是当前选择的wss连接具体执行了哪一些js方法,方法执行的时间顺序为从最下到最上依次执行。其中@符号后面的代表函数执行来源,VMxxx标识执行这个方法的js文件是在网页加载之后向服务器动态请求得到的js文件,有具体名字的则可以在开发者工具的source目录下找到源代码。
点开每一个VM***开头的动态文件,对比代码内容,就能够在network all模块下找到对应的执行js函数的js文件名。
从js文件命名可以看到带有版本号,游戏开发人员会定期更新关键代码的版本号进行迭代升级
将wss函数调用栈涉及到的所有js文件复制response里面的内容,进行格式化之后保存到本地,再根据调用栈涉及到的具体方法逐一分析。
根据调用栈内的函数方法名,从下往上,先从看到名字就能猜出方法内容的函数开始分析起,
7
到这里,关于分析ag wss协议,具体应该怎么开始着手,涉及到了Chrome浏览器的哪一些模块,基本都描述完毕。接下来就是源码分析,以及分析过程中如何使用Chrome debug 动态加载的js方法。