首页
社区
课程
招聘
[原创]安卓真机无root环境下的单机游戏修改-IL2CPP
2024-2-11 17:54 15532

[原创]安卓真机无root环境下的单机游戏修改-IL2CPP

2024-2-11 17:54
15532
目录

前言

之前在研究手游的il2cpp修改,选取了 Mine Survival 作为研究对象,由于手上没有root的机子,于是安装在了MuMu模拟器上

但是很快发现了问题,游戏只有arm的lib,由于一系列原因,导致我无法获取到 libil2cpp.so 的基址
图片描述
在尝试了很多方法后都无法完美的解决这个问题,最终只能考虑安装在真机上了

但是目前并没有对机子root的打算,于是选取了注入 frida-gadget 的方案,这样没有root也可以对游戏进行修改了hhh

准备工作

基础工作不做过多介绍,学这个的应该都懂一点

我的设备

  • 安卓真机 - Redmi Note 8
  • 电脑 - Win10 专业版 22H2

推荐使用 scrcpy ,可以将手机画面投屏到电脑,延迟低

开始操作

注入 frida-gadget

介绍

可以手动操作去理解原理,参考这篇文章 Using Frida on Android without root

当然我这种懒汉肯定是选用自动化方案啦,使用 objection 来自动化patch apk

安装 objection

  • python版本 3.4+
  • pip3版本 9.0+
  • (可选)virtualenv版本 15+

全局安装

1
$ pip3 install -U objection

虚拟环境安装

为了防止冲突,推荐安装在虚拟环境里

1
2
3
4
5
6
# 创建虚拟环境
$ virtualenv myenv
# 激活虚拟环境
$ .\myenv\Scripts\activate
# 安装objection
$ pip3 install -U objection

patch apk

确定以下命令安装并且可用,将其添加到环境变量中

adb连接上安卓设备,执行下面的命令,就可以自动化的帮你patch好apk了

1
$ objection patchapk --source '.\Mine Survival_v2.5.3.apk'

图片描述

安装测试

Mine Survival_v2.5.3.objection.apk安装到手机

1
$ adb install '.\Mine Survival_v2.5.3.objection.apk'

然后执行一下 frida-ps -U ,有如下回显就是成功了

1
2
3
4
$ frida-ps -U
  PID  Name
-----  ------
21709  Gadget

测试一下,写个获取 libil2cpp.so 基址的脚本

1
2
3
4
Java.perform(function() {
    var module = Process.getModuleByName("libil2cpp.so");
    console.log(module.base);
})

注入js

1
$ frida -U Gadget -l .\hook.js

可以看到成功获取到了libil2cpp.so的基址
图片描述

frida-il2cpp-bridge

很好用,不多解释了

安装测试

执行下面的命令来安装 frida-il2cpp-bridge

1
$ npm install --save-dev frida-il2cpp-bridge

修改 package.json

1
2
3
4
5
6
7
8
9
10
{
  "main": "index.ts",
  "scripts": {
    "prepare": "npm run build",
    "watch": "frida-compile index.ts -w -o hook.js"
  },
  "dependencies": {
    "frida-il2cpp-bridge": "^0.9.0"
  }
}

新建一个 index.ts,测试一下输出unity版本

1
2
3
4
5
import "frida-il2cpp-bridge";
 
Il2Cpp.perform(() => {
    console.log("Unity version: " + Il2Cpp.unityVersion);
});

执行 npm run watch 编译一下,然后再开个console执行 frida -U Gadget -l .\hook.js

可以看到成功输出了unity的版本
图片描述

开始修改

通过分析 il2cppdumper dump后得到的 Assembly-CSharp.dll,发现了 Inventory 这个类,可以看到他有一个 AddItems 的方法,那我们就可以想办法调用他来添加物品
图片描述

现在来跟踪一下这个类

1
2
3
4
5
6
7
8
9
10
11
import "frida-il2cpp-bridge";
 
Il2Cpp.perform(() => {
    console.log("Unity version: " + Il2Cpp.unityVersion);
 
    const AssemblyCSharp = Il2Cpp.domain.assembly("Assembly-CSharp").image
    const Inventory = AssemblyCSharp.class("Inventory");
 
    Il2Cpp.trace(true).classes(Inventory).and().attach();
 
});

