首页
社区
课程
招聘
[原创]android逆向--胆儿肥而美 (unity3d游戏初探)第一篇
发表于: 2020-4-3 15:35 8221

[原创]android逆向--胆儿肥而美 (unity3d游戏初探)第一篇

2020-4-3 15:35
8221

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对应,于是我赌你的枪里没有子弹。
定位到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);
}

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()。为什么确定是这里?和上面一样,代码和实际控件对应,所以我猜你抢里没有子弹。
重新分析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()。为什么确定是这里?和上面一样,代码和实际控件对应,所以我猜你抢里没有子弹。
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()。为什么确定是这里?和上面一样,代码和实际控件对应,所以我猜你抢里没有子弹。
重新修改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()。为什么确定是这里?和上面一样,代码和实际控件对应,所以我猜你抢里没有子弹。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-4-3 16:03 被Editor编辑 ,原因:
收藏
免费 5
支持
分享
最新回复 (10)
雪    币: 724
活跃值: (180)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
版主,太长了吗? 怎么一大半都没有显示。
2020-4-3 15:40
1
雪    币: 26185
活跃值: (63332)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
3
cjcld 版主,太长了吗? 怎么一大半都没有显示。[em_1]
我们查一下原因
2020-4-3 15:46
0
雪    币: 26185
活跃值: (63332)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
4
问题解决了,文章里的一些字符被过滤了。

恭喜转为正式会员!
最后于 2020-4-3 16:04 被Editor编辑 ,原因:
2020-4-3 16:03
0
雪    币: 724
活跃值: (180)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
Editor 问题解决了,文章里的一些字符被过滤了。恭喜转为正式会员!
好的,谢谢,好久没上了,以前的账号忘记了。
2020-4-3 16:17
0
雪    币: 18
活跃值: (1059)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
顶大佬。
2020-4-6 01:41
0
雪    币: 221
活跃值: (17)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
你好 请问是哪款游戏 能麻烦说一下名字 关键词也好
2020-4-11 18:58
0
雪    币: 18
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
猪会被杀掉 顶大佬。
能加QQ请教吗? 2285917557
2020-4-12 04:44
0
雪    币: 724
活跃值: (180)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
超高校级幸运 你好 请问是哪款游戏 能麻烦说一下名字 关键词也好
游戏名:PickMeUp。
2020-4-12 09:36
0
雪    币: 148
活跃值: (780)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
实操成功,虽然新手不知道工具怎么用,不过查点资料就补上了,谢谢大佬,希望多出这样的教程
2020-4-25 23:28
0
游客
登录 | 注册 方可回帖
返回
//