开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 10263|回复: 14
收起左侧

[技术专题] H5游戏之易语言wss登录某某首富H5游戏之WebSockets初涉

[复制链接]
发表于 2022-5-1 14:29:19 | 显示全部楼层 |阅读模式   山东省济南市

不清楚是否发错版块,如果发错,请手下留情,能转下版块最好了。。。

前景

H5游戏可跨平台(PC、平板、手机、电视机等都可运行)
实际上他就是一个网页。。所以能打开网页的地方就可能能打开H5游戏(当然了,还有APP嵌套SDK+网页实现的那种)
几年前的农场**,不知道大家用过没有,那种只有一个界面就可以实现自动帮你玩游戏的软件,简直是一款神器。
所以我也想着针对这一款H5游戏,弄一款不用看游戏界面就可以自动帮你玩的小软件。
【备注:图中因为要调试很多信息,所以用到了F12中本地替换JS文件的做法,来打印各种信息等】

开始分析

从wss连接找到切入点

打开网页,登录帐号,打开F12开发者模式,进入游戏。
抓包页面能看到一个wss的连接地址和端口,消息中全部都是二进制数据
1.wss二进制截图.png

从启动器中,能看到第一个可能是发送登录游戏的函数在main.min.js的86844行
2.login函数.png

我们断点这个函数,刷新网页之后调试一番

分析sendCheckAccount

然后我们看到了如果已经连接wss的话,会执行sendCheckAccount函数
3.发现sendCheckAccount.png
3.找到sendCheckAccount.png

那我们去打断点,找到一个this.getBytes()
4.找到getBytes.png

getBytes

鼠标放在this.getBytes上,查看这个函数是什么
5.getBytes函数.png
e实际上是一个空白DataView,再

        var e = ObjectPool.pop(t.CLASSNAME);
        e.clear(),
        e.writeInt(t.DEFAULT_TAG),        //常量52462
        e.writeInt(0),
        e.writeShort(0),
        e.writeShort(t.DEFAULT_CRC_KEY),        //常量30301
        e.writeInt(this.pid++);                        //每次都会+1

我们再查看sendCheckAccount后续对i参数的操作

分析sendCheckAccount后续

        var i = this.getBytes();        //刚才已经看过了
        i.writeCmd(255, 1),
        i.writeInt(this._serverId),
        i.writeString(t),
        i.writeString(e),
        this.sendToServer(i),
        console.log("发送登录账号密码")

跳转一下writeCmd

    e.prototype.writeCmd = function (t, e) {
        this.writeByte(t),
        this.writeByte(e)
    },

再跳转看一下sendToServer函数

    t.prototype.sendToServer = function (t) {
        this.send(t),
        //省略一些//
    },

再看send

    t.prototype.send = function (e) {
        return this._socketStatus == t.STATUS_COMMUNICATION ? (this.sendPack(e), !0) : (console.log("发送数据时没和服务连接或者未进入通信状态"), !1)
    },

如果是链接状态,则sendPack(e)

    t.prototype.sendPack = function (e) {//e实际上 在易语言中就是字节集
        if (null == e || 0 == e.length)
            throw new egret.error("创建客户端数据包时数据不能为空!");
        var i = t.HEAD_SIZE;        //常量12
        e.position = 4,                        //设置位置是4
        e.writeInt(e.length - i);//写整数e.length - i
        var n = Encrypt.getCRC16ByPos(e, i);
        e.position = 8,                        //设置位置是8
        e.writeShort(n);                //写短整数n
        var o = Encrypt.getCRC16(e, i);
        e.position = 10;                //设置位置是10
        e.writeShort(o);                //写短整数o
        Encrypt.encode(e, 8, 4);
        this.socket_.writeBytes(e)        //发送给wss服务器e数据
    },

又发现两个新的函数Encrypt.getCRC16ByPos和Encrypt.getCRC16,分别跳转一下可发现(这个是CRC16校验吗?)
他俩都调用了CRC16.update,但是传参有所不同

    t.getCRC16ByPos = function (t, e, i) {
        return void 0 === e && (e = 0),
        void 0 === i && (i = 0),
        CRC16.update(t, e, i)
    },
    t.getCRC16 = function (t, e) {
        return void 0 === e && (e = 0),
        CRC16.update(t, 0, e)
    },

因为CRC16几乎都用到了,所以我们分析CRC16

var CRC16 = function () {
    function t() {}
    return t.update = function (e, i, n) {
        console.error('update的参数:',e,i,n);//手动添加的打印
        void 0 === i && (i = 0),
        void 0 === n && (n = 0);
        var o = 0,
        a = 0;
        0 == n && (n = e.length),
        e.position = i;
        for (var r = i; n > r; ++r)
            a = 255 & t.CRCBitReflect(e.readByte(), 8) ^ o >> 8 & 16777215, a &= 255, o = t.CRCTable[a] ^ o << 8 & 4294967040//,console.error('r',r,'a',a,'o的结果:',o);//手动添加的打印
                console.error('update的结果:',65535 & (0 ^ t.CRCBitReflect(o, 16)));//手动添加的打印
        return 65535 & (0 ^ t.CRCBitReflect(o, 16))
    },
    t.makeCRCTable = function () {
        for (var e = 0, i = new Array(256), n = 0; 256 > n; ++n) {
            e = n << 8 & 4294967040;
            for (var o = 0; 8 > o; ++o)
                e = 32768 & e ? e << 1 & 4294967294 ^ t.POLYNOMIAL : e << 1 & 4294967294;
            i[n] = e
        }
        return i
    },
    t.CRCBitReflect = function (e, i) {
                //console.error('CRCBitReflect的参数:',e,i);//手动添加的打印
        var n = 0,
        o = 0;
        i--;
        for (var a = 0; i >= a; ++a)
            o = i - a, 1 & e && (n |= 1 << o & t.DropBits[o]), e = e >> 1 & 2147483647;
                //console.error('CRCBitReflect的结果:',n);//手动添加的打印
        return n
    },
    t.POLYNOMIAL = 4129,
    t.CRCTable = t.makeCRCTable(),
    t.DropBits = [4294967295, 4294967294, 4294967292, 4294967288, 4294967280, 4294967264, 4294967232, 4294967168, 4294967040, 4294966784, 4294966272, 4294965248, 4294963200, 4294959104, 4294950912, 4294934528],
    t
}
();

