本帖最后由 CrazyNut 于 2018-12-28 00:16 编辑
前言:
这款游戏是u3d的Mono打包方式
看的教程一般都是修改无限金币or修改资源类的
所以打算出一篇以开发游戏的思维修改游戏功能以达到 目的 的教程
如有错误的地方,还望各位表哥指出,以免误人子弟

准备工具:
Dnspy,Androidkiller,一款能打开apk的压缩工具
一点点的英语基础和一点点的语言基础
如果你有过Unity3d的开发经验,那这篇教程对你来说就再简单不过了
先看看最后的效果

开搞:
玩过游戏的就知道,游戏有两个操作按钮,前面有敌人就按攻击,没敌人按跳跃,按错了就会出现失误。
先说一下我最开始的破解逻辑:
找到两个操作按钮的按钮事件,把判断失误的地方改为另一个按钮的按钮事件【相当于如果你按错了,不执行错误流程,自动帮你按另一个键】
破解流程:
把Managed文件夹下所有dll拖进dnspy从中找到关键函数,修改代码以达到目的
而游戏的关键脚本通常都在Assembly-CSharp.dll中,所以通常我们只用关注这个dll里面的脚本就行

定位到关键代码并处理反编译后的坑:
把Managed文件夹下所有dll解压到同一个文件夹
然后把Assembly-CSharp和Assembly-CSharp-firstpass拖入dnspy
然后把Assembly-CSharp和Assembly-CSharp-firstpass拖入dnspy
定位到一个关键的playercontrol类。 【顺便吐槽一下作者一个类写了3k+行的代码,真的强,自己看着不头痛吗= =】
里面可以看到JumpButton和AttackButton两个方法可以确定为跳跃按钮和攻击按钮的按钮事件。
【至于怎么找到的。。以经验根据名字来判断】

【因为两个按钮事件内容几乎一样,我只截图了一个攻击按钮来进行分析】
可以看到图上并没有之前想的,在按钮事件中就进行了错误或者判断,而只是修改了一个状态的bool值,所以肯定有其他地方在进行判断。所以我们,右键isattack,分析,查看什么地方调用了然后进行的分析!

图上可以看到,除了按钮事件里面调用了这个值,
只剩下一个JudgePlayerMove的方法调用了这个状态,
那么这个方法肯定就是判断操作成功或者失败的方法了,
双击过去看看这个方法
我从代码里面找到了判断攻击按键的地方,如下图:

【因为判断内容几乎一样,我只截图了一个攻击按钮来进行分析】
有人就要问了,JudgePlayerMove这个方法是哪里调用的呢?

分析器分析一下可以看到,只在playercontrol类中的Update方法调用了这个方法
这里说明一下Unity中的Update方法是游戏每一帧运行的时候都会调用的方法,也可以理解为一个Timer或者说一个时钟
关键代码找到了,但是不急,先修复一下反编译后的坑
就算你什么都不修改,点编译的时候也出现了报错


可以看到Unity可以识别的特殊字符在Dnspy里面无法识别,我们需要自己修改一下这个变量

并处理好调用这个变量的地方
特殊字符串修改好之后又报错了

可以看到dnspy无法识别unity自带的Get_TimeScale方法 【具体原因未知】
Get_TimeScale这个方法呢是获取游戏运行速度倍率的
那我们只好自己写一个获取游戏运行速度倍率的方法给他填回去,如下图


点编译 OK 没问题了,可以开始修改之前找到的代码了
回到判断攻击状态的地方进行修改,修改后如下
【忘了可以看看上面图上的注释】

顺便把判断跳跃状态的地方改了

现在已经实现了:你乱按攻击或者跳跃键都可以疯狂的向前冲,不会出现失误,现在我们需要加上自动
之前已经说过了Update这个方法是游戏运行的每一帧调用的,而Update里面调用了JudgePlayerMove,那么也是每一 帧都在调用的了
所以我们只需要在JudgePlayerMove这个方法里面调用一个跳跃按钮事件。。相当于每帧都在点击按钮,如果你FPS是120那么相当于你一秒点120次跳跃按钮,嘿嘿,但是在这之前,我们先改一下按钮事件
 
按钮事件改好,我们回到JudgePlayerMove进行修改

好了,保存,替换回原路径,
上一下游戏,点攻击键有惊喜哦 嘿嘿!

我们再来说说游戏的破解验证和资源的修改:
其实我自己是先改了资源,发现被封了,才知道有破解验证,我教程就从破解验证开始分析!先看看改了资源后是什么样子 

这个界面是关不掉的,所以我决定从UI方向入手
我找到了一个叫UiManager的类 【控制着所有的UI,又是3k多行的代码,作者真叼】
了可以看到里面有一个ClosedGongGaoMeau的方法,就是控制公告界面的!
可以看到里面有个IsCrack的变量控制着是否能关闭界面,所以我们找到给IsCrack赋值的地方,肯定就是破解验证的地方! 
分析后发现一个ClearNativeScore类的CallBack方法在给他赋值,双击过去看看

通过注释可以看出来这是发现破解后执行操作的地方,这只是一个Callback的方法,看名字就知道肯定有其他地方还在调用这里,我们看看还有什么地方调用这个Callback 
后面我发现ClearNativeScore这整个类都和防破解有关系,我们挨个分析他里面的方法【注意看我截图代码上的注释】 
这里Unity的Start方法是在脚本最开始被激活时调用的 
上面是清空积分的方法
看懂了上面的分析的话,心里面对于如何干掉验证应该有数了,现在我们看看游戏是如何储存金币的【我一开始简单的修改过,发现有很多问题】所以我决定直接找作者修改资源的地方,看他如何修改的,然后抄一份 
我直接找到了存魂火的变量,然后分析,找到了一个作者修改魂火的地方。。从上面可以看出。。
作者通过了多次储存来想达到加密目的??不是很懂。。。反正照抄就对了

下面同时修改魂火和皮肤碎片,顺便干掉破解验证

回到ClearNativeScore 修改Start方法


上图把该改的地方都改了,并且有注释,最后,我还是把这些方法挨个分析,看调用的地方,修改掉以免出现其他问题

可以看到在打开天梯榜的时候会进行一次检测,这里直接改掉就好
但是改的时候又报错了= =又是特殊字符串的问题

这次太多了= = 不想改 = =直接改IL指令把,右键-编辑IL指令进去,把上面没用的指令全部NOP掉

修改后


好了完工! 不会弹出无法关闭的公告了= =
魂火也用不完

也许作者看到我上面的破解分析轻蔑一笑。。。
我觉得我可能还有没发现的地方。。不过暂时不影响自己玩就行了。。

预计更新:
广告移除教程。

我还在为了5.4培训的200飘云币学费而奋斗
如果帖子有帮助到你,请给点飘云币支持一下哦!谢谢!
|