最近手机上装了一个竖版打飞机的游戏,叫Arcadium – Space Shooter,apk的包名为:com.ihgyug.arcadium
游戏里通过收集Gems或直接花钱购买可以换购很多不同型号的飞机,每个飞机的属性有十几种。在设置界面发现有个gift code的选项,也就是输入优惠码可以直接获取Gems。最初的想法是分析下游戏代码,把优惠码都找出来。
用jadx载入apk后发现java代码并没有包含游戏逻辑,原来游戏是采用unity引擎开发的,也就说代码逻辑都是通过.net实现并打包到了libil2cpp.so,字节码的元数据包含在global-metadata.dat文件中。Il2CppInspector可以用来处理这两个文件生成IDA Pro可以识别的符号,导入后就能研究游戏的具体实现了。
看来看去,发现优惠码其实在游戏资源文件level0当中,每个优惠码的格式如下:
08 00 00 00 41 72 63 61 64 69 75 6D
11 00 00 00 48 61 76 65 20 61 20 6E 69 63 65 20 67 61 6D 65 21 00 00 00
F4 01 00 00
字串开头是长度,字符串要四字节对齐,最后一个字段0x1F4意思是优惠码会赠送250枚Gems。针对目前最新版本的游戏(1.0.66)提取出来所有的优惠码如下:
- Arcadium: 500
- SantaGift: 250
- HalloweenGift: 250
- NewYearGift: 250
- Cheater: 1
- Downloadx500: 250
- SummerGift: 250
- FullRelease: 250
- Downloadx1000: 250
- Downloadx5000: 250
- Downloadx10000: 250
- AutumnGift: 250
- WinterGift: 250
- Downloadx50000: 250
- Downloadx100000: 500
- SpringGift: 250
为了多搞点Gems,我索性直接把level0文件里Cheater对应的数值改成了99999999,这样进入游戏输入优惠码就拿到了用不完的Gems。
Uranus是我最喜欢的战斗机,也是Gems可以买到的最贵的型号。为了让游戏再省事一点,我又找到了Uranus对应的资源文件,把飞机的属性加强了一下。
飞机的属性文件为sharedassets0.assets.split15,飞机的属性值格式如下:
06 00 00 00
|
55 72 61 6E|
75 73 00 00
05 00 00 00|00 00 80 40|00 00 80 40|00 00 80 3F
00 00 00 00|14 00 00 00|00 00 20 41|00 00 20 41
00 00 80 3F|00 00 00 40|CD CC CC 3D|00 00 00 00
00 00 00 00|00 00 00 00|00 00 00 00|01 00 00 00
00 00 00 00|10 00 00 00|00 00 C8 42|00 00 00 00
00 00 00 00|00 00 00 00|00 00 80 3F|00 00 00 00
最开始是飞机名称,接下来每个属性是4字节,有的是INT,有的是FLOAT。
我识别出来的属性有maxhp, damage, energygain, attackspeed, pickrange, droprate, glowyenemychance, bonusduration, debufduration, eneryleech, lifeleech, critchance.
这里我把maxhp, damage, bonusduration和debufduration稍微修改了一下。
最后再把修改好的level0和sharedassets0.assets.split15重新塞回apk里。重新签名安装到手机上,就可以进入游戏完虐NPC了。整个修改过程仅仅是改了两个资源文件,不碰代码就省去了繁琐的指令patch,改得很惬意。