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编辑
,原因: