DecompilerMC核心原理:Mojang映射文件转换与反编译流程

📅 2026/7/22 20:36:10 👁️ 阅读次数 📝 编程学习
DecompilerMC核心原理:Mojang映射文件转换与反编译流程

DecompilerMC核心原理:Mojang映射文件转换与反编译流程

【免费下载链接】DecompilerMCThis repository allows you to decompile any minecraft version that was published after 19w36a without any 3rd party mappings, you just need to execute the script or the executable (see releases)! Thanks mojang to have published proguard mappings. Archived since unobfuscated jar are now released!项目地址: https://gitcode.com/gh_mirrors/de/DecompilerMC

DecompilerMC是一款强大的Minecraft反编译工具,它能自动将特定版本的Minecraft客户端或服务器代码进行反编译和重映射,无需第三方映射文件。本文将深入解析其核心工作原理,包括Mojang映射文件的转换流程和完整的反编译步骤,帮助开发者理解如何将混淆的游戏代码转化为可读的Java源码。

反编译流程概览:从混淆代码到可读源码

DecompilerMC的工作流程主要分为五个关键阶段,每个阶段环环相扣,最终实现从混淆Jar包到可执行Java代码的转换。整个过程利用了Mojang官方发布的ProGuard映射文件,结合SpecialSource和CFR/Fernflower等工具完成代码还原。

核心工作流程图解

Minecraft Jar包 → [下载映射文件] → [转换映射格式] → [重映射Jar] → [删除依赖] → [反编译] → 可读Java代码
  • 输入:Minecraft官方混淆Jar包(客户端或服务器)
  • 输出:位于/src/<版本号>/<客户端/服务器>目录下的可读Java源码

关键步骤解析:Mojang映射文件的处理与应用

1. 映射文件下载:获取Mojang官方ProGuard映射

DecompilerMC首先从Mojang服务器获取指定版本的官方映射文件。这些映射文件记录了混淆后的类名、方法名与原始名称的对应关系,是反编译的基础。

main.py中,get_mappings()函数负责这一过程:

  • 从版本清单(version.json)中提取映射文件URL
  • 将映射文件下载到/mappings/<版本号>/<客户端/服务器>.txt路径
  • 支持断点续传,已存在的文件不会重复下载

2. 映射格式转换:ProGuard到TSRG格式的转换