CRC16.update一目了然,那么接下来,就可以实现用易语言模拟H5游戏的登录了吧

利用易语言实现模拟登录游戏

用到的模块

1、Buffer模块(有模块守护、用来读写DataView,某易论坛下载)
2、精易模块

先固定几个写死的函数

1、sendToServer(其实是sendPack)
2、this.getBytes
3、Encrypt.getCRC16ByPosEncrypt.getCRC16(也就是CRC16.update

JavaScript位运算符 易语言
^ 位异或
~ 位取反
& 位与
| 位或
<< 左移
>> 右移

易语言实现makeCRCTable

因为易语言的脚本组件好像不能传参字节集所以用js重写了CRCBitReflect,然后用脚本组件运行函数
6.易语言JS截图.png
7.构造update.png

Buffer实现getBytes、writeCmd、sendToServer等

用Buffer的设置偏移、写字节、写双精度浮点数、写文本、写短整数、写整数等方法构造函数
8.1.getBytes.png
8.1.2send.png
8.2.cmd.png

用e2ee的WebSocket客户端类,绑定事件并连接wss服务器

浏览器抓包那里,我们能看到服务器的域名和端口
9.1连接wss.png

登录之_检测账户-sendCheckAccount

这个一直有个问题,不清楚为什么要点3次才会收到服务器返回的数据
10.1发送请求.png

无法登录游戏,发现并没有这么简单

莫名其妙的发送了3次sendCheckAccount请求之后,易语言无法实现登录游戏。
继续步进调试浏览器才发现后面还有doRoleList(获取角色列表)、sendEnterGame(进入游戏)2个函数

同样的断点分析补上doRoleList、sendEnterGame

12.1sengentergame.png
11.0dorolelist.png

同理,断点分析私聊

13.1私聊.png

最终实现

1、用软件连接wss并登陆游戏并持续私聊某人
231825tbw5tvvvvioww282.gif

结尾

要想像当年的QQ农场那样全自动操作应该也是可以实现的
但是对于我这种小白来说...还是有点困难的

收工,睡觉,以后应该还会有相关H5游戏的小帖

补充

一直在想一个问题,服务器发送给客户端的信息是怎么判断哪一条是干嘛的,后续又对游戏断点才发现了一个函数processRecvPacket,可判断收到的信息是什么类型。
14.1收到私聊.png
这样问题就解决了,。可以根据processRecvPacket拿到的t和i判断收到的数据是什么类型的数据,然后再拿到不同的数据,再执行相应的操作即可
15.1收到私聊.png

实现发送私聊+接受私聊

理论上能实现所有手动能操作的操作。不清楚各位有没有什么更好的方法。


补充内容 (2022-5-11 17:40):
buff我就随便从论坛下载的啊:https://bbs.125.la/forum.php?mod=viewthread&tid=14652322

补充内容 (2022-5-11 17:59):
点评的人的帖子这个看起来差不多,https://bbs.125.la/forum.php?mod ... mp;highlight=Buffer

点评

wlp
这个buffer模块,怎么感觉和我写的好像,读文本 可以改成 读UTF8文本   广西壮族自治区贵港市  发表于 2022-5-1 17:05

评分

参与人数 1好评 +1 精币 +5 收起 理由
冰点 + 1 + 5 支持开源~!感谢分享

查看全部评分


签到天数: 6 天

发表于 2024-7-21 12:07:45 | 显示全部楼层   吉林省吉林市
11111111111111111111111111111111
回复 支持 反对

使用道具 举报

结帖率:96% (43/45)
发表于 2023-9-20 08:45:48 | 显示全部楼层   湖北省恩施土家族苗族自治州
不错  学习了   感谢分享
回复 支持 反对

使用道具 举报

结帖率:72% (13/18)

签到天数: 10 天

发表于 2022-7-6 14:55:34 | 显示全部楼层   江苏省苏州市
感觉和我写的flash游戏脱机写法流程类似
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 14 天

发表于 2022-5-13 09:53:48 | 显示全部楼层   广西壮族自治区桂林市

支持开源~!感谢分享
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2022-5-7 18:49:02 高大上手机用户 | 显示全部楼层   广东省深圳市
的工具互惠补补觉
回复 支持 反对

使用道具 举报

结帖率:87% (95/109)

签到天数: 11 天

发表于 2022-5-4 09:48:32 | 显示全部楼层   浙江省杭州市
模块呢没用模块说啥
回复 支持 反对

使用道具 举报

发表于 2022-5-4 09:35:46 | 显示全部楼层   湖南省永州市
简直是一款神器
回复 支持 反对

使用道具 举报

结帖率:93% (121/130)

签到天数: 15 天

发表于 2022-5-4 01:24:09 | 显示全部楼层   广东省广州市
分享下buffer模块
回复 支持 反对

使用道具 举报

结帖率:88% (22/25)
发表于 2022-5-3 17:16:54 | 显示全部楼层   江苏省宿迁市
楼主大大,给个Buffer模块,可以吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表