【XXXX】0.7.31版修改思路【二】(无敌+无限cost+全图放置+干员无敌)附0752成品
本帖最后由 我是大哥陈 于 2019-8-28 12:37 编辑上一篇:https://www.52pojie.cn/thread-954800-1-1.html
上一篇介绍了无限生命和无限cost的初次实现,但悲剧的是第二天就被封号了,这次来仔细搞一下。
*本篇是本人亲测安全运行7天且未被封号后放出的,请谨慎使用,如被封号后果自负哦。
2019.8.28
-更新0752版,去掉了无限生命,保留无敌、无限cost、全图放置、可重复放置干员。
-再次修改了无敌的判定为get_side,感谢@NewsJai 的帖子
2019.7.15
-修改了敌我判定逻辑,不再根据SP判断(看到大家反馈新本带SP的BOSS打不死),改为用get_isPlayerCharacter(感谢198楼老哥的提示),现在敌我判断应该正常了。
-关于倍攻倍防的问题,我暂时没找到好的修改方法,另一位兄弟的旧的倍攻倍防修改版加固了,没法比对,只能等他更新了。
2019.7.9
-发现居然还有人存活,那就更新一下最新版吧,去掉了无限生命,也就是漏怪的话基地会掉血,以降低封号概率。下载地址在最底部。
2019.5.16.
-第9天,官服已挂,谨慎下载。
2019.5.15.
-已更新0728的修改版成品,下载地址在底部。
1.无限生命
打开IDA,在get_lifePoint()上按X寻找调用该方法的地方,逐一分析
发现OnEnemyReachedExit这个函数在0x01A2DAD8处调用了get_lifePoint(),看起来像是个突破口,手动填补前后范围内的函数后进行分析:
意思很明确了,在敌人到达出口的时候,会获取当前的lifepoint,如果敌人不等于0,就获取敌人会降低多少lifepoint,然后相减,再调用set_lifePoint设置新的生命值,完成扣除生命的操作。
这里修改的思路也很简单,将:
00 10 46 E0 SUB R1, R6, R0
改成
06 10 A0 E1 MOV R1,R6
即直接把当前的lifepoint赋给新的生命值,不做相减操作。
进入游戏测试,发现敌人到达终点后同样不掉血,修改成功。
2.无限cost
同样,在IDA上逐个查看调用get_cost()的地方并手动解析,最后发现两处感兴趣的地方:名为get_readyToSpawn()和SpawnCharacterOrToken的函数调用了它,先看get_readyToSpawn:
这是一个bool型函数,返回的值应该就是判断每个干员的cost是否足够,不够的话会显示黑色,够的话才会高亮显示,所以改成一直返回1应该就好。直接暴力修改圈出来的两处,强行使其跳转:
修改前:
.text:0207171C10 00 00 BA BLT loc_2071764
.text:0207176405 00 A0 E1 MOV R0, R5
修改后:
text:0207171C 10 00 00 EA B loc_2071764
.text:0207176401 00 A0 E3 MOV R0, #1
再来看SpawnCharacterOrToken:
经过简单分析,应该是在放置干员的时候会作出判断,如果花费大于目前cost的话就放置失败,否则就放置成功,以R7是否等于0来判断,R7等于0的话就算放置成功。
于是作出修改,将0赋值给R7即可,将:
01 70 00 C3 MOVGT R7, #1
改成
00 70 A0 E3 MOV R7, #0
进入游戏后测试,发现即时cost不够也能放置干员,cost会正常扣除。
重要的是,账号已经安全运行5天,暂时未被封号!这也是我其实之前就做出来了,现在才发出来的原因。我们修改的宗旨安全第一嘛。
3.全图放置
在搜索过程中还发现很多名为checkbuildable的函数:
在IDA里逐个分析后,发现这些函数最后都指向同一个地址为0x205DA8C的不知名函数:
不管三七二十一,先改成直接返回1试试看再说:
将红圈处直接改为:
01 00 A0 E3 MOV R0, #1
进入游戏后发现。。。所有干员都能全地形放置了(飞龙骑脸怎么输):
同时还有一个意外发现,就是干员撤退或死亡后,重新放置的话卡片还在,也就是说可以重复放置干员:
敌人:
4.干员无敌
光是老家无敌也不行啊,我们没法愉快滴刷剿灭400杀,因为干员不是无敌的QvQ
这块比较麻烦,因为测试下来,所有人的扣血判定都是用的同一个函数,所以如果不区分敌我的话,所有人都会变成无敌。
而游戏里又没有区分敌我的判定,只能自己找出己方和敌方有哪些不同之处,再进行区分。
经过我两天的测试,参考了贴吧别人的拆包数据:https://tieba.baidu.com/p/6124319585
从移动速度、HP恢复、甚至是阻挡数量来判断,都无法作出区分,最后在maxSp,也就最大能量值上找到了突破口。
也就是说,敌人是没有能量的,而我方干员基本都是有能量条的(辣鸡干员除外),所以我们修改成有能量条的角色都无敌就行了。
无敌的判定有很多种,这里我从get_isUndeadable这个函数下手:
在IDA中找到该函数,发现只有一处SetHpInternal调用了了它:
分析结果:先获取get_isUndeadable的值,如果为0,则S16=0.0,否则S16=1.0。很明显,这里的S16就是血量,如果对象不是不死的,则血量改为0,如果对象是不死的,则将血量改为1。
修改思路:改为获取get_maxSp(),如果最大能量大于0,则将血量改为1,否则的话血量为0,这样就从能量上将敌我区分开来,有能量的人变为无敌,没能量的人除外。
修改后:
关于如何取得跳转地址的OPCODE,在上一篇已经作了介绍,这里就不细说了。
需要说明的是这里的给浮点寄存器S16赋值的时候,不像给通用寄存器赋值那么简单,其中0.0小数是存在函数尾部,并根据偏移量调用的:
而1.0这个小数可以直接用:
00 8A B7 EE VMOV.F32 S16, #1.0
原样复制OPCODE来实现。
最后进游戏测试,发现有能量的角色的HP只会将为1而不会死亡:
于是干员无敌就达成了,剿灭400杀达成!
但是还有个遗留问题,如果以后出现了有SP的敌人,那该敌人也会无敌,所以如果大家发现更好的突破口可以告诉我哈。
关于根据Cost来判断,我已经试过了,我也以为干员都是有cost的敌人没有,但是测试结果并不是这样。。。测试下来发现敌人的cost也是大于0的,区分不出来,阻挡数量也是如此。
5.关于加速
有人问游戏自带的2倍速太慢了能不能加速,实际是可以的,可以自行修改里面的timescale来达到修改倍速的效果,这个也是U3D自带的功能,具体可以百度U3D的相关文档。
而且游戏里其实有3倍速的选项,但是目前没开放,不知道什么原因。
但是通过抓包发现,每次战斗后都会上传战斗时间,其他的战斗数据都加密了不知道还上传了哪些,所以战斗时间如果太短的话很可能就直接被封号了,故没做修改。
最后附上成品so文件,so使用方法(官服和bilibili服通用):
手机:
Root用户可以直接替换data\data\com.hypergryph.arknights\libs下的同名文件即可。
非Root用户需要将该so放入APK中的lib\armeabi-v7a下替换原文件,再自己重新签名安装。
模拟器:
模拟器比较特殊,因为会用x86的运行库,所以需要自己改。
Root用户:手动打开原版apk,复制其中的lib\armeabi-v7a到data\data\com.hypergryph.arknights\libs下覆盖同名文件;再用该so替换。
非Root用户:手动打开原版apk,用该so替换其中的lib\armeabi-v7a,然后删除其中的lib\x86文件夹,重新签名安装。
顺便发个成品直装版APK:
官服版(已更新2019.5.14):
B服版:
2019.5.15更新0728版:
单独so文件:
官服:
B服:
2019.7.9更新0731版:
单独so文件:
官服:
B服:
单独so文件:
官服:
B服:
2019.8.28更新0752版:
单独so文件:
官服:
B服:
今天测试了一天,大概猜测必封的机制有两个:召唤石数量和基地血量。
1、每把结束以后,会保存代{过}{滤}理指挥数据,代{过}{滤}理指挥是有数据检测功能,所以布置的不好会报警,报警机制应该是计算敌人行进路线中无友方阻挡且不在我方攻击范围内,若这样的敌人个数超过基地血量就会报警,因此基地血量是一定不能修改数值上限的,楼主把基地血量改成无敌不掉血,理论上是没有问题,但可能后期服务器会通过捞取代{过}{滤}理指挥的数据从而判定你作弊。
2、召唤石上限是99个,正常的一局结束以后不,可能超过50个,所以剩余召唤石太多肯定是作弊。
3、目前来看,全图放置、干员无敌暂时不会被判定作弊。
4、如果以该修改版本玩,建议大家每把认真布置干员,当作正常游戏玩,保证基地掉血<10,召唤石<20,可以全图放置干员,隔十几秒就要让干员撤退和放入,新版本我这样玩了3天了,没有被封。
5、希望大佬能重新出个版本,修改功能就是:全图布置、召唤无CD,召唤干员费用1/2或1/3,这样应该不容易被封,且加强游戏趣味性。
再次感谢大佬的详细教学。 本帖最后由 JemmyloveJenny 于 2019-7-13 19:51 编辑
@我是大哥陈 给你一个区分敌人和干员的思路
干员都属于Torappu.Battle.Character,而敌人属于Torappu.Battle.Enemy
在C#里面只要用 variable is <Type> 判断一下就行了
我不太清楚il2cpp里面Class的结构,如果Class结构里面有Class的ID那可能还比较好判断
没有ID的话,不清楚直接调用特有方法能否判断,比如
```
void func(Entity *entity) {
if(Character$$get_data(entity) != NULL) {
DoSomething();
}
}
```
不知道这样能否区分敌友,也不知道运行会不会出问题 再次感谢大佬分享优秀作品,目前还没被封,谈下自己的建议,每次通关完成后,应该是会上传基地剩余血量和召唤石的数量,这两点一定不能改数值。建议将游戏修改成召唤石获取0CD,费用部署减半,干员任意部署位置,这样可以增加通关成功率,又不容易封号。 理智系统和源石能破就好了 大佬挖空心思为这个游戏做贡献,真是操碎了心又封了号,一举两得啊,在下佩服佩服 研究了一下,攻速是可以修改的,我方和敌方计算攻击间隔的函数都是Torappu.Battle.BattleFormula.CalculateAttackInterval(),稍微暴力一点改法就是直接让它返回0,这样攻速直接无限快。唯一缺陷就是此时敌人攻速也会加快,但凭借我方狙击干员的射程,可以让敌人在家门口出不来。以后可以尝试加入敌我判断。
修改前:
修改后: 已失效。请吾友别再下载附件了。会弹502 一楼!!!感谢大神分享 大神的意思是不是 如果前期放的太快 数值溢出就会被检测异常? 我按照你第一个文章修改。。不用第二天。下线再上线就被封了。 施工现场:$qqq 萌新近距离膜拜大神 马克一下,大佬刘辟 6666666666期待大哥成品 这是大佬{:1_893:} 感谢大神