目录
简介
LGLTeam 的 Android-Mod-Menu 是一个强大的 Android 游戏浮动模组菜单模板,支持 il2cpp 和原生 Android 游戏,集成了 KittyMemory、MSHook、And64InlineHook 等工具,并提供 AY Obfuscator 进行字符串混淆。项目支持 Android 4.4.x 至 Android 12,兼容 ARMv7、x86 和 ARM64 架构。本教程将详细介绍安装、配置、APK 修改及使用方法,适合有一定 Android 开发基础的用户。
注意:本项目仅用于学习和研究,请勿用于非法或商业用途。使用不当可能引发法律问题,开发者不对任何不当使用负责。
前提条件
开始之前,请确保满足以下条件:
- 基础知识:
- 熟悉 Android 布局(XML 和 Java)。
- 了解 Android 开发环境(如 Android Studio)。
- 掌握基本的 C++ 和 JNI(Java Native Interface)知识。
- 了解 APK 文件结构、smali 文件及反编译工具(如 Apktool)。
- 开发环境:
- 一台运行 Windows、macOS 或 Linux 的电脑。
- 已安装 Android Studio 和 Android NDK。
- 准备 APK 反编译工具,如 APK Easy Tool、MT Manager 或 APK Editor Pro。
- 一台 Android 设备(建议 Android 5.0+,ARMv7 或 ARM64 架构)。
- 项目文件:
- 从 GitHub 下载 Android-Mod-Menu 源代码(https://github.com/LGLTeam/Android-Mod-Menu/releases)或克隆仓库:
git clone https://github.com/LGLTeam/Android-Mod-Menu.git
- 确保下载与设备 CPU 架构匹配的 NDK 文件(
ndk_arm.tar.gz
用于 ARMv7,ndk_arm64.tar.gz
用于 ARM64)。
- 从 GitHub 下载 Android-Mod-Menu 源代码(https://github.com/LGLTeam/Android-Mod-Menu/releases)或克隆仓库:
安装步骤
1. 下载和解压项目
- 访问 https://github.com/LGLTeam/Android-Mod-Menu/releases,下载最新版本的源代码 ZIP 文件,或通过 Git 克隆仓库。
- 解压到无空格或特殊字符的目录(如
C:\AndroidModMenu
或/home/user/AndroidModMenu
)。
2. 配置 Android Studio
- 打开 Android Studio,选择 File > Open,加载解压后的项目文件夹。
- 等待项目同步完成(初次可能需 1-2 分钟)。
- 配置 NDK:
- 进入 File > Project Structure > SDK Location。
- 在 Android NDK Location 中选择 NDK 文件路径(如
ndk_arm.tar.gz
或ndk_arm64.tar.gz
)。 - 确保 NDK 版本与设备架构兼容。
- 检查构建配置:
- 打开
app/build.gradle
,确认ndk
配置正确。 - 如需更改库名称,修改
app/src/main/jni/Android.mk
中的LOCAL_MODULE
,并更新MainActivity.java
中的System.loadLibrary("")
。
- 打开
3. 安装到设备
- 连接 Android 设备,启用 开发者选项 和 USB 调试。
- 在 Android Studio 中选择设备,点击 Run 构建并安装调试 APK(
app-debug.apk
)。 - 构建成功后,APK 将自动安装,文件位于
app/build/outputs/apk/app-debug.apk
。
提示:若使用 AIDE 等移动端 IDE,需安装模组专用版本的 AIDE(Play Store 版本不兼容),详见 Wiki。
修改游戏 APK
将模组菜单集成到目标游戏需要修改 APK 文件,以下是步骤:
1. 确定游戏主活动
- 使用 APK 反编译工具(如 APK Easy Tool 或 MT Manager)解编译目标游戏 APK。
- 打开
AndroidManifest.xml
,查找<action android:name="android.intent.action.MAIN"/>
,记录主活动路径(如com.unity3d.player.UnityPlayerActivity
)。
2. 集成模组菜单
推荐使用服务启动方法,避免同时使用两种方法。
方法 1:通过服务启动(推荐)
- 在
AndroidManifest.xml
的<application>
标签末尾添加服务(根据需要调整包名):<service android:name="com.android.support.Launcher" android:enabled="true" android:exported="false" android:stopWithTask="true" />
- 找到游戏主活动的 smali 文件(路径如
/com/unity3d/player/UnityPlayerActivity.smali
)。 - 在
onCreate
方法中添加:invoke-static {p0}, Lcom/android/support/Main;->Start(Landroid/content/Context;)V
- 保存修改。
方法 2:通过活动启动(仅在游戏检测模组时使用)
- 在
AndroidManifest.xml
中添加模组主活动:<activity android:configChanges="keyboardHidden|orientation|screenSize" android:name="com.android.support.MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
- 确保游戏原始主活动不再包含
<action android:name="android.intent.action.MAIN"/>
。 - 添加悬浮窗权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
- 若菜单未显示,检查设备悬浮窗权限设置。
3. 合并模组和游戏 APK
- 反编译
app-debug.apk
,提取模组的 smali 文件(位于smali/com/android/support
)。 - 将模组 smali 文件夹复制到游戏反编译目录的 smali 文件夹(建议放入最后一个
smali_classes
文件夹)。 - 重命名模组 dex 文件(如
classes.dex
改为classes2.dex
),确保 dex 顺序正确。 - 复制模组的
.so
文件到游戏的架构目录(armeabi-v7a
或arm64-v8a
),确保架构匹配。 - 使用 APK 工具重新编译并签名 APK,建议启用“自动签名”。
4. 测试修改后的 APK
- 安装签名后的 APK 到设备。
- 启动游戏,检查模组菜单是否显示。
- 若菜单未显示,使用 Android Studio 的 Logcat 查看错误日志,搜索解决方案。
使用模组菜单
1. 基本操作
- 游戏启动后,模组菜单以浮动窗口形式显示。
- 菜单支持开关、按钮、复选框等控件,可通过 Java 和 C++ 自定义功能。
- 日志路径(以下路径可能因设备而异,建议实际验证):
- Android 11 及以上:
/storage/emulated/0/Documents/ModMenuLogs/
- Android 10 及以下:
/storage/emulated/0/Android/data/<包名>/files/ModMenuLogs/
(修正:路径中的“包名”需替换为游戏实际包名,如com.example.game
)。
- Android 11 及以上:
2. 自定义功能
- 添加功能:
- 在
FloatingModMenuService.java
的localChanges(int featureNum, boolean toggle)
方法中定义逻辑。 - 使用负数(如
-1
)分配设置项,正数(如1, 3, 200
)分配模组功能。 - 示例:添加默认启用的复选框,使用
CheckBox_True_功能名称
。
- 在
- UI 自定义:
- 使用
GradientDrawable
设置圆角和边框:GradientDrawable gradientdrawable = new GradientDrawable(); gradientdrawable.setCornerRadius(20); gradientdrawable.setColor(Color.parseColor("#1C2A35")); gradientdrawable.setStroke(1, Color.parseColor("#32cb00"));
- 适配不同分辨率设备,考虑自动缩放。
- 使用
- 字符串混淆:
- 使用 AY Obfuscator 保护字符串:
OBFUSCATE("字符串") OBFUSCATE_KEY("字符串", 0x3FE63DF21A3B)
- 重要代码(如偏移量)存储在
.so
文件中,避免暴露在 Java/smali 中。
- 使用 AY Obfuscator 保护字符串:
3. 调试与优化
- 日志调试:
- 在 C++ 代码中添加日志(如
LOGD("调试信息")
),通过 logcat 查看:bool get_BoolExample(void *instance) { LOGD("BoolExample 1"); if (instance != NULL && featureHookToggle) { LOGD("BoolExample 2"); return true; } LOGD("BoolExample 3"); return old_get_BoolExample(instance); }
- 在 C++ 代码中添加日志(如
- 避免崩溃:
- 确保 hook 和 patch 的偏移量正确,检查游戏
.so
文件的架构。 - 使用
#if defined(__aarch64__)
区分 32 位和 64 位代码。
- 确保 hook 和 patch 的偏移量正确,检查游戏
- 保护代码:
- 启用 ProGuard 缩小代码,添加过滤器避免破坏项目。
- 避免使用不可信的加密工具,防止被误报为恶意软件。
- 公开源代码到 GitHub 可减少盗用风险。
常见问题
- 模组菜单未显示?
- 确认
SYSTEM_ALERT_WINDOW
权限已添加。 - 检查
onCreate
方法中的 smali 调用。 - 查看 logcat 日志,排查权限或架构问题。
- 确认
- 游戏崩溃?
- 确保
.so
文件位于正确架构目录。 - 检查 hook 偏移量是否正确。
- 使用 logcat 定位错误。
- 确保
- 方法数超限(65535)?
- 将模组 smali 文件放入
smali_classes2
或更高编号文件夹。 - 避免放入游戏主
smali
文件夹。
- 将模组 smali 文件放入
- 旧版 Android 布局问题?
- 部分游戏在无权限启动时使用旧布局,暂无解决方案。
- 如何获取支持?
- 查看 Wiki 的 FAQ(https://github.com/LGLTeam/Android-Mod-Menu/wiki/FAQ)。
- 在 Platinmods 或 UnknownCheats 论坛提问,官方不提供一对一支持。
注意事项
- 学习成本:需要 Android 开发和逆向工程知识,建议学习 JNI、smali 和 il2cpp。
- 社区规范:避免重复提问,初学者应查阅资料。恶意行为可能导致被屏蔽。
- 法律风险:不要用于受保护的游戏(如 PUBG、Free Fire),以免引发法律问题。
参考资源
- GITHUB:https://github.com/LGLTeam/Android-Mod-Menu