Mojang提供的映射文件采用ProGuard格式,而SpecialSource工具需要TSRG格式的映射文件。DecompilerMC通过convert_mappings()函数完成这一关键转换:

  • 核心转换逻辑

    • 解析ProGuard格式的类、方法和字段映射
    • 将类名从.分隔转换为/分隔的内部形式(如net.minecraft.clientnet/minecraft/client
    • 处理数组类型和泛型签名,确保类型信息完整
    • 生成TSRG格式文件保存到/mappings/<版本号>/<客户端/服务器>.tsrg
  • 关键代码实现

    # 映射文件转换核心代码片段 def convert_mappings(version: str, side: SideType, quiet) -> None: version_side_path = (PATH_TO_ROOT_DIR / "mappings" / version / f"{side}.txt") with open(version_side_path, 'r') as inputFile, open(PATH_TO_ROOT_DIR / "mappings" / version / f"{side}.tsrg", 'w+') as outputFile: for line in inputFile.readlines(): if line.startswith('#'): # 跳过注释行 continue deobf_name, obf_name = line.split(' -> ') # 类映射处理 if not line.startswith(' '): outputFile.write(remap_file_path(obf_name)[1:-1] + " " + remap_file_path(deobf_name)[1:-1] + "\n") # 方法和字段映射处理 else: # 解析方法签名和参数类型 # ... outputFile.write(f'\t{obf_name} ({variables}){method_type} {function_name}\n')

3. Jar包重映射:使用SpecialSource还原类名

获取并转换映射文件后,DecompilerMC使用SpecialSource工具对原始Jar包进行重映射,将混淆的类名、方法名替换为有意义的名称:

  • 执行流程

    1. 验证/lib/SpecialSource-1.11.4.jar是否存在
    2. 调用Java命令执行SpecialSource:
      java -jar SpecialSource-1.11.4.jar --in-jar <原始Jar> --out-jar <重映射Jar> --srg-in <TSRG映射文件> --kill-lvt
    3. 生成临时重映射Jar包到/src/<版本号>-<客户端/服务器>-temp.jar
  • 关键参数

    • --kill-lvt:移除局部变量表信息,减少反编译后代码的冗余

4. 依赖清理:去除第三方库代码

Minecraft Jar包中包含大量第三方依赖库(如Guava、LWJGL等),这些代码并非Minecraft核心逻辑。delete_dependencies()函数通过以下步骤清理这些依赖:

  • 将临时Jar包解压到/tmp/<版本号>/<客户端/服务器>目录
  • 保留核心包(netmojangcom/mojang等),删除其他第三方库
  • 重新打包清理后的类文件,生成精简版重映射Jar

5. 代码反编译:CFR与Fernflower的选择

DecompilerMC支持两种主流反编译器,用户可根据需求选择:

CFR反编译器(默认)
  • 专注于代码反编译,速度快(约60秒)
  • 命令行参数:--caseinsensitivefs true --silent true
  • 输出目录:/src/<版本号>/<客户端/服务器>
  • 自动删除反编译过程中生成的summary.txt文件
Fernflower反编译器
  • 支持资产文件反编译,更完整但速度较慢(约200秒)
  • 关键参数:-dgs=1(保留泛型签名)、-hdc=0(显示空构造函数)
  • 反编译后自动解压Jar包并移除临时文件

工具依赖与目录结构

DecompilerMC的高效工作依赖于多个关键组件和特定的目录结构:

核心依赖文件

  • 反编译器/lib/cfr-0.152.jar(CFR)和/lib/fernflower.jar(Fernflower)
  • 重映射工具/lib/SpecialSource-1.11.4.jar
  • 主程序main.py(Python 3.7+)

关键工作目录

  • /versions:存储下载的Minecraft Jar包和版本清单
  • /mappings:存放原始和转换后的映射文件
  • /src:反编译后的Java源码输出目录
  • /tmp:临时文件目录,可安全删除

实际应用:快速上手反编译流程

基本使用步骤

  1. 克隆仓库git clone https://gitcode.com/gh_mirrors/de/DecompilerMC
  2. 运行程序python3 main.py
  3. 选择版本:输入版本号(如1.18.2)或使用latest获取最新版
  4. 选择端:客户端(client)或服务器(server)
  5. 等待完成:反编译结果将保存在/src/<版本号>/<端>目录

命令行示例

  • 静默反编译最新版本:python3 main.py --mcv latest -q
  • 反编译快照服务器端:python3 main.py --mcversion snap --side server

常见问题与注意事项

  • 版本支持:仅支持19w36a之后的快照版本和1.14.4之后的正式版
  • Java环境:需安装Java 8或更高版本,并配置到环境变量
  • 网络要求:首次运行需要联网下载Minecraft Jar包和映射文件
  • 输出目录:若目标目录已存在,可选择覆盖(--force)或创建新目录(--forceno

结语:Minecraft反编译的最佳实践

DecompilerMC通过巧妙结合Mojang官方映射文件和开源反编译工具,为开发者提供了一条从混淆代码到可读源码的便捷路径。其核心价值在于自动化处理了映射格式转换和代码重映射这两个复杂环节,让反编译过程变得简单高效。

随着Mojang开始发布未混淆的Java版Jar包,该工具虽然已进入归档状态,但对于需要处理旧版本Minecraft代码的开发者仍然具有重要参考价值。通过理解其工作原理,开发者可以更好地掌握Java代码反编译和混淆处理的核心技术。

【免费下载链接】DecompilerMCThis repository allows you to decompile any minecraft version that was published after 19w36a without any 3rd party mappings, you just need to execute the script or the executable (see releases)! Thanks mojang to have published proguard mappings. Archived since unobfuscated jar are now released!项目地址: https://gitcode.com/gh_mirrors/de/DecompilerMC

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考