JoyelTheDev/JByteMod-ReForked

GitHub: JoyelTheDev/JByteMod-ReForked

一款基于原版 JByteMod 构建的增强型 Java 字节码编辑器与分析器,集成多种反编译器、混淆检测、反混淆工具和实时 JVM 附加功能。

Stars: 0 | Forks: 0

# JByteMod Remastered [![构建状态](https://ci.mdma.dev/api/badges/apkreader/JByteMod-Remastered/status.svg)](https://ci.mdma.dev/apkreader/JByteMod-Remastered) ![GitHub Release](https://img.shields.io/github/v/release/apkreader/JByteMod-Remastered) [![Codacy 徽章](https://app.codacy.com/project/badge/Grade/681e07293b4c491fae53c3be6d8469fe)](https://app.codacy.com/gh/apkreader/JByteMod-Remastered/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) ![GitHub Issues 或 Pull Requests](https://img.shields.io/github/issues/apkreader/JByteMod-Remastered) ![GitHub Issues 或 Pull Requests](https://img.shields.io/github/issues-pr/apkreader/JByteMod-Remastered) **JByteMod Remastered** 是一款基于原版 JByteMod 构建的增强型 Java bytecode 编辑器和分析器。它提供了一个直观的 GUI,用于加载、检查、编辑和保存 `.jar`、`.class` 和 `.apk` 文件,深度集成了多种反编译器、控制流可视化工具、混淆检测、反混淆实用程序、实时附加模式以及用于扩展的插件系统。 当前版本:**2.9.1** — 需要 JDK 21。 ## 功能 - **高级 Bytecode 编辑** — 在交互式列表中查看并直接修改 Java bytecode 指令。使用专用的编辑器编辑 opcodes、operands、LDC 常量、annotations、局部变量表和 try-catch 块。 - **多反编译器后端** — 在六种反编译器之间无缝切换:CFR、Procyon、Vineflower (Fernflower)、JD-Core、ASMifier 和 Koffee。 - **控制流可视化** — 生成任意方法的图形化控制流图 (CFG)。可将图表保存为图像。 - **混淆检测** — 分析已加载的类以检测名称混淆(非 ASCII 名称、关键字滥用、保留文件名)和方法级混淆模式(try-catch 块混淆、POP2 滥用、invokedynamic 技巧、字符串混淆)。检测来自 Allatori、Stringer 和 ZKM 的签名。 - **反混淆实用程序** — 运行自动清理过程,包括常量折叠、签名修复、行号/局部变量剥离、synthetic bridge 移除、非法 varargs 修复、goto 重排、trap handler 合并、无条件 switch 移除以及非法 annotation 移除。 - **Android APK 支持** — 加载并反编译 `.apk` 文件(通过 dex-translator)。APK 类将被转换为 ASM `ClassNode` 以便使用与 JAR 相同的界面进行检查。(目前尚不支持编辑和保存 APK。) - **实时附加与 Retransform** — 使用 Java Attach API 附加到正在运行的 JVM 进程,并实时重新转换已加载的类,无需重启目标应用程序。 - **搜索与替换** — 在整个加载的 JAR 中搜索 LDC 字符串常量、字段/方法引用和字符串模式。 - **Constant Pool 编辑器** — 浏览并修改常量池条目。 - **插件系统** — 使用自定义插件扩展该工具。将 `.jar` 文件放入 `plugins/` 文件夹;它会在启动时被加载,并拥有对类树、选定节点和菜单栏的完全访问权限。 - **拖拽支持** — 将 `.jar`、`.apk` 或 `.class` 文件直接拖到窗口上即可打开它们。 - **跨平台** — 可在 Windows、macOS 和 Linux 上运行。 - **本地化** — UI 字符串提供英语、德语、西班牙语、葡萄牙语(巴西)、俄语、简体中文、繁体中文和中文版本。 - **Discord Rich Presence** — 可选地在你的 Discord 状态中显示你正在编辑的文件。 - **自动更新检查** — 启动时检查 GitHub releases API 并通知你有新版本。 - **深色/浅色主题** — 由 DarkLaf (FlatLaf) 提供支持,并带有自定义的 RSyntaxTextArea 主题。 ## 要求 - **JDK 21 或更高版本**(用于包含 APK 支持和实时附加的完整功能集)。 - 另外提供了一个兼容 Java 8 的构建版本,但不支持 APK 加载或某些较新的功能。 ## 安装与使用 ### 下载 从 [releases 页面](https://github.com/apkreader/JByteMod-Remastered/releases) 下载最新的发布版 JAR。 ### 启动 ``` java -jar JByteMod-Remastered.jar ``` #### 命令行选项 | Flag | 长格式 | 描述 | |------|-----------|-------------| | `-f ` | `--file` | 启动时打开 `.jar` 或 `.class` 文件 | | `-d ` | `--dir` | 设置工作目录 | | `-c ` | `--config` | 指定配置文件名 | | `-?` | `--help` | 打印帮助信息并退出 | 示例: ``` java -jar JByteMod-Remastered.jar -f MyApp.jar ``` ### 打开文件 使用 `File > Open`,或者将 `.jar`、`.apk` 或 `.class` 文件拖拽到窗口上。 ## 界面概述 ### 类树(左侧面板) 列出已加载文件中的所有包、类和成员。点击方法或字段即可在编辑器中加载它。右键点击以查看上下文操作(复制名称、添加/移除成员等)。 ### Bytecode 编辑器(中间面板) 显示所选方法的指令列表 (`MyCodeList`)。双击指令可打开 `InsnEditDialogue` 进行编辑。支持所有 ASM 指令类型,包括 `LdcInsnNode`、`MethodInsnNode`、`FieldInsnNode`、`JumpInsnNode`、`TableSwitchInsnNode`、`LookupSwitchInsnNode` 等。 附加子面板: - **LVP(局部变量参数)** — 查看和编辑局部变量表。 - **TCB(Try-Catch 块)** — 查看和管理 exception handler 范围。 - **地址列表** — 显示 bytecode 偏移量。 ### 反编译器选项卡 切换到 `Decompiler` 选项卡以查看所选类的反编译 Java 源代码。从菜单或设置中更改活动的反编译器。该编辑器使用带有 Java 语法高亮的 RSyntaxTextArea。 ### 控制流面板 在 `Analysis` 菜单中,选择一个方法以生成其控制流图。该图使用 jgraphx 以分层布局进行渲染。使用 `Save` 将图表导出为图像。 ### 信息面板 显示有关所选类的元数据:版本、访问标志、超类、接口、字段计数和方法计数。 ### 搜索 使用工具栏上的搜索按钮或 `Edit > Search`,在已加载的 JAR 中搜索 LDC 字符串、字段/方法引用或其他模式。结果显示在搜索列表中。 ## 反编译器后端 | 后端 | 库 | 备注 | |---------|---------|-------| | CFR | cfr 0.152 | 优秀的通用反编译器 | | Procyon | procyon 0.6.0 | 处理 CFR 遗漏的一些边缘情况 | | Vineflower | vineflower 1.12.0 | Fernflower(IntelliJ 反编译器)的分支;对 lambda 支持良好 | | JD-Core | jd-core 1.1.3 | 快速、轻量 | | ASMifier | ASM util | 生成原始的 ASM API 代码,而不是 Java 源代码 | | Koffee | koffee 1.0.2 | Kotlin DSL 输出 | ## 混淆检测 `ObfuscationAnalyzer` 会扫描已加载 JAR 中的每个类和方法,并报告: **名称混淆类型**(类、方法、字段名): - 非 ASCII / 不可打印字符 - 使用 Java 关键字作为标识符 - Windows 保留文件名(`con`、`nul`、`aux`、`prn`) - 单字符或极短的名称 **方法混淆类型**: - Try-catch 块混淆 (TCBO) - POP2 滥用 - InvokeDynamic 技巧 - 字符串混淆(加密的 LDC 常量) 识别到的混淆器签名包括 **Allatori**、**Stringer**、**ZKM5** 和 **ZKM8**。 ## 反混淆实用程序 `DeobfusacteUtils` 提供了一组自动转换过程,你可以通过菜单将其应用于已加载的 JAR: | 实用程序 | 描述 | |---------|-------------| | `fixSignature` | 移除导致反编译器失败的无效 generic signatures | | `removeLineNumber` | 剥离 `LineNumberNode` 条目 | | `removeLocalVariable` | 剥离 `LocalVariableNode` 表 | | `removeSyntheticBridge` | 移除 synthetic bridge 方法 | | `removeIllegalVarargs` | 修复被错误标记的 varargs 方法 | | `foldConstant` | 计算并内联简单的常量表达式 | | `rearrangeGoto` | 简化无条件跳转链 | | `mergeTrapHandler` | 合并冗余的 exception handler 范围 | | `removeUnconditionalSwitch` | 简化只有一个可达 case 的 switch 语句 | | `removeIllegalInvisibleAnnotations` | 剥离格式错误的 invisible annotations | 这些实用程序的来源与 [java-deobfuscator](https://github.com/java-deobfuscator) 和 [Radon](https://github.com/ItzSomebody/Radon) 项目兼容。 ## Android / APK 支持 JByteMod Remastered 可以打开 `.apk` 文件进行检查和反编译。APK 处理流程如下: 1. APK 中的 DEX bytecode 使用 `dex-reader` 读取。 2. `dex-translator` 将 DEX 类转换为 JVM bytecode。 3. `Dex2ASMVisitorFactory` 将翻译后的 bytecode 桥接到 ASM `ClassNode` 对象中。 4. 所有标准的编辑面板(bytecode 列表、反编译器、CFG)均可在转换后的节点上工作。 ## 实时附加与 Retransform JByteMod Remastered 可以附加到正在运行的 JVM,并在不重启目标的情况下重新转换已加载的类: 1. 转到 `File > Attach to JVM`(或等效的菜单项)。 2. `AttachTask` 使用 `com.sun.tools.attach.VirtualMachine` 列出正在运行的 JVM 进程。 3. 选择一个进程;该工具会注入一个 agent JAR 并获取 `Instrumentation` 句柄。 4. 在 bytecode 编辑器中编辑类之后,使用 `File > Retransform` 通过 `RetransformTask` 将修改后的字节推入正在运行的 JVM 中。 ## 插件系统 插件是放置在工作目录的 `plugins/` 子目录中的 `.jar` 文件。在启动时,`PluginManager` 会扫描该文件夹,通过 `URLClassLoader` 将每个 JAR 加载到系统 classloader 中,并实例化任何继承了 `Plugin` 的类。 ### 插件 API 继承 `de.xbrowniecodez.jbytemod.plugin.Plugin`: ``` public class MyPlugin extends Plugin { public MyPlugin() { super("My Plugin", "1.0.0", "YourName"); } @Override public void init() { // Called once when the plugin is loaded } @Override public void loadFile(Map classes) { // Called whenever a new JAR/APK is opened } @Override public boolean isClickable() { return true; // Show a menu entry for this plugin } @Override public void menuClick() { // Called when the user clicks the plugin's menu entry } } ``` #### 提供的辅助方法(在 Plugin 基类中) | 方法 | 返回类型 | 描述 | |--------|---------|-------------| | `getCurrentFile()` | `Map` | 当前加载文件中的所有类 | | `getSelectedNode()` | `ClassNode` | 树中当前选定的类 | | `getSelectedMethod()` | `MethodNode` | 树中当前选定的方法 | | `getTree()` | `JTree` | 类树组件 | | `getMenu()` | `JMenuBar` | 应用程序菜单栏 | | `updateTree()` | `void` | 修改类之后刷新类树 | ## 从源码构建 ### 前置条件 - JDK 21 - Maven 3.9+ ### 构建 ``` mvn clean package ``` 输出的 JAR(包含所有 shaded 依赖项)被放置在 `target/` 目录中。 ### CI/CD 该项目使用了两个 CI 系统: - **GitHub Actions** (`.github/workflows/master.yml`):每次推送到 `master` 时使用 JDK 21(在 Ubuntu 24 上的 Microsoft 发行版)进行构建,运行 `mvn clean package`,根据自上次 tag 以来的 git 历史记录生成更新日志,并自动发布新的 GitHub Release。 - **Drone CI** (`.drone.yml`):使用 `maven:3.9.7-amazoncorretto-21` 进行构建,针对私有 Nexus 仓库进行身份验证以获取快照依赖项(ASM 9.10-SNAPSHOT)。 Dependabot 配置为每天检查 Maven 依赖项。 ## 关键依赖 | 库 | 版本 | 用途 | |---------|---------|---------| | ASM | 9.10-SNAPSHOT | Bytecode 读取、写入、tree API | | CFR | 0.152 | 反编译器后端 | | Procyon | 0.6.0 | 反编译器后端 | | Vineflower | 1.12.0 | 反编译器后端(Fernflower 分支) | | JD-Core | 1.1.3 | 反编译器后端 | | Koffee | 1.0.2 | Kotlin DSL编译器后端 | | jgraphx | 4.2.2 | 控制流图渲染 | | JFreeChart | 1.5.5 | 图表渲染 | | DarkLaf | 3.0.2 | 深色/浅色主题(基于 FlatLaf) | | RSyntaxTextArea | 3.5.1 | 带有语法高亮的源代码编辑器 | | DiscordIPC | 0.6.1 | Discord Rich Presence | | dex-translator | 2.3 | DEX 到 JVM bytecode 转换(APK 支持) | | Guava | 32.1.3-jre | 实用工具 | | Gson | 2.11.0 | JSON 解析(更新检查器) | | Lombok | latest | 样板代码减少 | | commons-io | 2.16.1 | 文件实用工具 | | commons-cli | 1.9.0 | 命令行参数解析 | | attach | 1.8 | JVM 附加 API | | Ant | 1.10.14 | 构建实用工具 | | Kotlin stdlib | 1.9.21 | Koffee 必需 | ## 项目结构 ``` src/main/java/ ├── de/xbrowniecodez/jbytemod/ # Remastered layer (main application) │ ├── Main.java # Entry point (singleton enum), CLI parsing │ ├── JByteMod.java # Application JFrame, state owner │ ├── asm/ # Custom ClassReader / ClassWriter │ ├── decompiler/ # ASMifier, JD-Core, Vineflower backends │ ├── discord/ # Discord Rich Presence integration │ ├── plugin/ # Plugin & PluginManager │ ├── ui/ # MemoryBar, NotificationManager, lists │ └── utils/ # BytecodeUtils, ClassUtils, UpdateChecker │ ├── me/grax/jbytemod/ # Original JByteMod layer │ ├── JarArchive.java # Map container │ ├── analysis/ # ObfuscationAnalyzer, InsnAnalyzer │ ├── decompiler/ # CFR, Procyon, Koffee backends; Decompilers enum │ ├── logging/ # Logging │ ├── res/ # Options, LanguageRes (i18n) │ ├── ui/ # ClassTree, MyCodeList, MyMenuBar, dialogues, graph │ └── utils/ # DeobfuscateUtils, InstrUtils, attach, task, asm │ ├── me/lpk/util/ # Utility library (AccessHelper, JarUtils, OpUtils) │ ├── com/javadeobfuscator/deobfuscator/ # Embedded deobfuscator / frame-based analyzer │ ├── analyzer/ # MethodAnalyzer, ArgsAnalyzer, frame types │ └── utils/ # TransformerHelper, Utils, PrimitiveUtils │ ├── de/xbrowniecodez/android/asm/ # APK support: Dex2ASMVisitorFactory │ └── org/objectweb/asm/ # Locally patched ASM classes (ClassWriter, tree nodes) src/main/resources/ ├── locale/ # i18n XML files (en, de, es, pt-br, ru, zh, zh-cn, zh-tr) └── resources/ # Icons, themes, opcode reference HTML, properties ``` ## 本地化 UI 使用 `src/main/resources/locale/` 下的 XML 资源文件进行本地化。支持的区域设置: | 代码 | 语言 | |------|----------| | `en` | English | | `de` | German | | `es` | Spanish | | `pt-br` | Portuguese (Brazil) | | `ru` | Russian | | `zh` | Chinese | | `zh-cn` | 简体中文 | | `zh-tr` | 繁体中文 | ## 许可证 JByteMod Remastered 在 **MIT License** 下授权。有关详细信息,请参阅 `LICENSE` 文件。 本项目的部分内容衍生自或包含以下项目的代码: - [java-deobfuscator](https://github.com/java-deobfuscator) — 反混淆实用程序和基于 frame 的分析器 - [Radon](https://github.com/ItzSomebody/Radon) — 额外的反混淆转换 - [ObjectWeb ASM](https://asm.ow2.io/) — 本地修补的 ClassWriter 和 tree node 类 (BSD-3-Clause) 有关第三方的许可证文本,请参阅 `src/main/resources/resources/LICENSES`。 ## 致谢 感谢所有贡献者、原版 JByteMod 作者,以及让这款工具得以实现的反编译器和 bytecode 分析库的维护者。
标签:JS文件枚举, URL提取, 云资产清单, 代码混淆与还原, 反编译, 域名枚举, 字节码编辑, 逆向工程