青蛙旅行 — Unity3d类安卓游戏逆向分析初探

0x01 前言

最近一款养蛙的游戏非常火,但是语言是日文的。下载了一个汉化的,结果广告一大堆。反编译之后查看是Unity游戏,之前没接触过,就想着跟着看一下。关于这类的破解,可以在52pojie上进行搜索。有很多类似的案例。

这里主要采用的工具为dnSpy,dnSpy 是一款针对 .NET 程序的逆向工程工具。反编译和打包采用的是apktool,当然也可以直接用改之理等工具。

虽然本文以一个小游戏为实例,但这个思路值得安全渗透人员借鉴。

 

0x02 修改数据

下载app后重命名为zip文件,发现存在assets\bin\Data\Managed目录,那么该游戏应该为Unity游戏。

那么需要分析的文件就是就是Assembly-CSharp.dll

首先修改一下抽奖券的数量。安装游戏后,找到抽奖的地方。抽奖的时候提示券不足。

使用dnSpy打开Assembly-CSharp.dll文件,然后搜索字符串”足”,可以发现有两个,打开后发现是第一个。

由此可以猜测TicketStock代表抽奖券库存。

ticket表示抽奖券数量。

当页查找ticket,发现有一个initialize方法进行初始化。我们将此处的数量改为1000.

快捷键Ctrl+E编辑IL指令。找到ticket变量后,将ldc.i4.0改为ldc.i4,然后将数值改为1000.

确定后,发现ticket数值已经改变。

打包后并安装apk。

打开抽奖界面发现数量已经改变为1000。

这样虽然达到了修改抽奖券的效果,但数量再大,总会被抽完的。那就换种方法,比如说抽奖的时候增加奖券,或者奖券一直不变。这里采用奖券数量固定的方法,使其不会变动。

if (SuperGameMaster.TicketStock() < 5)

{

   ConfilmPanel confilm = this.ConfilmUI.GetComponent<ConfilmPanel>();

   confilm.OpenPanel("ふくびき券が足りません");

   confilm.ResetOnClick_Screen();

   confilm.SetOnClick_Screen(delegate

   {

       confilm.ClosePanel();

   });

   return;

}

已知抽奖的时候奖券是从SuperGameMaster.TicketStock()获取的,找到该方法。令其返回值为固定的数值。

右键编辑IL指令。

将其值修改为9000.

然后保存后打包并重新安装。

此时无论抽多少次,奖券都不再变化。

另一个就是修改三叶草的数量了。三叶草是该游戏中流行的货币,买东西都是需要该物品。同理找到CloverPointStock()方法。

将其返回值修改为8888.之后就可以随便买买买了,三叶草的数量也不会发生变化了。

0x03 汉化

然后就是进行汉化了。汉化的方法和上面的类似。首先搜索需要修改的文字。例如给小青蛙起名字的时候。直接进行字符串搜索。

然后修改为对应的中文就行了。

进入游戏查看

修改其他处的文字也是这样操作即可。当然这种修改方法比较慢,还有另外一种,直接将他人汉化过的dll文件复制进来,可以快速达到汉化的目的,也没有广告的烦恼了。

 

0x04 总结

这个游戏修改起来比较简单,首先判断为该游戏为Unity3d。然后使用dnSpy来对Assembly-CSharp.dll文件进行修改。根据特定的字符串找到需要修改的位置,修改后进行打包签名后即可。

0x05 游戏攻略

以下内容均来自知乎

作者:黄小秋
链接:https://www.zhihu.com/question/68733553/answer/305463907

呱是如何旅行的?

确定了地点之后,呱会开始旅行:

  1. 携带物品会决定蛙最长能旅行多久,6 ~ 72 小时不等。
  2. 初始体力由携带物品决定,以 100 为基数提升。
    *物品的具体属性参考下面的图鉴
  3. 经过图上的一条路(边)的时候,道路的地形属性和所携带的物品属性互相作用,会决定呱实际消耗的时间和体力。
  4. 路上可能会遇见小伙伴,会在之后的旅行中结伴而行,从而出现在明信片中。
  5. 根据路途属性,有一定概率会寄相关的明信片。
  6. 当体力不支的时候,蛙必须停下来休息 3 小时,休息完之后体力会恢复到 100。休息时间也算作旅行时间。
  7. 当到达目的或者旅行时间耗尽的时候,蛙就会回家。
    1. 回家时会携带三叶草和抽奖券。
    2. 如果在时间耗尽前到达了目的地,蛙会在此基础上带回当地特产和收藏品。

所以如果你的蛙很久都没回家,回家了也没有带土特产,可能是路途上多次体力不支,晕倒在路边。

呱在每条路上的耗时是怎么计算的?

设:
t_{\text{way}} 为当前道路 耗时
t_{\text{plus}} 为当前道路的 地形增加耗时
w 为当前道路的 地形,w\in \left\{ \text{Normal}, \text{Mountain}, \text{Sea}, \text{Cave} \right\}
n 为携带物品数量
E_{\text{Normal}}(x),E_{\text{Mountain}}(x),E_{\text{Sea}}(x),E_{\text{Cave}}(x),E_{\text{All}}(x) 依次为携带的第 x 件物品中所有具有 普通、山地、大海、洞穴、任意地形 移动速度 的效果值。

