查看原文
其他

Android逆向之unity3D游戏初探 第一篇

cjcld 看雪学院 2021-03-07
本文为看雪论坛优秀文章
看雪论坛作者ID:cjcld



ps:此demo是好久之前搞的,今天发一下,因为网上大多数关于android逆向unity3d的文章几乎都的修改金币,当初也看过几篇相关的,都是搜索 Currency 等关键字直接就可以定位到,但是我在做的过程中并没有这么容易,还是有一些坑,所以把心路历程再次记录下来。

所需工具:【.NET Reflector(查看)】【Reflexil(是netReflector的一个插件,用于修改并保存)】


第一部分


先上游戏的图,应该很多人玩过。在此不修改金币,而是删除与游戏无关的控件,因为如果不小心触碰到会有弹框,以及支付(其实在为后面的胆儿肥而美做准备)



反编译App,发现是基于unity3d引擎开发的(Assembly-CSharp.dll是特征,同时一般关键逻辑都写在这个dll里面)



打开.NET Reflector,把Assembly-CSharp.dll拖入(注意只能在原位置拖入,还不错没有加密),并搜索 ‘setting’(为什么是setting不是其他的?看第一附图中的设置按钮)。

定位到DisableSettingButton方法:

public void DisableSettingButton(){ this.settingsButton.DOFade(0f, 0.25f); this.SettingsBG.DOFade(0f, 0.25f); this.AudioButton.DOFade(0f, 0.25f); this.VibrationButton.DOFade(0f, 0.25f); this.RestorePurchaseButton.DOFade(0f, 0.25f); this.GDPRButton.DOFade(0f, 0.25f); base.Invoke("DisableSettings", 0.5f);}

为什么是 DisableSettingButton方法?(因为我在人群中看了你一样,久久无法忘记你的容颜)

因为settingsButton SettingsBG AudioButton VibrationButton RestorePurchaseButton GDPRButton 这几个关键字,和游戏里面的刚好11对应,于是我赌你的枪里没有子弹。



需要删除的是 RestorePurchaseButton 和 GDPRButton 按钮(他们有烦人的支付弹窗)

点击Tools>Reflexil 使用reflexil修改il代码,il代码又是什么?搞不懂啊,没接触过呀,没事儿,我们先到人群中去看一眼。

我们发现语法其实很简单,都是11对应的,每条语句以pop指令隔开,这就简单了。

找到this.RestorePurchaseButton.DOFade(0f, 0.25f);
this.GDPRButton.DOFade(0f, 0.25f);这两条语句块删除 保存 重打包 安装 搞定!

上面的一系列操作 速度要快 动作一定要帅 然后会发现,什么?没有效果,按钮依旧存在?

没关系,这是我们搞逆向的常规操作,一次就成功的时候是极少的。

重新分析dll:
通过分析 RestorePurchaseButton 和 GDPRButton 关键字的调用关系,找到方法 OnSettingsButtonPressed(),方法体和游戏里面设置按钮对应, 于是我又赌你的枪里没有子弹。



public void OnSettingsButtonPressed(){ if (!this.animmationRunning) { AudioManager.Instance.playSFX("Button", 0.5f); if (!this.CloseOrOpen) { this.animmationRunning = true; ShortcutExtensions.DORotate(this.settingsButton.transform, new Vector3(0f, 0f, -90f), 0.5f, RotateMode.Fast); ShortcutExtensions.DOScaleX(this.SettingsBG.transform, 1f, 0.5f).SetEase<Tweener>(Ease.OutBack); float delay = 0f; ShortcutExtensions.DOScale(this.AudioButton.transform, 1f, 0.2f).SetEase<Tweener>(Ease.OutBack).SetDelay<Tweener>(delay); delay += 0.1f; ShortcutExtensions.DOScale(this.VibrationButton.transform, 1f, 0.2f).SetEase<Tweener>(Ease.OutBack).SetDelay<Tweener>(delay); delay += 0.1f; ShortcutExtensions.DOScale(this.RestorePurchaseButton.transform, 1f, 0.2f).SetEase<Tweener>(Ease.OutBack).SetDelay<Tweener>(delay); delay += 0.1f; ShortcutExtensions.DOScale(this.GDPRButton.transform, 1f, 0.2f).SetEase<Tweener>(Ease.OutBack).SetDelay<Tweener>(delay).OnComplete<Tweener>(() => this.animmationRunning = false); } else { ShortcutExtensions.DORotate(this.settingsButton.transform, new Vector3(0f, 0f, 0f), 0.5f, RotateMode.Fast); ShortcutExtensions.DOScaleX(this.SettingsBG.transform, 0f, 0.5f).SetEase<Tweener>(Ease.InBack); float num2 = 0f; ShortcutExtensions.DOScale(this.GDPRButton.transform, 0f, 0.2f).SetEase<Tweener>(Ease.InBack).SetDelay<Tweener>(num2); num2 += 0.1f; ShortcutExtensions.DOScale(this.RestorePurchaseButton.transform, 0f, 0.2f).SetEase<Tweener>(Ease.InBack).SetDelay<Tweener>(num2); num2 += 0.1f; ShortcutExtensions.DOScale(this.VibrationButton.transform, 0f, 0.2f).SetEase<Tweener>(Ease.InBack).SetDelay<Tweener>(num2); num2 += 0.1f; ShortcutExtensions.DOScale(this.AudioButton.transform, 0f, 0.2f).SetEase<Tweener>(Ease.InBack).SetDelay<Tweener>(num2).OnComplete<Tweener>(() => this.animmationRunning = false); } this.CloseOrOpen = !this.CloseOrOpen; }}

