某游改数据
前
由于不可抗力原因(脸黑,上一个老婆池子又沉了,只得再等一年复刻池子,于是暗下决心一定要把老婆搞到手
本打算搭私服,日思夜想某游的结构,以为要把服务器地址解析到自家服务器上然后再在自家服务器上搭个相同的后端什么的
之前coc私服搭建即是用ucs一键搭载服务端,然后修改客户端机器的hosts文件把服务器地址解析到本地上,就可以本地跑私服了。
冥思苦想该如何搞到某游的后端…然后上网重浪了一下发现早有前人踩出了路…于是有了这篇水文
抓包
之前小金说过手机或者模拟器的抓包方法,好像是用的burp,我这里偷懒就直接用了python的mitmproxy
pip install mitmproxy
一键完成
windows用mitmdump,linux用mitmproxy,通用mitmweb(推荐
打开默认运行在8080端口上,手机上需要上mitm.it安装并信任证书,然后开代理连到监听服务器的监听端口上,就可以获取到手机或者模拟器的流量了
优点在于可以过tls加密,即拿到明文的交互内容。
然后我们在模拟器上开启游戏就可以拿到交互数据包了。
我们可以看到游戏交互的服务器域名,各个api接口。以及json传输的数据。
数据分析
可以看到,在经过了发送短信,ping,分发token,登录等等交互后,它以json格式发送了账号的游戏数据,包括了账号,好友,货币数量,充值货币数量,干员等等等等一系列数据
游戏客户端拿到数据后,显示为了我们看到的内容。github上有某游的解包数据,也有我们需要的对应干员的数据,我们只要将服务器传回来的json数据更改为我们需要的,即可在游戏中显示为我们所想要的干员了。
写一个简单的脚本运行在mitmweb上,即可完成游戏数据的修改。
更进一步
学到这个新姿势,打破了之前的想法。于是又回到了考虑搭建私服的事上
由于发现干员还有获得的时间戳等等数据存在,猜测服务器那边应该还有更多的检测机制判断玩家是否作弊以及数据的安全性,以及定时备份数据对比检查之类的(战斗结束的数据包还会发送ischeat这个字段形似某种加密,暂不清楚检测机制,类似加速封号的传言估计也在这个地方)
所以像是修改数据也仅是修改本地最好不会影响服务端为好
当然个人认为最简单的方式就是测试各个功能点的数据发包,写个简单的flask端把各个功能点全模仿出来就行了,然后要么解包修改服务器地址为flask运行机器地址,要么直接改hosts解析地址。
现有完成情况为模拟了一小半的功能点(能抽卡能战斗能换干员..),部分功能点读取的json格式略怪所以还是得转发到服务器上修改返回内容。理论上来说应该可以实现绝大部分的功能,而且似乎无解,无论数据在本地还是在服务器上,不能保证传输数据的加密性就无法保证数据的安全。
防止二次访问抓包(如fidder)的方法主要是加验证,譬如http://test.com/a.php?a=1&b=2传输1和2,则加一个验证key=md5(1+2)这个样子。
要么就是判断系统是否代理之类的方法阻止代理访问。
我更好奇的是steam验证码的算法(动态验证码,隔一段时间就会改变,即使离线也不影响本地和远端的验证码同步)相类似的有HOTP算法和TOTP算法,用动态密钥确认数据完整应该是大方向上不出现更好的加密传输算法下的,最好的方法了。