安卓逆向-修改APK-战斗直接胜利

原创 2018年04月15日 21:35:55

前言

  很久没有总结过关于逆向编程的文章了,来写一篇实践分享给大家。主要来说说如何通过逆向修改APK来实现游戏进入后直接获得胜利领取奖励。为了学习发展就不分享游戏名称了。下面我们开始吧:

使用到工具

AndroidKiller / IDE 3.1.0.0 (用来反汇编APK)
.NET Reflector 9.0 (用来查找修改)

过程

  首先通过AndroidKiller将游戏APK安装包反汇编出来,使用.NET Reflector 打开目录下的Assembly-CSharp.dll文件。
  F3(调查查询界面) → ctrl + m(查询方法类型) → win(查询关键字) → 选择精准匹配(如下图所示)。
1
  我们锁定(上图中倒数第四个)Menber = win,Declaring Type = BattleState(战斗状态)这行,双击进去,顺便看看BattleState这个类都有些什么相关的信息。
2
(单词含义不太确定的可以百度翻译,平时多记多查点滴积累。)

AllEnemiesDead() : Boolean    批注:(所有敌人死亡)Boolean在这里叫做布尔值,代表返回的数据类型:True 或为 False

AllHeroDead() : Boolean     (所有英雄死亡)

EndBattle() : Void         批注:(结束战斗)Void 当看到这个类型时要明白方法返回值为空 或 不返回值

  这里我们把直接胜利,比喻成我们想添加的toast,想让toast在启动的时候显示,就要找到主启动的activity添加进去。
在Win() : Void → 右键Analyze / ctrl + r (进入分析器界面) →双击 展开列表 → 展开 Used By 。如下图:
3
批注:Depends On:执行Win()方法时所需要内容。    Used By : Win()方法 被哪些过程使用

BattleState.Win() : Void
Depends On
Used By
BattleState.Update() : Void
PlayerCmder.Reconnect(FullPlayerWrap) : Void

批注:我在这里看出 Win()方法 与 Update() 是属于BattleState类下的方法也可以说Reconnect()方法属于 PlayerCmder类

  分析来看:发现游戏在运行 有查看 战斗状态(BattleState)的过程,而游戏在执行这个过程中会用到 胜利(Win()) 和 刷新(Update())的命令。 所以在这里只要我们把胜利的命令放在刷新命令的第一行,让玩家进入游戏时,系统就会查看战斗状态-刷新-玩家胜利。这就是代码之后执行的逻辑。

下面我们接着操作:
先来看看Update() : Void
对于代码看不明白的可以直接看下方文字即可:

public override void Update()
{
    base.Update();
    if ((this.m_status == Status.Init) && (BattleApp.aBattle != null))
    {
        this.m_status = Status.Runing;
    }
    if (BattleApp.aBattle != null)
    {
        if (this.m_status == Status.BattleEndTutorial)
        {
            if (Singleton<TutorialManager>.Get().IsTutorialFinishOp(this.m_battleEndTutorial))
            {
                if (this.m_result == BattleResult.Win)
                {
                    this.Win();
                }
                else if (this.m_result == BattleResult.Lose)
                {
                    this.Loss();
                }
            }
        }
        else
        {
            if (!this.m_bTriggerStartEvent && (this.ElapseTime > 0x9c4L))
            {
                this.m_bTriggerStartEvent = true;
                Singleton<TutorialManager>.Get().SendEvent(new BattleStart());
            }
            if (!this.m_bTrriggerWaveStartEvent && (this.ElapseTime > 0x9c4L))
            {
                this.m_bTrriggerWaveStartEvent = true;
                Singleton<TutorialManager>.Get().SendEvent(new WaveStart(this._curWave));
            }
            bool flag = false;
            if (!this.PauseTime && !this.WaveCleared)
            {
                this.RemainTime -= App.Clock.DeltaMillis;
                if ((this.RemainTime <= 0L) || this.AllHeroDead())
                {
                    flag = true;
                    this.m_result = BattleResult.Lose;
                }
                if (this.AllEnemiesDead())
                {
                    this._waveCleared = true;
                    if (this.CurWave == this.MaxWave)
                    {
                        flag = true;
                        this.m_result = BattleResult.Win;
                    }
                    else
                    {
                        this.ClearWave();
                    }
                }
                if (flag)
                {
                    this.OnBattleEnd();
                    if (this.m_status != Status.BattleEndTutorial)
                    {
                        if (this.m_result == BattleResult.Win)
                        {
                            this.Win();
                        }
                        else if (this.m_result == BattleResult.Lose)
                        {
                            this.Loss();
                        }
                    }
                }
                if ((this.m_helpAddEpDataList != null) && (this.m_helpAddEpDataList.Count > 0))
                {
                    HelpAddEpData data = this.m_helpAddEpDataList[0];
                    if ((data.Tick * 1000f) < this.ElapseTime)
                    {
                        this.m_helpAddEpDataList.RemoveAt(0);
                        BevUnit bevUnitByHeroID = BattleApp.aBattle.GetBevUnitByHeroID(data.HeroID);
                        if (bevUnitByHeroID != null)
                        {
                            bevUnitByHeroID.aUnitAttribute.aUnitProp.CurEP = UnitProp.MAX_EP;
                        }
                    }
                }
            }
        }
    }
}

  通过分析代码可以看到胜利、失败、所有敌人死亡、所有英雄死亡。
