CrazyNut 发表于 2018-12-27 20:17:27

TapTap某高分跑酷游戏实现自动奔跑教程-破解验证分析

本帖最后由 CrazyNut 于 2018-12-28 00:16 编辑

前言:
这款游戏是u3d的Mono打包方式
看的教程一般都是修改无限金币or修改资源类的
所以打算出一篇以开发游戏的思维修改游戏功能以达到 目的 的教程

如有错误的地方,还望各位表哥指出,以免误人子弟
static/image/hrline/4.gif
准备工具:
Dnspy,Androidkiller,一款能打开apk的压缩工具
一点点的英语基础和一点点的语言基础
如果你有过Unity3d的开发经验,那这篇教程对你来说就再简单不过了

先看看最后的效果
http://wx2.sinaimg.cn/mw690/78128aa9gy1fyixxg3x5kg20dl0obnps.gif
开搞:

玩过游戏的就知道,游戏有两个操作按钮,前面有敌人就按攻击,没敌人按跳跃,按错了就会出现失误。

先说一下我最开始的破解逻辑:
找到两个操作按钮的按钮事件,把判断失误的地方改为另一个按钮的按钮事件【相当于如果你按错了,不执行错误流程,自动帮你按另一个键】
破解流程:
把Managed文件夹下所有dll拖进dnspy从中找到关键函数,修改代码以达到目的
而游戏的关键脚本通常都在Assembly-CSharp.dll中,所以通常我们只用关注这个dll里面的脚本就行
https://static.52pojie.cn/static/image/hrline/4.gif

定位到关键代码并处理反编译后的坑:
把Managed文件夹下所有dll解压到同一个文件夹
然后把Assembly-CSharp和Assembly-CSharp-firstpass拖入dnspyhttp://wx4.sinaimg.cn/mw690/78128aa9gy1fxst0bgjhaj21ek0sqjw5.jpg
然后把Assembly-CSharp和Assembly-CSharp-firstpass拖入dnspy

定位到一个关键的playercontrol类。【顺便吐槽一下作者一个类写了3k+行的代码,真的强,自己看着不头痛吗= =】
里面可以看到JumpButton和AttackButton两个方法可以确定为跳跃按钮和攻击按钮的按钮事件。

【至于怎么找到的。。以经验根据名字来判断】

http://wx4.sinaimg.cn/large/78128aa9gy1fylfhebr3pj20xt0goado.jpg
【因为两个按钮事件内容几乎一样,我只截图了一个攻击按钮来进行分析】
可以看到图上并没有之前想的,在按钮事件中就进行了错误或者判断,而只是修改了一个状态的bool值,所以肯定有其他地方在进行判断。所以我们,右键isattack,分析,查看什么地方调用了然后进行的分析!
http://wx2.sinaimg.cn/mw690/78128aa9gy1fylfhf3ewwj20i60izgn9.jpg
图上可以看到,除了按钮事件里面调用了这个值,
只剩下一个JudgePlayerMove的方法调用了这个状态,
那么这个方法肯定就是判断操作成功或者失败的方法了,
双击过去看看这个方法

我从代码里面找到了判断攻击按键的地方,如下图:
http://wx1.sinaimg.cn/large/78128aa9gy1fylg47994pj20yi0n7acg.jpg
【因为判断内容几乎一样,我只截图了一个攻击按钮来进行分析】
有人就要问了,JudgePlayerMove这个方法是哪里调用的呢?
http://wx3.sinaimg.cn/mw690/78128aa9gy1fylg9olc6pj20bc02xjre.jpg
分析器分析一下可以看到,只在playercontrol类中的Update方法调用了这个方法
这里说明一下Unity中的Update方法是游戏每一帧运行的时候都会调用的方法,也可以理解为一个Timer或者说一个时钟
关键代码找到了,但是不急,先修复一下反编译后的坑

