《旅行青蛙》反编译/破解过程

时间:2024-02-24 19:36:33

Copyright@M4x, 小学生 from 10.0.0.55

原文地址:

这篇博客是应学姐之邀给学弟学妹写的扫盲教程,较为基础

前言

破解旅行青蛙的初衷很简单,女朋友想养青蛙,三叶草长得太慢,作为一名二进制黑阔又不愿屈服于网上小广告成堆又不知道有没有后门的破解版,于是就参考知乎的高赞回答自己给旅行青蛙添加了无限三叶草和无限抽奖券的功能。

受桐姐之邀,给学弟学妹简单介绍一下反编译技术,以及反编译技术是怎么运用到破解旅行青蛙这款游戏上的,力求能够用通俗易懂的语言给对此感兴趣的同学讲解清楚。

何为反编译

我们知道,高级语言源程序经过编译生成可执行文件(事实上有预处理,编译,汇编,链接四步,这里笼统的概括为编译,这个过程在《程序员的自我修养》这本书中有详细的介绍),那么加上一个“反”字,也就是从可执行文件反向生成高级语言源码的过程。

听起来很简单但实际上反编译是逆向工程最核心最困难的一步,通常做不到把可执行文件逆向出高级语言源代码,只能转化成汇编程序,即使某些高级语言(C#,vb,python等)反编译出源代码相对简单,得到的代码也往往是被混淆过的。

上图是windows平台下强大的反编译工具OllyDbg,但也只能得到汇编级的代码。

对于部分C族语言(C/C++),借助IDA的HexRay插件可以得到近似源码的伪代码,但这些伪代码也往往是有错误的。

破解青蛙

但幸运的是,旅行的青蛙是基于Unity开发的.NET程序,对于.NET程序,反编译技术较为成熟。

首先解压旅行青蛙的apk

apk实际上就是一个压缩包,windows下把后缀.apk改为.zip即可解压,值得一提的是,word、excle、powerpoint等文件的实质也是压缩包,解压这些文件也会有很多好玩的事情发生。

通过解压后存在assets\bin\Data\Managed目录判断出游戏为Unity游戏,那么程序的主要代码就在assets\bin\Data\Managed\Assembly-CSharp.dll中

我们只需对Assembly-CSharp.dll进行反编译即可,这里使用的是dnspy工具,当然其他的.NET反编译工具如ILSpy也是可以的。

把Assembly-CSharp.dll拖到dnspy中,稍等片刻,即可得到旅行青蛙程序的目录树和源代码

这里需要说明一下,像这种既没有加壳保护,也没有代码混淆的程序实际上是很少存在的,这款程序几乎没有防护措施大概是因为日本程序员和国内程序员的风格不同。

那么我们应该怎么定位到关键代码呢?这里有一种很高效的方法:搜索关键字符串

比如在抽奖时,提示抽奖券数量不足,那么我们就能确定抽奖的代码就在这串字符出现的代码附近,我们就搜索这个字(= =如果认识日文搜索这整句话更快)

搜到了两处,双击定位,发现第一处就是我们要找的代码(其实根据方法名PushRollButton也能推断出)

可以发现,这段代码就是抽奖的代码,若抽奖券数量<5(第一处箭头),则报错返回(二三处箭头),否则把抽奖券的数量自减5(第4处箭头)。

这样我们修改抽奖逻辑的思路就有很多了:

  1. 第一处箭头的<5改为<0,那么我们一直满足抽奖的条件,就可以一直抽奖
  2. 第四处箭头的-5改成0,那么每次抽奖后抽奖券的数量就不会减少,或者更进一步把-5改为+5,那么每次抽完奖,抽奖券的数量还会增加5
  3. 根据代码可以得知获取抽奖券数量方法的是TicketStock,可以针对TicketStock进行修改
  4. .....

这里主要介绍第3种方法,我们通过查看TicketStock方法,可以发现TicketStock方法是从ticket变量取值的

查找ticket,发现了初始化ticket的代码,同时发现了疑似初始化三叶草数量的代码

ctrl+shift+E修改此处代码,将69,70行的初始化均改为9999

点击编译保存修改,再点击 文件->全部保存(快捷键ctrl+shift+S)将修改保存回dll

然后将apk重新打包检测修改效果(因为apk实质就是压缩包,重新压缩,更改后缀为 .apk即可)

放到模拟器中检测修改效果(需要先卸载原版旅行青蛙

可以发现,三叶草和旅行券都已经被修改了

旅行券是999而不是9999是因为代码中有一处限制数量不超过999的判断,很容易发现

此外,虽然此时的apk可以再模拟器中运行,但实际上在真机上是不能运行的,原因和解决办法之后会提到

但再多的三叶草和抽奖券也有花光的一天,我们可以尝试再进一步修改。

通过查看ticket和clover的代码,可以找到返回三叶草数量和抽奖券数量的代码,直接把函数的返回值修改为9999,这样无论对三叶草和抽奖券做什么操作,都会返回9999,这样三叶草和抽奖券的数量就固定了,也就达到了无限三叶草和抽奖券的目的。

然后再ctrl+shift+S,重新打包apk即可。

解决签名

之前说过,重新打包好的apk并不能在真机上运行,是因为真机会检测安卓程序的签名,安卓的apk在签名时会对所有源文件进行一个hash运算,安装时hash校验失败就会拒绝安装

不能覆盖安装也是因为签名的原因,如果想继续存档,可以先把GameData.sav保存一份,安装好破解版的后重新导入即可

那么怎么绕过签名校验呢?我们只需要重新对apk进行签名即可。因为本人对apk的开发并不十分了解,在签名时还是花了一段时间研究的,后来发现可以通过apktool box工具包直接进行简单的签名

签名之后,即可真机运行

更进一步

更多修改

本次修改只修改了三叶草/抽奖券的初始值和返回值,但我们完全可以根据代码逻辑进行更多的修改,如:

  1. 修改抽奖几率
  2. 修改保存图片的上限
  3. 缩短旅行时间
  4. 修改获得珍稀照片的概率
  5. 对apk图标等资源进行修改
  6. ......

汉化

汉化也很简单,我们找到日文字符串后,修改为中文字符串即可,汉化是个体力活,这里就不再展示了。

......

声明

  • 本次修改目的是学习交流,请勿用于盈利