温馨提示:阅读本文你的电脑需要安装好apktool、signapk、.NET Reflector、dnSpy。他们都可以在github或吾爱云盘上获取。
一、APK结构
- 旅行青蛙是个Unity的游戏。简单说下Unity:Unity是一个用于制作3D游戏的C#框架,可以跨平台。也就是说旅行青蛙的核心游戏逻辑在Android和iOS上面是一样的代码。显然Android更容易让我们分析,本文先从APK的结构开始。
- 使用apktool反编译APK,发现Unity游戏的smali代码并没有太多的信息,基本都是调用Google的Ad接口之类的,或者是Google Play的应用内购买,就不需要太关心了。
- lib文件夹中主要都是Unity、Mono等的支持动态库so文件,也不是我们关心的对象。
- 经查阅资料可以得知,Unity游戏的主要逻辑代码存放于
assets/bin/Data/Managed
下的Assembly-CSharp.dll
动态库文件中,C#的dll文件不难分析,我们使用.NET Reflector和dnSpy进行分析和修改。
二、Assembly-CSharp.dll修改
- 使用.NET Reflector打开Assembly-CSharp.dll文件,观察整个dll的结构。发现几乎所有逻辑代码都位于“-”下面。
- 我们运行游戏,在商店点击购买昂贵的商品,或者在抽奖区抽奖,游戏会提示“みつ葉が足りません”和“ふくびき券が足りません”和。
- 虽然不懂日语,但是大概知道是提醒你不够的意思,因为电脑没有日文输入法,所以在.NET Reflector中尝试搜索汉字“足”,看看有什么结果。
- 结果找到了两个方法中提及了“足”字,分别是
SetInfoPanelData
方法和PushRollButton
方法。首先查看SetInfoPanelData
方法,发现是进行商品购买的逻辑代码,代码如下:
public void SetInfoPanelData(int shopIndex, Vector3 pos)
{
if (shopIndex == -1)
{
this.unsetCursor();
this.InfoPanel.GetComponent<InfoPanel>().SetInfoPanel(-1);
}
else if (Mathf.Abs(this.flickMove) <= (this.S_FlickChecker.flickMin / 3f))
{
if (this.selectShopIndex != shopIndex)
{
this.InfoPanel.GetComponent<InfoPanel>().SetInfoPanel(shopIndex);
this.selectShopIndex = shopIndex;
this.setCursor(pos);
SuperGameMaster.au