0x00 开工动员大会

这两天《旅行青蛙》好火啊,然后就网上放出了好多关于这个的逆向,一个比一个说的简单,于是本菜鸡就蹭一下热度,就跟着也搞一搞、学一学吧

使用工具:

- dnSpy
- ApkIDE,网上的文章用的都是这个,但是我的这个会报错,我也很无奈
- Apk Killer,不知道什么时候我下载的远古版本,本着有什么用什么的原则,就将就用用了

0x01 肉眼观察法

0x10 先弄一个apk文件

  1. 先舍近求远地从手机模拟器里搞了一个安装包出来
  2. 改后缀成zip,解压出来

    0x11 从改抽奖开始

    将安装包里面的/assets/bin/Data/Managed/Assembly-CSharp.dll拖进dnSpy
    ctrl+shift+K搜索程序集,从游戏中为数不多的汉字下手,就是抽奖里奖券不足的时候提示的”足”,选择搜索”数字/字符串”

    查看一下PushRollButton
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public void PushRollButton()
    {
    if (SuperGameMaster.TicketStock() < 5)
    {
    ConfilmPanel confilm = this.ConfilmUI.GetComponent<ConfilmPanel>();
    confilm.OpenPanel("ふくびき券が足りません");
    confilm.ResetOnClick_Screen();
    confilm.SetOnClick_Screen(delegate
    {
    confilm.ClosePanel();
    });
    return;
    }
    SuperGameMaster.GetTicket(-5);
    SuperGameMaster.set_FlagAdd(Flag.Type.ROLL_NUM, 1);
    base.GetComponentInParent<UIMaster>().freezeObject(true);
    base.GetComponentInParent<UIMaster>().blockUI(true, new Color(0f, 0f, 0f, 0.3f));
    this.LotteryCheck();
    this.ResultButton.GetComponent<RollResultButton>().CngImage((int)this.result);
    this.ResultButton.GetComponent<RollResultButton>().CngResultText(Define.PrizeBallName[this.result] + "がでました");
    this.LotteryWheelPanel.GetComponent<LotteryWheelPanel>().OpenPanel(this.result);
    SuperGameMaster.SetTmpRaffleResult((int)this.result);
    SuperGameMaster.SaveData();
    SuperGameMaster.audioMgr.PlaySE(Define.SEDict["SE_Raffle"]);
    this.BackFunc();
    }

抽奖的逻辑:先判断奖券数是否不小于5,如果是,则奖券数-5,即进行一次抽奖操作
基本可以从方法名看出TicketStock()就是获取玩家当前持有的奖券数量GetTicket(num)就是对奖券数量进行操作,这里的num=-5,也就是说加减用的是同一个方法
那么这里可以做一个简单的修改,修改奖券数量判断和减奖券数量

1
2
3
if (SuperGameMaster.TicketStock() < 0)
......
SuperGameMaster.GetTicket(0);

ctrl+shift+S保存,覆盖掉原始文件,用apkIDE重新编译一下安装即可
这里有一个问题,我从吾爱破解下载的版本在打开Data文件夹的时候会报错

但是,勤劳勇敢的华夏儿女想到了一个好办法,在”Data”上右键->打开文件夹,于是就解决了问题

0x02 继续搞

基本操作就是上面这样,接下来就看看还能改哪里

0x21 免费抽奖

具体如上,重要函数就是PushRollButton()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void PushRollButton()
{
if (SuperGameMaster.TicketStock() < 5)
{
ConfilmPanel confilm = this.ConfilmUI.GetComponent<ConfilmPanel>();
confilm.OpenPanel("ふくびき券が足りません");
confilm.ResetOnClick_Screen();
confilm.SetOnClick_Screen(delegate
{
confilm.ClosePanel();
});
return;
}
SuperGameMaster.GetTicket(-5);
SuperGameMaster.set_FlagAdd(Flag.Type.ROLL_NUM, 1);
base.GetComponentInParent<UIMaster>().freezeObject(true);
base.GetComponentInParent<UIMaster>().blockUI(true, new Color(0f, 0f, 0f, 0.3f));
this.LotteryCheck();
this.ResultButton.GetComponent<RollResultButton>().CngImage((int)this.result);
this.ResultButton.GetComponent<RollResultButton>().CngResultText(Define.PrizeBallName[this.result] + "がでました");
this.LotteryWheelPanel.GetComponent<LotteryWheelPanel>().OpenPanel(this.result);
SuperGameMaster.SetTmpRaffleResult((int)this.result);
SuperGameMaster.SaveData();
SuperGameMaster.audioMgr.PlaySE(Define.SEDict["SE_Raffle"]);
this.BackFunc();
}

改两处5和-5即可

0x22 增加三叶草

想找一下修改初始三叶草数量一时没找到,于是就想了个暂时的方法,既然有getTicket(),那么就应该有getClover()

1
2
3
4
5
6
7
8
9
// Token: 0x06000885 RID: 2181
public static void getCloverPoint(int num)
{
SuperGameMaster.saveData.CloverPoint += num;
if (num > 0)
{
SuperGameMaster.set_FlagAdd(Flag.Type.CLOVER_NUM, num);
}
}

这里可以改成:每次三叶草数量有变化,就增加100

1
SuperGameMaster.saveData.CloverPoint += num + 100;

然后话音未落,找到了StartCloverPoint

1
2
// Token: 0x04000338 RID: 824
public const int StartCloverPoint = 0;

简单明了,想改多少改多少
但是在之后的测试里面发现一个问题,当我把值设置成10000时,开局却没有效果了,一会儿再试试看

0x23 抽奖概率

StartCloverPoint这一块附近有很多有趣的常数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Token: 0x0400036A RID: 874
public static readonly Dictionary<Rank, int> PrizeBalls = new Dictionary<Rank, int>
{
{
Rank.White,
60
},
{
Rank.Blue,
27
},
{
Rank.Green,
9
},
{
Rank.Red,
3
},
{
Rank.Gold,
1
},
{
Rank.RankMax,
100
}
};

这一块定义了抽奖时的概率
可以直接把White设置成0,这样就再也不会中不了奖了

0x24 其他一些常数

不一定有用,但是就这么标记一下先
csharp