- 示例游戏版本:
小米应用商店熊出没之熊大快跑(com.joym.xiongdakuaipao) v4.3.2
Dump 出 C# 类结构
- 从目标 APK 中复制
libs/CPU架构/libil2cpp.so和assets/bin/Data/Managed/Metadata/global-metadata.dat到本地 - 运行 Il2CppDumper 并依次选择
libil2cpp.so和global-metadata.dat - 导出的
dump.cs包含类结构和函数/属性偏移
寻找目标函数
- 进入
dump.cs - 已知货币是金币和钻石,所以搜索
Coin或者Diamond,找到ItemID,这是物品 ID 表 - 搜索
class Item,找到Item类,这是物品类,我们的目标是get_Count函数和itemId属性 - 已知有物品安全帽,所以搜索
Helmet,找到BearGameInfimpl类,这是玩家类,里面有相当多的函数可以 hook,我们的目标是IsHelmetIsDoubleCoin和IsMagnet函数 - 地址/偏移/物品表
函数/属性/物品 地址/偏移/ID BearGameInfimpl::IsHelmet 0x9A7F7C BearGameInfimpl::IsDoubleCoin 0x9A8304 BearGameInfimpl::IsMagnet 0x9A8554 Item::get_Count 0x132EE20 Item::itemId +0x10 物品 ID 钻石 1 金币 2 安全帽(Shield) 3 双倍金币 4 磁铁 20
Hook 目标函数
- 预留保存原函数指针
1 | bool (*O_BearGameInfimpl_IsHelmet)(void*) = nullptr; |
- 功能表
1 | bool permanentHelmet = true; |
- Hook
IsHelmetIsDoubleCoin和IsMagnet函数
这里只演示IsHelmet函数
1 | uintptr_t base = getBaseAddress(); |
- Hook
get_Count函数
这里以无限金币为例
1 | int H_Item_get_Count(void* instance) { |
加载 Hook
- 把我们编译出来的
libcrack.so复制到 APK 的lib/CPU架构/下 - 修改或注入 Dex/Java,使
il2cpp被加载后加载我们的libcrack.so
1 | System.loadLibrary("crack"); |
- 签名安装,大功告成
后记
- 如果打开后闪退,则需要绕过签名校验并检查代码是否有错误
- 如果无法登录或提示环境异常,需要把
com.joym.sdk.core.GGameActivity设为启动 Activity,并拦截登录窗口的弹出 - Demo: OneDrive