重新修改dll:删除下面四条代码,删除方式同上 :

ShortcutExtensions.DOScale(this.RestorePurchaseButton.transform, 1f, 0.2f).SetEase<Tweener>(Ease.OutBack).SetDelay<Tweener>(delay); ShortcutExtensions.DOScale(this.GDPRButton.transform, 1f, 0.2f).SetEase<Tweener>(Ease.OutBack).SetDelay<Tweener>(delay).OnComplete<Tweener>(() => this.animmationRunning = false); ShortcutExtensions.DOScale(this.RestorePurchaseButton.transform, 0f, 0.2f).SetEase<Tweener>(Ease.InBack).SetDelay<Tweener>(num2); ShortcutExtensions.DOScale(this.GDPRButton.transform, 0f, 0.2f).SetEase<Tweener>(Ease.InBack).SetDelay<Tweener>(num2);

保存、重打包、安装!搞定!



现在就还剩屏幕两边的四个按钮了,搞起。

分析dll:因为四个按钮中有一个的名字叫做【VIP Access】,以此作为关键字搜索,找到方法 CheckForButtonState(),通过查找 CheckForButtonState() 的调用关系找到方法 EnableHomePanel()。

为什么确定是这里?和上面一样,代码和实际控件对应,所以我猜你抢里没有子弹。



删除整个方法体。为什么是删除整个方法体?你都11对应,不删你删谁呢?(注意需要保留最后的 ret 指令)



打包、安装,搞定!



好了第一部分结束了,现在我们来聊聊第二部分的话题。


第二部分:胆儿肥而美


好了,我们重打包了一个app,并取消了他的一些限制,我们还能做些什么?
有人会说 我们还能继续改,加金币,加能力。或许吧。

但是据我所知的,一些人是可以让它产生一定收入的, 这个就需要胆儿肥了。但是的确是有人正在这样做 (反正我是不敢的) 。

往后本系列就分析这样做需要哪些要求(仅在技术层面),并可能加以实现。

1. 广告方式

添加广告接口到重打包的应用,通过千展和点击盈利。

往往重打包的apk已经有广告了,如本apk好像就是facebookads 和googleads,如果需添加自己的广告,最好的方式就是破解广告sdk,让广告sdk认为我是源apk,还能拿给别人用,爽歪歪。(一些原因,非本系列重点)
  
2. 内容付费

什么内容可以让我付费观看?反正我也不知道。

用上游戏App举例,因为已经去除了他本身的限制,或许可以添加一些我们自己定义的玩法。

如:每天免费玩n次,第n次开始需要付费才能继续玩。本系列往后就以此为模板,相关app的分析工作。

总的来说 按目前使用习惯会牵涉以下接口:
  • 两个大厂指定金额收款二维码即时生成

  • 交易记录的获取

  • 转账


好了,本篇完!拜了个拜。



- End -





看雪ID:cjcld

https://bbs.pediy.com/user-880781.htm 

*这里由看雪论坛 cjcld 原创,转载请注明来自看雪社区。



推荐文章++++

*  手把手教你入门V8突破利用

*  Android微信逆向-实现发朋友圈动态

*  病毒样本半感染型分析的方法

*  对宝马车载apps协议的逆向分析研究

*  x86_64架构下的函数调用及栈帧原理

好书推荐





公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com



“阅读原文一起来充电吧!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存