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

前言

之前在研究手游的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

 

 

相关推荐

  1. Root做klipper上位教程

    2024-03-10 12:02:07       76 阅读
  2. rk3568 11 修改android id

    2024-03-10 12:02:07       35 阅读
  3. 源码环境编译多module app

    2024-03-10 12:02:07       100 阅读
  4. 为什么逆向手机要root

    2024-03-10 12:02:07       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-10 12:02:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-10 12:02:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-10 12:02:07       87 阅读
  4. Python语言-面向对象

    2024-03-10 12:02:07       96 阅读

热门阅读

  1. Word Game

    Word Game

    2024-03-10 12:02:07      43 阅读
  2. kafka集成外部系统

    2024-03-10 12:02:07       39 阅读
  3. sql执行计划需要关注那些内容?

    2024-03-10 12:02:07       43 阅读
  4. rust的 || 是什么,怎么使用?

    2024-03-10 12:02:07       47 阅读
  5. MongoDB聚合运算符;$dateToString

    2024-03-10 12:02:07       48 阅读
  6. CSS:让动画流畅生动的缓动函数

    2024-03-10 12:02:07       40 阅读
  7. Vue/cli项目全局css使用

    2024-03-10 12:02:07       43 阅读
  8. Qt之插件

    2024-03-10 12:02:07       43 阅读
  9. 从重庆——看未来数字化发展与趋势

    2024-03-10 12:02:07       48 阅读
  10. 设计模式 单例模式

    2024-03-10 12:02:07       39 阅读
  11. c++单例模式和call_once函数

    2024-03-10 12:02:07       44 阅读
  12. CSS教程(1)——CSS介绍

    2024-03-10 12:02:07       43 阅读
  13. 值传递和引用传递

    2024-03-10 12:02:07       37 阅读
  14. 利用SQL Server 进行报表统计的关键SQL语句与函数

    2024-03-10 12:02:07       40 阅读
  15. 【前端】尚硅谷Webpack教程笔记

    2024-03-10 12:02:07       46 阅读
  16. rabbitMQ

    rabbitMQ

    2024-03-10 12:02:07      41 阅读