吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 23165|回复: 39
收起左侧

[Android 原创] 小白的一个分析和修改unity3d游戏的经历

  [复制链接]
h080294 发表于 2017-9-14 01:58
本帖最后由 h080294 于 2017-9-14 02:04 编辑

在论坛中一直都是以新人的状态来学习,这是我第一次自己分析和修改unity3d游戏。
之前玩了一款很好玩的海战游戏,过程中遇到一个变态可以连续开炮,简直无敌变态,严重的破坏了公平性。所以本着研究的态度,第一次开始接触分析unity3d相关方面的知识。

简单的介绍下,游戏中有各种类型军舰可供使用,巡洋舰、驱逐舰、战列舰和航母,武器有主炮、副炮、近防炮、防空炮、鱼类、飞机等。炮弹是有填充cd时间的,发射完一次需要冷却x秒。然而遇到开挂的那货根本就没cd,连续发射,骚的要死,打的我等屁滚尿流。。。
1.png
好吧进入正题,这里就不介绍怎么分辨是不是unity3d类型的游戏,因为这款游戏有再明显不过的提示了。

第一步
解压apk,dnSpy加载Assembly-CSharp.dll。我这里还是使用虚拟机,毕竟Mac上的相关软件不好找。一打开程序,很陌生,不过工具的用法基本都大同小异。展开目录看看,这里没有加密,类、方法还有一些成员反编译后整体还是很清晰的,只有一部分类名处理成了AEAHEOPPMLM类似的不易阅读的东西。
2.png

第二步 -- 定位代码
因为是第一次接触,所以没有着急的先按照那些教程进行搜索,而是挨个看了看里面的内容。虽然有些类名被处理了,但有些仍然保留着非常容易识别的名字,通过名字可以大概猜出该类实现的功能。(一般的教程是提示按照什么coin、cash、attack、hit等等关键字来搜索)
3.png
看的差不多了就来了感觉,还是用通用的关键词搜索方法试一下。

既然炮弹发射完后需要重新填充,那么必定有个地方来处理重新填充弹药的逻辑,这时候脑海就突然蹦出reloading这词。在FPS的游戏中,经常能听到这,就是换弹夹时候。抱着试一试的态度搜索一下reload,发现了可疑的函数GetReloadProgress,并且这个函数是在名叫TurretInstance类中。
还是不着急直接看GetReloadProgress的具体逻辑,因为TurretInstance这个名字太引人注目了,翻译成傻白就是炮塔的实例。。。应该预览下这个类都写了哪些方法。
4.png
展开列表,发现了更可疑的关键字CanShotNow,并且还是布尔型的。
5.png
看字面意思就是问现在能不能射?等等不要停!!!先跟进去看看再说
6.png
又跟进看了看IsReloaded和IsAimed方法,凭感觉应该是这里没错了。

[C#] 纯文本查看 复制代码
    public bool IsReloaded()
    {
        return this.GetReloadProgress() >= 1f;
    }
    public bool IsAimed()
    {
        return this.COKKPADBCCI;
    }

让CanShotNow()和 IsReloaded()一直返回true就好了,期望结果是没有reload,可以一直射。


第三步 修改
看教程是说比较常用的方式之一是编辑IL指令
7.png 8.png

IL指令是啥,没接触过啊。。。不过咱不怕,可以学习嘛。查了一下,发现其实和之前接触过的汇编很像,也是各种指令集。先跟着代码练一下
[C#] 纯文本查看 复制代码
    public bool IsReloaded()
    {
        return this.GetReloadProgress() >= 1f;
    }
    
ldarg.0  # 将索引为 0 的参数加载到计算堆栈上
call instance folat32 TurretInstance::GetReloadProgress()  # 调用方法
ldc.r4  1  # 将所提供的 float32 类型的值作为 F (float) 类型推送到计算堆栈上。这里提供的是1
clt.un    # 比较无符号值,v1<v2则将1推送到计算堆栈上;反之将0推送到计算堆栈上
ldc.i4.0  # 将整数值 0 作为 int32 推送到计算堆栈上。
ceq  # 比较值,相等将1推送到计算堆栈上;不相等将0推送到计算堆栈上
ret  从当前方法返回,并将返回值

逻辑少,所以很清晰,也很容易弄明白。我们需要让它直接返回true,两行就够了,其他没用的指令全都删掉。
[Asm] 纯文本查看 复制代码
ldc.i4.1
ret

9.png
点击确定后可以看到反编译的结果直接是return true。
10.png
同样,也把CanShotNow()改掉。然后生成新的dll,打包回原apk中。

第四步 实践出真知
还是实践出真知,把“解带回原方程验证”。改完后得实际上手试试,感觉有点小激动。

进入游戏,选择对战,然后开炮。。。果然,没有了重新填充弹药的cd时间,可以连续开炮了。这feel也是骚的要死。本来只是抱着试一下的心态,没想到就这么稀里糊涂的成功了,过程也很充满意外和运气。
因为是边学边弄的,搞到了夜里才弄完,所以担心哪里是错误的。希望文章有哪里不对的地方各位大大能多多指教,。

点评

实践出真知,期待楼主下一个作品。。  发表于 2017-9-14 02:47

免费评分

参与人数 23吾爱币 +22 热心值 +22 收起 理由
一不小心就丶 + 1 + 1 谢谢@Thanks!
black90 + 1 + 1 热心回复!
会飞的丑小鸭 + 1 我很赞同!
hyc199844 + 1 + 1 用心讨论,共获提升!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qxyokok + 1 + 1 用心讨论,共获提升!
MistyRain + 1 + 1 我很赞同!
Amarry + 1 + 1 我很赞同!
a5606495 + 1 + 1 谢谢@Thanks!
6767 + 1 + 1 热心回复!
w20064360 + 1 热心回复!
971971 + 1 用心讨论,共获提升!
流年回忆 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
610100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xia8520 + 1 + 1 我很赞同!
还是想恋丶 + 1 + 1 我很赞同!
沧恋 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
stuc + 1 + 1 我很赞同!
爆裂 + 1 + 1 用心讨论,共获提升!
wc_3887 + 1 + 1 我很赞同!
52pjqhxzf + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
eai520 + 1 + 1 实践出真知
qaz003 + 3 + 1 谢谢分享

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| h080294 发表于 2017-9-14 14:15

Battle_of_Warships,gooplay上叫战舰激斗。。。
[Asm] 纯文本查看 复制代码
package: name='com.CubeSoftware.BattleOfWarships' versionCode='44' versionName='1.36'
虚无空幻 发表于 2017-9-14 13:30
xuanle6 发表于 2017-9-14 06:46
还好Assembly-CSharp.dll没加密,不然还要麻烦一些

感觉基本现在都加密吧.
就算不加密,打包也难搞.
以前玩汉家松鼠,修改完无法打包回app,
最后还是需要专业的搞啊.
qaz003 发表于 2017-9-14 02:55
xuanle6 发表于 2017-9-14 06:46
还好Assembly-CSharp.dll没加密,不然还要麻烦一些
eai520 发表于 2017-9-14 08:20
学习了,还好没加密
小村村 发表于 2017-9-14 08:25
谢谢分享
finalcrasher 发表于 2017-9-14 09:14
遇到加密的就没这么好对付了
胖子哦 发表于 2017-9-14 10:10
可以支持一下
z55 发表于 2017-9-14 10:17
这是什么游戏
redven 发表于 2017-9-14 10:40
现在大多都用il2cpp了 建议可以先练练手
xia8520 发表于 2017-9-14 11:31
不错,学习一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-23 00:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表