NIGHT-z8a/ModPatcher
GitHub: NIGHT-z8a/ModPatcher
一款将 mod menu 自动注入 Android APK 的全流程自动化工具,覆盖反编译、Smali Hook、重打包到签名的完整流水线。
Stars: 0 | Forks: 0
# ModPatcher
将 mod menu 自动注入到 Android APK(.apks bundle)的自动化流水线。
## 流水线
```
extract → decompile → inject → build → zipalign → sign
```
## 快速开始
```
# 1. 安装 dependencies
bash setup.sh
# 2. 运行(支持 .apk 和 .apks)
python3 main.py --input game.apk --modmenu app-debug.apk
python3 main.py --input game.apks --modmenu app-debug.apk
```
## 环境要求
| 工具 | 用途 |
|------|---------|
| Python 3.10+ | 运行时环境 |
| apktool | 反编译 / 重新打包 APK |
| Java JDK | apktool 运行和签名的必要条件 |
| apksigner | 签名 APK(来自 Android SDK build-tools) |
| unzip | 解压 .apks bundle |
## 安装说明
### 选项 1:自动安装
```
bash setup.sh
```
### 选项 2:手动安装
```
# Ubuntu/Debian
sudo apt install -y default-jdk apktool unzip python3-pip
pip3 install pyyaml
# Arch
sudo pacman -S jdk-openjdk apktool unzip python-pip
pip install pyyaml
# macOS
brew install openjdk apktool unzip
pip3 install pyyaml
```
然后安装 [Android SDK 命令行工具](https://developer.android.com/studio#command-line-tools-only)并设置 `ANDROID_HOME`:
```
export ANDROID_HOME=$HOME/Android/Sdk
```
## 使用方法
### 基础用法
```
python3 main.py --input game.apks --modmenu app-debug.apk
```
### 使用选项
```
python3 main.py \
--input game.apks \
--modmenu app-debug.apk \
--output ./output \
--output-name MyMod.apk \
--arch armeabi-v7a \
--lib libGameHack.so
```
### 参数说明
| 标志 | 简写 | 必填 | 默认值 | 描述 |
|------|-------|----------|---------|-------------|
| `--input` | `-i` | 是 | — | 目标 .apk 或 .apks bundle |
| `--modmenu` | `-m` | 是 | — | mod menu APK(从源码构建) |
| `--output` | `-o` | 否 | `./output` | 输出目录 |
| `--output-name` | — | 否 | `ModMenu.apk` | 输出文件名 |
| `--arch` | `-a` | 否 | `arm64-v8a` | 目标架构:`arm64-v8a`、`armeabi-v7a`、`x86`、`x86_64` |
| `--lib` | `-l` | 否 | `libMyLibName.so` | mod menu 的 .so 文件名 |
| `--sdk-path` | — | 否 | auto | Android SDK 路径 |
| `--config` | `-c` | 否 | `config.yaml` | 自定义配置文件 |
| `--keep-work` | — | 否 | false | 构建后保留工作目录 |
## 项目结构
```
├── config.yaml # All configurable settings
├── main.py # Entry point
├── requirements.txt # Python dependencies
├── setup.sh # Dependency installer
├── patcher/
│ ├── extractor.py # .apks bundle extraction
│ ├── decompiler.py # apktool decompile / build
│ ├── injector.py # smali injection, manifest edits
│ ├── packager.py # zipalign + apksigner
│ └── utils.py # helpers, tool discovery
├── templates/
│ └── hooks/
│ └── modmenu.smali # Smali hook template
└── README.md
```
## 工作原理
1. **解压** — 如果是 `.apks`,则解压 bundle 以获取 `base.apk` 和拆分 APK。如果是 `.apk`,则直接使用
2. **反编译** — 使用 apktool 反编译基础 APK 和 mod menu APK
3. **注入** — 复制 mod menu 的 smali 文件、.so 库和游戏原生库
4. **Hook** — 将 `Main.Start()` 调用注入到游戏主 activity 的 `onCreate` 中
5. **清单文件** — 添加 `SYSTEM_ALERT_WINDOW` 权限和 `Launcher` 服务,移除拆分属性
6. **构建** — 使用 apktool 重新构建 APK
7. **Zipalign** — 将未压缩文件(.arsc、.so)对齐到 4 字节边界
8. **签名** — 使用 apksigner 签名(v2/v3 方案,保持对齐)
## 自定义
### 修改 Hook
编辑 `templates/hooks/modmenu.smali`:
```
invoke-static {p0}, Lcom/android/support/Main;->Start(Landroid/content/Context;)V
```
### 修改 Mod Menu 包名
如果你的 mod menu 使用了不同的包名,请更新 `config.yaml`:
```
hook:
template: "templates/hooks/modmenu.smali"
detection_pattern: "com/yourpackage/Main.*->Start"
```
### 添加更多权限
编辑 `config.yaml`:
```
manifest:
add_permissions:
- "android.permission.SYSTEM_ALERT_WINDOW"
- "android.permission.INTERNET"
```
## 故障排除
### "未找到 apksigner"
设置 `ANDROID_HOME` 或传入 `--sdk-path`:
```
export ANDROID_HOME=$HOME/Android/Sdk
# 或
python3 main.py --input game.apks --modmenu menu.apk --sdk-path /path/to/sdk
```
### "未找到 apktool"
安装它:https://apktool.org/docs/install
### "Unsigned short value 超出范围"
单个 dex 中的方法数过多。脚本会将 mod menu 文件放入编号最高的 `smali_classes` 目录中。如果游戏有多个 dex,这应该会自动生效。
### 游戏启动时崩溃
- 检查 .so 架构是否与你的设备匹配
- 验证 hook 是否被注入到了正确的 activity 中
- 使用 `adb logcat` 检查崩溃日志
## 许可证
本项目基于 [GNU 通用公共许可证 v3.0](LICENSE) 授权。
标签:apktool, APK修改, APK反编译, APK注入, APK签名, CSV导出, Mod菜单, Python, SO库注入, 云资产清单, 安卓, 安卓逆向, 应用篡改, 恶意代码分类, 无后门, 游戏破解, 目录枚举, 移动安全, 逆向工具, 逆向工程, 重打包