如果当前道路是 普通 地形,则耗时因叠加 移动速度 效果而减少:

t_w= t_{\text{way}}\times\prod_{x=1}^{n}{(0.01\times(100-E_{\text{Normal}}{(x)}))}\
或者 如果当前道路是 山地、大海、洞穴 地形,基础耗时不变,地形增加耗时因叠加 移动速度 效果而减少:
t_w=t_{\text{way}}+t_{\text{plus}}\times\prod_{x=1}^{n}{(0.01\times(100-E_{w}{(x)}))}\
如果携带了 乳蛋饼 (のびるのキッシュ)这种 全地形 移动速度 提升的物品,则会在此基础上再次叠加 移动速度 效果:
t_{\text{final}}=t \times\prod_{x=1}^{n}{(0.01\times(100-E_{\text{All}}{(x)}))}\
最终获得的 t_{\text{final}} 就是该条道路上的实际耗时。

呱离家出走了怎么办?

如果长时间没有准备便当,包里和桌上都没有食物,呱会愤然离家出走(どこかへ出かけています)。

这个时候在桌子上放上吃的,呱就会在 5~30 分钟内回家。

有趣的是,离家出走也算作成就计算中的旅行次数…emmmm。

道路有哪些属性?

连接不同地点之间的每条路 (edge) 都有以下几个属性

  • 地形
    四种地形分别是 普通、大海、山地、洞穴
  • 耗时
    途径这条路的体力和时间损耗,分为基础耗时和地形增加耗时
    呱需要跋山涉水自然会耗时久一点
  • 明信片概率
    明信片上不同元素出现的概率
    据说所有的地图元素都有真实原型
  • 遇见伙伴
    遇见特定伙伴的概率

每件物品都有什么效果?

奉上这张吐血整理的物品效果图鉴:

有五类不同的物品

  • 便当
    商店购买或者抽奖获得的食物
  • 幸运符
    除了四叶草和可以购买的幸 (tǔ) 运 (háo) 铃之外,都要抽奖获得
  • 道具
    商店购买
  • 特产
    呱旅游时获得
  • 收藏品
    特别的特产,通常在县府获得,无法使用

属性分类

  • HP
    • 最大时间(小时
      决定蛙的旅行时间
    • 初始体力提升(%)
      增加一开始一鼓作气能旅行的距离
    • 随机体力提升(%)
      随机额外增加体力提升的最高百分点
  • 物品几率
    • 三叶草
      获得三叶草数量
    • 额外随机三叶草
      随机额外获得的最大三叶草数量
    • 抽奖券
      奖券数量
    • 物品数量增多
      增加获得目的地收藏品的概率
  • 决定地区
    对应地区被选中的概率,如果值为 D 则可以直接决定目的地所在区域
  • 移动速度
    根据地形不同,提升移动速度,减少途径所耗费的时间,在相同旅行时间内可以走更远
  • 朋友
    遇到特定旅行伙伴的概率
  • 遭遇地形
    途径特定地形时候获得相应明信片的概率
  • FLAG 属性
    立一些特定的 Flag,主要影响成就系统,下面会写到

如何科学使用物品?

这里用几个例子来展示物品和路线结合的效果

  1. 决定想去的地区
    携带的便当和抽奖获得的护身符(お守り)可以提升选择特定地区的概率。 抽奖获得的车票(きっぷ)可以直接决定所去到的地区。
    例:想去北方,使用北国きっぷ。
  2. 影响路途的距离和时间
    带 最大时间 值高的食物吃走得远,带 体力提升 值高的食物吃走得快耗时少。
  3. 快速通过沿途路线的地形
    带有地区速度加成的食物或者道具,可以增加特定地形的移动速度。
    不同物品的 移动速度 效果可以叠加,详情查看上面的解释。
  4. 匹配在道路上遇到的伙伴
    如果在途径会遭遇伙伴的道路,特定物品可以增加实际遭遇概率
    例:
    抽奖抽到的黄色ぼうろ(饼干)可以增加路途中遇到螃蟹的几率。

综合运用(敲黑板!!!)

呱想去秋田県男鹿市看灯塔

  1. 在地图上找到 秋田県(3022) 在北方。
  2. 便当选择 あさつきのピロシキ (葱饼?)可以提升去北方的概率。
  3. 携带 青色のお守り (蓝色护身符)可以提升去北方的概率。
  4. 如果有 北国きっぷ(北方车票?)可以直接决定去北方,上面的便当和护身符可以换别的。
  5. 通过目的地概率表发现携带各类帐篷前往 3022 目的地的概率更高。
  6. 查看可能的路线发现从起始点 3000 到 3022 之间会途径很多山路。
  7. 携带 ハイテクテント (高级帐篷?)增加山地移动速度更显著。
  8. 如果还有空余,可以带上 よつ葉(四叶草)或者 幸運の鈴,提升带回物品的概率。

 

0x05 参考链接

  1. https://paper.seebug.org/519/
  2. https://www.zhihu.com/question/68733553/answer/305463907

本文由 华盟网 作者:AlexFrankly 发表,其版权均为 华盟网 所有,文章内容系作者个人观点,不代表 华盟网 对观点赞同或支持。如需转载,请注明文章来源。

0

相关文章

发表评论

电子邮件地址不会被公开。