就算你什么都不修改,点编译的时候也出现了报错
http://wx3.sinaimg.cn/mw690/78128aa9gy1fylfhg8j9bj20go01ndfr.jpg
http://wx1.sinaimg.cn/mw690/78128aa9gy1fylfhhdlawj20ic04kaab.jpg
可以看到Unity可以识别的特殊字符在Dnspy里面无法识别,我们需要自己修改一下这个变量
http://wx4.sinaimg.cn/mw690/78128aa9gy1fylfhgx8qyj20ev01wglj.jpg
并处理好调用这个变量的地方

特殊字符串修改好之后又报错了
http://wx2.sinaimg.cn/large/78128aa9gy1fylfhhs6k9j20vf0bc3zs.jpg

可以看到dnspy无法识别unity自带的Get_TimeScale方法 【具体原因未知】
Get_TimeScale这个方法呢是获取游戏运行速度倍率的

那我们只好自己写一个获取游戏运行速度倍率的方法给他填回去,如下图
http://wx4.sinaimg.cn/mw690/78128aa9gy1fylfhi7kkgj209c01rjr7.jpg
http://wx1.sinaimg.cn/mw690/78128aa9gy1fylfhil41dj20fk03ot8s.jpg

点编译 OK 没问题了,可以开始修改之前找到的代码了

回到判断攻击状态的地方进行修改,修改后如下
【忘了可以看看上面图上的注释】
http://wx1.sinaimg.cn/large/78128aa9gy1fylhvzkoyfj20nm0bdjsc.jpg

顺便把判断跳跃状态的地方改了
http://wx3.sinaimg.cn/large/78128aa9gy1fylhw12c3oj20rh0bz3zm.jpg
现在已经实现了:你乱按攻击或者跳跃键都可以疯狂的向前冲,不会出现失误,现在我们需要加上自动
之前已经说过了Update这个方法是游戏运行的每一帧调用的,而Update里面调用了JudgePlayerMove,那么也是每一 帧都在调用的了

所以我们只需要在JudgePlayerMove这个方法里面调用一个跳跃按钮事件。。相当于每帧都在点击按钮,如果你FPS是120那么相当于你一秒点120次跳跃按钮,嘿嘿,但是在这之前,我们先改一下按钮事件
http://wx4.sinaimg.cn/large/78128aa9gy1fylhw001z1j20ke0gujsd.jpghttp://wx2.sinaimg.cn/mw690/78128aa9gy1fylhw1sc5zj20hv0egjs3.jpg

按钮事件改好,我们回到JudgePlayerMove进行修改

http://wx4.sinaimg.cn/mw690/78128aa9gy1fylhw0guikj20gd06eq36.jpg

好了,保存,替换回原路径,
上一下游戏,点攻击键有惊喜哦 嘿嘿!
static/image/hrline/4.gif


我们再来说说游戏的破解验证和资源的修改:
其实我自己是先改了资源,发现被封了,才知道有破解验证,我教程就从破解验证开始分析!先看看改了资源后是什么样子http://wx3.sinaimg.cn/mw690/78128aa9gy1fylpsl9znqj20fb0r843h.jpg
http://wx4.sinaimg.cn/large/78128aa9gy1fylpsm6iq6j20yr0dbn09.jpg
这个界面是关不掉的,所以我决定从UI方向入手
我找到了一个叫UiManager的类 【控制着所有的UI,又是3k多行的代码,作者真叼】
了可以看到里面有一个ClosedGongGaoMeau的方法,就是控制公告界面的!