想让游戏直接胜利,就在第一行Update() : Void上面调用Win() : Void方法。
在菜单Tools → Reflexil v1.6 →如下面两张图。
4

修改后:
5

小结

  这样程序就能达到直接胜利的效果了,之后通过回编译、签名游戏、打包就可以把游戏安装到手机了。希望可以帮到对此技术好奇的你们,荣幸与您分享~

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010349629/article/details/79953334

你也能动手修改C编译器

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。介绍怎么样动手修改编译器的过程。
  • 2017年08月14日 11:15

勇敢和必胜的信念常使战斗得以胜利结束。

http://huaban.com/boards/15536121/ http://huaban.com/boards/15536126/ http://huaban.com/boards/155...
  • srfx465454
  • srfx465454
  • 2014-04-15 00:22:28
  • 470

概率论模拟

某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5,3。...
  • vinci_lau
  • vinci_lau
  • 2011-12-18 00:02:26
  • 708

概率算法学习

某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5,3。...
  • houcunyue
  • houcunyue
  • 2013-05-07 11:35:21
  • 908

操作系统之争已经结束,胜利的一方是Linux

2006.11.13  来自:solidot     Dana Blankenhorn直截了当陈述了这样一个真实的很多人也知道的事实:操作系统之争已经结束,胜利的一方是Linux。Oracle和微软最...
  • Kipen
  • Kipen
  • 2006-11-15 22:52:00
  • 645

国信蓝点2011c本科概率问题

某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5:3。...
  • ycc892009
  • ycc892009
  • 2011-05-12 22:55:00
  • 1231

程序设计 概率题

某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。 游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。 例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:...
  • qingdu007
  • qingdu007
  • 2013-04-05 15:29:33
  • 523

[Android]反编译查看、修改源码、逆向分析以及二次打包签名

本文我们将来探讨关于Android的反编译。通常来说,我们在开发过程中的apk出于DEBUG状态,我们并没有给予APK一个特定的签名,而是编译系统默认给apk一个签名。在发布到应用商城时,我们会用自己...
  • lc_miao
  • lc_miao
  • 2017-09-05 18:23:37
  • 21987

参与比取胜更重要

顾拜旦的名言 参与比取胜更重要 先生们,请牢记这铿锵有力的名言。这个论点可以扩展到诸多领域。对人生而言,重要的绝非凯旋而是战斗。传播这些格言,是为了造就更加健壮的人类——从而使人类更加严谨审慎而又勇敢...
  • jdsjlzx
  • jdsjlzx
  • 2016-07-02 10:47:48
  • 1640

安卓逆向系列教程 4.6 去广告

4.6 去广告 作者:飞龙 软件在这里下载:http://www.yxdown.com/shouji/376800.html我们要去掉的是主界面上的广告:把它拖进 Android Killer,这...
  • wizardforcel
  • wizardforcel
  • 2017-04-03 10:44:58
  • 1183
收藏助手
不良信息举报
您举报文章:安卓逆向-修改APK-战斗直接胜利
举报原因:
原因补充:

(最多只允许输入30个字)