好友
阅读权限10
听众
最后登录1970-1-1
|
这个游戏是所谓系列的一个游戏,全系列我看了下,逻辑基本上没有改变,so,看了这个教程,这个系列的游戏都应该可以自己修改这玩了;
taptap链接:https://www.taptap.com/app/157467
破解第一步,我们应该知道我们的目标apk是使用寿命引擎开发的,这个可以使用AndroidKiller的APK查壳工具或者按照经验判断;
作者就是按照自己的经验来判断,我们用压缩包打开apk,首先查看lib文件夹,没有发现lua相关的so库,可以排除cocos2d的可能
再观察assets\bin\Data\Managed目录,发现存在Assembly-CSharp.dll(不懂这个文件的可以在论坛搜索一下,一般游戏的主逻辑都写在这个文件里面的)文件,一般可以确定是unity3d开发的;
找到这个文件之后,一般情况下,单机游戏的Assembly-CSharp.dll都不会加密的,如果遇见加密的,可以参考chinamima大大的unity3d手游破解系列文章:
unity3d手游破解(一):https://www.52pojie.cn/thread-728205-1-1.html
unity3d手游破解(二):https://www.52pojie.cn/thread-729864-1-1.html
unity3d手游破解(三)--基于inline hook:https://www.52pojie.cn/thread-730806-1-1.html
在确定apk的壳之后,我们也稍微浏览一下其他的文件,虽然一般没有什么其他的东西,但是有时候就会给你个惊喜,比如说这个apk,我们在资源文件夹下面发现一个一般不存在的目录:JsonFile,里面的文件都是txt文件,打开一个一看,很明显,这些都是游戏的配置文件,结合游戏,career.txt就是游戏的初始化文件了:
里面参数或许我们看不懂,不过hp/mp什么的大家都知道是什么吧,其余的参数用谷歌翻译一下就大概明白了;
看到这个文件,初始化修改就算完成了,至于修改数值,都是看个人喜好了!
然后,我们使用dnSpy(工具在爱盘里面有,直接搜索dnSpy)加载Assembly-CSharp.dll,加载完成后如下面:
按照经验,这类游戏的主要玩法就是闯关以及扫荡,我们先搜索一下战斗fight,不想,却找到一个关键函数:public void AddGoods(int goodsID, int goodsNum),这种函数命名,一般都是增加物品或者金钱的函数,我们追踪一下到底是那些函数调用了它,一般就可以追踪到奖励结算关键函数
果然,找到了private void GameOverView(bool isEnemyDead, bool isPlayerDead)的函数,函数的主要功能是在战斗结束以后进行结算,看了下逻辑,主要是在闯关结束以后的结算逻辑;
我们依次往下看它的逻辑,逻辑主要分为4大部分,奖励值初始化、结果判断、奖励计算、结算奖励;
选取武侠点为大家讲解一下这个流程:
首先:奖励初始化 int num3 = 0;
结果判断:
判断位置:
这段代码的先判断战斗类型,如果类型为-2,就进入1V1的结算流程
死亡判断:
这段代码判断是否是敌人死亡,如果敌人没有死,里面有个关键点,num5 = -100 (就是扣100的声望)
奖励计算:num3 += UnityEngine.Random.Range(15, 25);
15-25之间随机一个整数赋值给num3;
结算奖励:UtilityFunc.ChangePointGoods(PointGoodsType.PointGoodsWXD, num3);
调用UtilityFunc.ChangePointGoods方法,参数1为奖励类型,参数2为奖励数量;
这样就完成了武侠点的奖励结算,其他的奖励都是如此计算,大同小异而已!!!
接下来,我们要寻找扫荡的关键函数了,在GameOverView函数里面,我们知道了玩家经验的结算方法是UtilityFunc.AddPlayerExp(int),我们继续追踪此方法,看看还有那些方法调用了此方法:
我们找到了两个方法调用了AddPlayerExp,按照方法名理解的话,GoodsByChapter()为章节奖励(闯关),GoodsByEnemy()为挑战敌人奖励;
我们选取GoodsByChapter查看,可以看出一下奖励计算公式:
int changeNum = UnityEngine.Random.Range(1, this.saoDangTimes / 3) + (int)Mathf.Sqrt((float)this.saoDangTimes);
int changeNum2 = UnityEngine.Random.Range(1, this.saoDangTimes / 3) + (int)Mathf.Sqrt((float)this.saoDangTimes);
UtilityFunc.ChangeGoods(46, changeNum2);
UtilityFunc.ChangeGoods(47, changeNum);
物品46与47的奖励计算公式为:(1-扫荡次数/3的随机整数)+扫荡次数的平方根取整
int num = 1;
num += 10 * role.level / 2;
num = num * this.saoDangTimes / 10;
UtilityFunc.AddPlayerExp(num);
玩家的经验奖励计算公式为:(1+10*(玩家等级/2))*(扫荡次数/10)
int num2 = 1;
num2 += role.level / 10;
num2 = num2 * this.saoDangTimes / 10;
UtilityFunc.ChangePointGoods(PointGoodsType.PointGoodsWXD, num2);
玩家的武侠点奖励计算公式为:(1+玩家等级/10)*(扫荡次数/10)
其他的计算公式大家自己研究吧,看完这些计算公式,我表示,肝不够,不修改怎么玩....
好吧今天的教程到此结束,明白了这些游戏逻辑,相信大家也应该可以破解该系列的其他游戏了;
放一下成品链接:https://www.52pojie.cn/thread-913123-1-2.html
最后:新人求罩,求打赏,免费的都不放过!!! |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|