可以看到里面有个IsCrack的变量控制着是否能关闭界面,所以我们找到给IsCrack赋值的地方,肯定就是破解验证的地方!http://wx1.sinaimg.cn/mw690/78128aa9gy1fylpsml5roj20da04zmxa.jpg
分析后发现一个ClearNativeScore类的CallBack方法在给他赋值,双击过去看看
http://wx4.sinaimg.cn/large/78128aa9gy1fylpsnimlij20yr0qfgox.jpg
通过注释可以看出来这是发现破解后执行操作的地方,这只是一个Callback的方法,看名字就知道肯定有其他地方还在调用这里,我们看看还有什么地方调用这个Callbackhttp://wx1.sinaimg.cn/large/78128aa9gy1fylpsog39hj20xi0n1n0l.jpg
后面我发现ClearNativeScore这整个类都和防破解有关系,我们挨个分析他里面的方法【注意看我截图代码上的注释】http://wx1.sinaimg.cn/large/78128aa9gy1fylpsow3zaj20x809hjt6.jpg
这里Unity的Start方法是在脚本最开始被激活时调用的http://wx2.sinaimg.cn/large/78128aa9gy1fylpspripnj217u0e4tco.jpg
上面是清空积分的方法
看懂了上面的分析的话,心里面对于如何干掉验证应该有数了,现在我们看看游戏是如何储存金币的【我一开始简单的修改过,发现有很多问题】所以我决定直接找作者修改资源的地方,看他如何修改的,然后抄一份http://wx2.sinaimg.cn/large/78128aa9gy1fylpsqn15ij21040c3jul.jpg
我直接找到了存魂火的变量,然后分析,找到了一个作者修改魂火的地方。。从上面可以看出。。
作者通过了多次储存来想达到加密目的??不是很懂。。。反正照抄就对了
https://static.52pojie.cn/static/image/hrline/1.gif
下面同时修改魂火和皮肤碎片,顺便干掉破解验证
http://wx3.sinaimg.cn/mw690/78128aa9gy1fylpsr29rkj20n40atq40.jpg
回到ClearNativeScore 修改Start方法
http://wx1.sinaimg.cn/mw690/78128aa9gy1fylpsroey4j20rm0g5wh2.jpg
http://wx3.sinaimg.cn/large/78128aa9gy1fylpss2ey2j20t80agabg.jpg
上图把该改的地方都改了,并且有注释,最后,我还是把这些方法挨个分析,看调用的地方,修改掉以免出现其他问题
http://wx3.sinaimg.cn/large/78128aa9gy1fylpssibk0j20m80ny40m.jpg

可以看到在打开天梯榜的时候会进行一次检测,这里直接改掉就好
但是改的时候又报错了= =又是特殊字符串的问题
http://wx3.sinaimg.cn/mw690/78128aa9gy1fylpssy6l0j20ha0cujta.jpg

这次太多了= = 不想改 = =直接改IL指令把,右键-编辑IL指令进去,把上面没用的指令全部NOP掉
http://wx3.sinaimg.cn/mw690/78128aa9gy1fylpstdxfej20k10b7q3q.jpg
修改后
http://wx1.sinaimg.cn/mw690/78128aa9gy1fylpstr3kpj20jk0b374h.jpg
http://wx1.sinaimg.cn/mw690/78128aa9gy1fylpsu5ocpj207i02vdfr.jpg

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

https://attach.52pojie.cn/forum/201812/26/003428k66oh6nrs46nu9do.png

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


https://static.52pojie.cn/static/image/hrline/4.gif
预计更新:

广告移除教程。
https://static.52pojie.cn/static/image/hrline/4.gif
我还在为了5.4培训的200飘云币学费而奋斗
如果帖子有帮助到你,请给点飘云币支持一下哦!谢谢!




小七柒 发表于 2018-12-29 09:56:53

厉害了大佬。

decall 发表于 2018-12-31 09:42:24

谢谢分享,很不错的教程。

天玄 发表于 2018-12-31 17:33:56

大佬的教程很棒 像我们这样不太会的菜鸟想玩体验一下 你的成果可以么

CrazyNut 发表于 2018-12-31 20:02:36

天玄 发表于 2018-12-31 17:33
大佬的教程很棒 像我们这样不太会的菜鸟想玩体验一下 你的成果可以么

= =看我们是同一天注册的 如此有缘分 私聊发给你了

qian15 发表于 2019-1-2 18:43:36

很不错的教程。

cx3386 发表于 2019-1-2 20:05:34

比较入门的一个技术分享贴吧,还行

qian15 发表于 2019-1-3 18:32:40

谢谢楼主分享!!!

zxs908033 发表于 2019-1-5 12:56:46


谢谢楼主分享!!!

zxs908033 发表于 2019-1-5 22:12:14


很不错的教程。
页: [1] 2
查看完整版本: TapTap某高分跑酷游戏实现自动奔跑教程-破解验证分析