拾取一个物品,可以看到他调用了 Inventory::AddDropItem 这个方法
图片描述

那么就可以hook他来调用 Inventory::AddItems

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import "frida-il2cpp-bridge";
 
Il2Cpp.perform(() => {
    console.log("Unity version: " + Il2Cpp.unityVersion);
 
    const AssemblyCSharp = Il2Cpp.domain.assembly("Assembly-CSharp").image
    const Inventory = AssemblyCSharp.class("Inventory");
    const AddDropItem = Inventory.method("AddDropItem");
 
    // Il2Cpp.trace(true).classes(Inventory).and().attach();
 
    AddDropItem.implementation = function (item): boolean {
        // bool AddItems(int id, int amount)
        this.method("AddItems").invoke(115, 999);
 
        const result = this.method<boolean>("AddDropItem").invoke(item);
        return result;
    };
});

拾取物品,可以看到我们拥有了许多核导弹(喜)
图片描述

完结撒花

感谢开源项目的维护者们

frida-il2cpp-bridge 还是很强大的,可以去学习一下

写的可能有点乱,有问题还请指出hh


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2024-2-11 17:59 被TubituX编辑 ,原因:
收藏
点赞10
打赏
分享
最新回复 (15)
雪    币: 19431
活跃值: (29092)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2024-2-11 21:30
2
1
感谢分享
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_ldbucrik 2024-2-12 17:53
3
0
谢谢分享
雪    币: 1744
活跃值: (8728)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
你瞒我瞒 2024-2-19 16:52
4
0
不错,但是图片很模糊
雪    币: 1159
活跃值: (910)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
TubituX 2024-2-20 16:34
5
0
你瞒我瞒 不错,但是图片很模糊
下次注意
雪    币: 51
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
路西菲尔lxfe 2024-2-22 01:25
6
0
感谢分享
雪    币: 62
活跃值: (566)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2024-2-27 22:19
7
0
mark
雪    币: 710
活跃值: (1415)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
司徒废人 2024-2-29 09:42
8
0
大佬,能不能讲讲定位additems的过程
雪    币: 1159
活跃值: (910)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
TubituX 2024-2-29 20:38
9
0
司徒废人 大佬,能不能讲讲定位additems的过程[em_27]
dump 后分析 Assembly-CSharp.dll,我是慢慢看过去的,看到Inventory类下的AddItems很容易想到这个就是添加物品到背包的方法了,调用验证一下就好啦
雪    币: 3674
活跃值: (3853)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 2024-3-9 12:30
10
0
感谢 分享
雪    币: 313
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_pweuvgeh 2024-3-19 10:53
11
0
大佬,frida-il2cpp-bridge中如何打印变量是 System.Collections.Generic.List<实体类> list 的值呢?
雪    币: 1412
活跃值: (4209)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2024-3-19 10:56
12
0
有这么好的不用root的工具不早说。
雪    币: 1159
活跃值: (910)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
TubituX 2024-3-20 20:58
13
0
mb_pweuvgeh 大佬,frida-il2cpp-bridge中如何打印变量是 System.Collections.Generic.List list 的值呢?
可以看一下wiki,或许对你有帮助
https://github.com/vfsfitvnm/frida-il2cpp-bridge/wiki
雪    币: 6
活跃值: (107)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_kx64744 2024-4-13 16:41
14
0
大佬,我附加脚本为什么Failed to attach: unable to connect to remote frida-server: closed,frida-ps -U也有回显,机型问题吗?
雪    币: 1
活跃值: (2128)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_范迪塞尔 2024-4-15 09:17
15
0
有些游戏没法重新打包,会闪退或者重新打包失败
雪    币: 6
活跃值: (107)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_kx64744 2024-4-16 20:02
16
0
函数原型:public static string xxxxx (string input) {}
我的函数:xxxx可以获取到,但是hook时不执行;
xxxxx .implementation = function (str): Il2Cpp.String {}
游客
登录 | 注册 方可回帖
返回