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

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

2024-2-11 17:54
23162

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

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

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

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

我的设备

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

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

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

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

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

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

图片描述

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

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

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

注入js

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

很好用,不多解释了

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

修改 package.json

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

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

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

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

现在来跟踪一下这个类

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

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

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

感谢开源项目的维护者们

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

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

$ pip3 install -U objection
$ pip3 install -U objection
# 创建虚拟环境
$ virtualenv myenv
# 激活虚拟环境
$ .\myenv\Scripts\activate
# 安装objection
$ pip3 install -U objection
# 创建虚拟环境
$ virtualenv myenv
# 激活虚拟环境
$ .\myenv\Scripts\activate
# 安装objection
$ pip3 install -U objection
$ objection patchapk --source '.\Mine Survival_v2.5.3.apk'
$ objection patchapk --source '.\Mine Survival_v2.5.3.apk'
$ adb install '.\Mine Survival_v2.5.3.objection.apk'
$ adb install '.\Mine Survival_v2.5.3.objection.apk'
$ frida-ps -U
  PID  Name
-----  ------
21709  Gadget
$ frida-ps -U
  PID  Name
-----  ------
21709  Gadget
Java.perform(function() {
    var module = Process.getModuleByName("libil2cpp.so");
    console.log(module.base);
})
Java.perform(function() {
    var module = Process.getModuleByName("libil2cpp.so");
    console.log(module.base);
})
$ frida -U Gadget -l .\hook.js
$ frida -U Gadget -l .\hook.js
$ npm install --save-dev frida-il2cpp-bridge
$ npm install --save-dev frida-il2cpp-bridge
{
  "main": "index.ts",
  "scripts": {
    "prepare": "npm run build",
    "watch": "frida-compile index.ts -w -o hook.js"
  },
  "dependencies": {
    "frida-il2cpp-bridge": "^0.9.0"
  }
}
{
  "main": "index.ts",
  "scripts": {
    "prepare": "npm run build",
    "watch": "frida-compile index.ts -w -o hook.js"
  },
  "dependencies": {
    "frida-il2cpp-bridge": "^0.9.0"
  }
}
import "frida-il2cpp-bridge";
 
Il2Cpp.perform(() => {
    console.log("Unity version: " + Il2Cpp.unityVersion);
});
import "frida-il2cpp-bridge";
 
Il2Cpp.perform(() => {

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

最后于 2024-2-11 17:59 被TubituX编辑 ,原因:
收藏
免费 12
支持
分享
最新回复 (16)
雪    币: 3594
活跃值: (31031)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2024-2-11 21:30
1
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
谢谢分享
2024-2-12 17:53
0
雪    币: 2447
活跃值: (10726)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错,但是图片很模糊
2024-2-19 16:52
0
雪    币: 2275
活跃值: (2041)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
你瞒我瞒 不错,但是图片很模糊
下次注意
2024-2-20 16:34
0
雪    币: 51
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2024-2-22 01:25
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark
2024-2-27 22:19
0
雪    币: 1140
活跃值: (1955)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
大佬,能不能讲讲定位additems的过程
2024-2-29 09:42
0
雪    币: 2275
活跃值: (2041)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
司徒废人 大佬,能不能讲讲定位additems的过程[em_27]
dump 后分析 Assembly-CSharp.dll,我是慢慢看过去的,看到Inventory类下的AddItems很容易想到这个就是添加物品到背包的方法了,调用验证一下就好啦
2024-2-29 20:38
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢 分享
2024-3-9 12:30
0
雪    币: 313
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
大佬,frida-il2cpp-bridge中如何打印变量是 System.Collections.Generic.List<实体类> list 的值呢?
2024-3-19 10:53
0
雪    币: 1372
活跃值: (5373)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
12
有这么好的不用root的工具不早说。
2024-3-19 10:56
0
雪    币: 2275
活跃值: (2041)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
mb_pweuvgeh 大佬,frida-il2cpp-bridge中如何打印变量是 System.Collections.Generic.List list 的值呢?
可以看一下wiki,或许对你有帮助
https://github.com/vfsfitvnm/frida-il2cpp-bridge/wiki
2024-3-20 20:58
0
雪    币: 6
活跃值: (117)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
大佬,我附加脚本为什么Failed to attach: unable to connect to remote frida-server: closed,frida-ps -U也有回显,机型问题吗?
2024-4-13 16:41
0
雪    币: 5
活跃值: (2675)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
有些游戏没法重新打包,会闪退或者重新打包失败
2024-4-15 09:17
0
雪    币: 6
活跃值: (117)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
函数原型:public static string xxxxx (string input) {}
我的函数:xxxx可以获取到,但是hook时不执行;
xxxxx .implementation = function (str): Il2Cpp.String {}
2024-4-16 20:02
0
雪    币: 12
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
遇到个问题, 在这里贴一个解决方案
如果在执行objection patchapk --source .\xxx.apk的时候遇到报错`UnicodeDecodeError: 'gbk' codec can't decode byte...`, 可以设置PYTHONUTF8=1后再运行
(注意powershell用的是$Env:  cmd用的是set)
2024-9-10 10:24
0
游客
登录 | 注册 方可回帖
返回
//