add README.md

This commit is contained in:
jiqiu2021
2025-06-26 21:18:00 +08:00
parent 680a93cba8
commit 7b7f6de828
16 changed files with 165 additions and 43 deletions

208
README.md
View File

@@ -1,65 +1,187 @@
# [Zygisk-MyInjector](https://github.com/jiqiu2022/Zygisk-MyInjector) # Zygisk注入器 - 动动手指轻松注入并隐藏你的SO文件
## 前言
作者在去年发布了[Zygisk注入模块的实现](https://bbs.kanxue.com/thread-283790.htm)成功实现了模块的自动注入和Riru隐藏功能。
最新开发进度:**多模块注入完成maps隐藏注入完成**并且修复了riru内存泄漏问题 现在仍然面临soinfo链表遍历无法隐藏的情况 然而,每次更换目标应用都需要重新编译,操作繁琐,导致用户采用率不高。为了解决这个问题,作者对项目进行了全面重构,带来了以下改进:
我会初步进行框架层面的hook进行隐藏进一步使用自定义linker来伪装成系统库的加载。 - **图形化界面**:告别命令行,操作更直观
- **一键安装**:面具模块快速部署
- **配套管理APP**:轻松管理注入配置
项目https://github.com/Perfare/Zygisk-Il2CppDumper 项目已完全开源包含面具模块、管理APP以及所有打包脚本并配置了GitHub CI自动构建。欢迎各位开发者贡献代码提交PR。
本项目在原项目基础上做局部更改,请支持原项目作者劳动成果 ### 版本规划
1. 安装[Magisk](https://github.com/topjohnwu/Magisk) v24以上版本并开启Zygisk - **v1.x**:专注功能添加,暂不考虑反检测
- **v2.x**实现各种检测绕过达到100%无痕注入
2. 生成模块 ## 致谢
- GitHub Actions
1. Fork这个项目
2. 在你fork的项目中选择**Actions**选项卡
3. 在左边的侧边栏中,单击**Build**
4. 选择**Run workflow**
5. 输入游戏包名并点击**Run workflow**
6. 等待操作完成并下载
- Android Studio
1. 下载源码
2. 编辑`game.h`, 修改`GamePackageName`为游戏包名
3. 使用Android Studio运行gradle任务`:module:assembleRelease`编译zip包会生成在`out`文件夹下
3. 在Magisk里安装模块 **项目地址**[https://github.com/jiqiu2022/Zygisk-MyInjector](https://github.com/jiqiu2022/Zygisk-MyInjector)
4. 将要注入的so放入到/data/local/tmp下修改为test.so 特别感谢以下项目和开发者(按时间顺序):
(部分手机第一次注入不会成功,请重启,再之后的注入会成功) - [Zygisk-Il2CppDumper](https://github.com/Perfare/Zygisk-Il2CppDumper) - 提供最原始的注入思路
- Riru - 提供隐藏思路
- 小佳大佬 - 提供App界面化的思路
- [soLoader](https://github.com/SoyBeanMilkx/soLoader) - 提供自定义linker注入的全部逻辑期待认识作者和作者一起继续完善
多模块注入已经开发完成: 如果对自定义linker感兴趣的大佬推荐soLoader作者的文章https://yuuki.cool/2025/06/15/CustomLinker/
## 使用教程
### 步骤一:下载并安装面具模块
1. 前往 [GitHub Release](https://github.com/jiqiu2022/Zygisk-MyInjector/tags) 页面下载最新版本的面具模块
本教程以 [v1.1.0](https://github.com/jiqiu2022/Zygisk-MyInjector/releases/tag/v1.1.0) 版本为例
2. 下载模块文件(如下图所示):
![CleanShot_2025_06_26_at_20_33_37](assets/CleanShot_2025_06_26_at_20_33_37-20250626203353-mvarjy3.png)
3. 安装到手机支持所有面具模块相关的APP如 KernelSU、APatch 等)
> **注意**如果您的APP不支持Zygisk注入请额外安装 Zygisk-Next 模块,否则可能导致注入失败。
### 步骤二准备SO文件并配置
#### 1. 添加SO文件
进入"SO文件管理",点击"增加SO文件"
![CleanShot_2025_06_26_at_20_36_35](assets/CleanShot_2025_06_26_at_20_36_35-20250626203644-vum10yb.png)
选择要注入的SO文件
![CleanShot_2025_06_26_at_20_37_10](assets/CleanShot_2025_06_26_at_20_37_10-20250626203718-fx50ptc.png)
本教程使用以下两个SO文件进行测试
- `libmylib.so`(全注入测试)
- `libgadget.so`(普通注入方式)
> **提示**后文将解释为什么自定义linker无法注入 `libgadget.so`。
#### 2. 处理原文件
选择SO后系统会询问是否删除原文件
![CleanShot_2025_06_26_at_20_38_42](assets/CleanShot_2025_06_26_at_20_38_42-20250626203859-532f217.png)
> **设计理念**此功能可防止某些APP扫描tmp目录中的SO文件进行风控检测。
添加成功后SO管理界面会显示已添加的文件
![CleanShot_2025_06_26_at_20_39_38](assets/CleanShot_2025_06_26_at_20_39_38-20250626204000-p3oe63m.png)
### 步骤三配置目标APP
本教程以珍惜大佬的Hunter为例演示配置过程。
1. 点击空白处,配置注入参数:
![CleanShot_2025_06_26_at_20_40_50](assets/CleanShot_2025_06_26_at_20_40_50-20250626204056-cn1613i.png)
2. 保存配置后,开启注入开关:
![CleanShot_2025_06_26_at_20_41_17](assets/CleanShot_2025_06_26_at_20_41_17-20250626204121-6k6wqym.png)
### 步骤四:验证注入效果
打开目标APP查看日志输出
![CleanShot_2025_06_26_at_20_42_17](assets/CleanShot_2025_06_26_at_20_42_17-20250626204224-gylrvtd.png)
成功打印"我已经成功加载",表明注入成功。
#### 测试Gadget注入
切换到gadget进行测试
![CleanShot_2025_06_26_at_20_43_27](assets/CleanShot_2025_06_26_at_20_43_27-20250626204331-wse9zyb.png)
> **特性**本注入模块支持同时注入多个SO文件。
![CleanShot_2025_06_26_at_20_44_09](assets/CleanShot_2025_06_26_at_20_44_09-20250626204414-lov146o.png)
注入成功:
![CleanShot_2025_06_26_at_20_44_19](assets/CleanShot_2025_06_26_at_20_44_19-20250626204426-2ubkjyi.png)
> **说明**由于使用的Hunter版本较旧可能无法检测到注入。建议使用新版本进行测试。
#### 测试其他注入方式
测试Riru Hide功能
![CleanShot_2025_06_26_at_20_46_07](assets/CleanShot_2025_06_26_at_20_46_07-20250626204610-d2o279q.png)
> **提示**:修改配置后,建议先关闭再开启注入开关,确保新配置生效。
![CleanShot_2025_06_26_at_20_46_45](assets/CleanShot_2025_06_26_at_20_46_45-20250626204649-sj0w84k.png)
Riru Hide成功生效。
测试自定义Linker加载
![CleanShot_2025_06_26_at_20_47_19](assets/CleanShot_2025_06_26_at_20_47_19-20250626204724-7dtm624.png)
加载成功:
![CleanShot_2025_06_26_at_20_47_34](assets/CleanShot_2025_06_26_at_20_47_34-20250626204744-v9hdf53.png)
## 编译指南
### 自动编译
参考项目中的 [CI配置文件](https://github.com/jiqiu2022/Zygisk-MyInjector/blob/main/.github/workflows/ci.yml)。
如果您fork了本项目只需在本地修改代码并push云端将自动编译。
### 本地编译
使用项目提供的 `build_all.sh` 脚本进行编译。
> **环境要求**需要Java 17环境。
## 工作原理
### 注入流程详解
1. **SO文件管理**
- 用户选择SO文件后APP自动将其复制到 `/data/adb/modules/module-name` 目录下进行统一管理
2. **配置生成**
- 完成APP配置后管理器在 `/data/adb/modules/module-name` 下创建config文件
- 面具模块启动时读取此配置执行SO加载
3. **注入激活**
- 开启注入时APP将管理器中的SO复制到目标APP目录并将config状态设置为开启
- 关闭注入时APP自动删除已复制的SO文件将config状态设置为关闭
## 为什么自定义linker不能注入gadget
``` ```
void hack_start(const char *game_data_dir,JavaVM *vm) { frida_KjnwyG_detect_location: assertion failed: (our_range != null)
load_so(game_data_dir,vm,"test"); Bail out! Frida:ERROR:../lib/KjnwyG/KjnwyG.vala:809:frida_KjnwyG_detect_location: assertion failed: (our_range != null)
//如果要注入多个so那么就在这里不断的添加load_so函数即可 Aborted
}
``` ```
因为gadget的init_array里面其中有一个函数尝试使用maps和soinfo获取到自己模块的信息防止递归调用。
但是自定义linker的soinfo和内存段都是自己分配的导致gadget找不到自己发生了断言失败我们可以简单的去掉断言但是可能造成其他bug后续作者会和小佳一起修复。
当然还有一种复杂的方法就是用注入的so的soinfo替换成要注入的so的多见于360等壳子等后续作者会实现。
目前正在开发的分支:
1. 使用Java的System.load加载so ## 后续更新计划
2. 注入多个so的分支(已完成) - **深度隐藏**联动面具模块提供maps等更深层次的隐藏功能
- **用户体验优化**
- 增加gadget配置一键生成功能
- 提供更友好的界面交互
- 支持批量配置管理
计划开发: ---
1. 第一步仿照Riru将注入的so进行内存上的初步隐藏可以对抗部分业务检测游戏安全相关已经补齐建议不要尝试已经开发完成 欢迎关注项目进展,期待您的贡献!
2. 第二步实现一个自定义的linker进行更深层次的注入隐藏
3. 第三步,搭配对应配套手机的内核模块对注入的模块进行进一步完美擦除,达到完美注入的目的
以此项目为脚手架的计划开发:
1. 一个全新的Frida框架保留大部分原生api并可以过任何相关注入检测
2. 一个全新的Trace框架高性能Trace速度是Stallker的60倍并且支持更全面的信息打印。具体效果可以参考看雪帖子
3. 一个全新的无痕调试框架支持像GDB一样调试没有ptrace痕迹两种思路进行无痕调试基于硬件断点以及基于VM

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 584 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 916 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 902 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 832 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 870 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 906 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 926 KiB