最近TapTap上有一款Roguelike的射击游戏Soul Knight火了,下载玩了一会儿,果然很好玩。但是只有骑士一个角色,其他角色都需要付费解锁,角色的养成也需要大量的宝石,对我这样的手残党来说真是很尴尬。但是Soul Knight是单机游戏,存档甚至购买记录都保存在本地,于是乎,偷个懒看看能不能破解,好玩了再入手正式版支持一下开发者:)。
一.尝试破解il2cpp版本
首先我去TapTap下载的最新的版本,解包后发现已经il2cpp过了,Managed文件夹下传统的Dll被编译到Lib下的libil2cpp.so了,这下子不能再修改Assembly-CSharp.dll了。之前没试过il2cpp的游戏修改,但是还是决定进行一系列的尝试,参考了IL2Cpp Dumper的教程Dump出了所有的类接口,下面是一个角色控制器:
// Namespace:
public class C01Controller // TypeDefIndex: 3435
{
// Fields
private RGHand hand2; // 0x84
private float in_skill_time; // 0x88
// Methods
public void .ctor(); // 4c5200 - 18233
private void Awake(); // 4c52b0 - 18234
private void Start(); // 4c5398 - 18235
private void Update(); // 4c53e8 - 18236
private void FixedUpdate(); // 4c5534 - 18237
public virtual void AutoLock(); // 4c5578 - 18238
public virtual void SwitchWeapon(); // 4c5604 - 18239
public virtual void RoleSkill(); // 4c5658 - 18240
public virtual void RoleSkillEnd(); // 4c5a18 - 18241
public virtual void RoleAtk(bool value); // 4c5bbc - 18242
virtual void DeadChild(); // 4c5e80 - 18243
public virtual void KillSomeOne(); // 4c5eb8 - 18244
private void Hand2Atk(); // 4c5f00 - 18245
private void Hand2AtkStop(); // 4c5f30 - 18246
public virtual void Dizzy(float the_time); // 4c5f60 - 18247
}
每行代码后的注释是其在so里的偏移,把libil2cpp.so放到IDA中去分析,找到对应的ARM 汇编片段如下(Awake函数):
STMFD SP!, {R4-R6,R10,R11,LR}
ADD R11, SP, #0x10
MOV R4, R0
LDR R0, =(_GLOBAL_OFFSET_TABLE_ - 0x4C52CC)
LDR R5, =0x44AE4
ADD R0, PC, R0 ; _GLOBAL_OFFSET_TABLE_
ADD R0, R5, R0
LDRB R0, [R0,#(byte_D8E17D - 0xD8E0B0)]
CMP R0, #0
BNE loc_4C52FC
LDR R0, =(_GLOBAL_OFFSET_TABLE_ - 0x4C52E8)
LDR R1, =0x13FB8
ADD R6, PC, R0 ; _GLOBAL_OFFSET_TABLE_
LDR R0, [R1,R6]
LDR R