能否获取关联Java(TM) SE Binary的jar文件用JD-GUI反编译修改
结论
你的需求完全可以实现。你用JD-GUI找不到对应文件,本质是你打开的那个需要输入凭证的jar只是启动校验器,不是真正的游戏核心逻辑包,启动器校验通过后会释放/加载真正的游戏jar到独立路径运行,所以你直接反编译启动器文件当然找不到游戏代码。
第一步:定位真实运行的游戏核心jar
- 等程序通过Java(TM) Platform SE Binary启动完成后,打开任务管理器找到对应Java进程,右键选择「打开文件所在位置」,就能直接看到进程加载的所有文件,从中筛选.jar后缀的文件,复制到其他非临时目录备份——注意如果启动器是把核心jar释放到系统临时目录,一定要在程序运行期间复制,关闭程序后临时文件会被自动清除。
- 如果任务管理器定位到的是包装后的exe文件,直接打开系统自带的「资源监视器」,切换到CPU tab,在关联句柄搜索框选中对应的Java进程,搜索
.jar关键词,就能列出进程当前加载的所有jar包的完整路径,逐个复制出来排查即可。
第二步:反编译与代码修改
- 拿到核心游戏jar后,优先用
Recaf或Bytecode Viewer打开反编译,这两个工具对混淆代码、高版本Java字节码的兼容性远好于JD-GUI,不会出现JD-GUI那样无法打开、代码反编译错乱的问题。 - 不要直接用JD-GUI导出的源码修改重打包,JD-GUI反编译出的代码存在大量语法错误,根本无法正常编译。正确修改流程:
- jar本质是zip格式压缩包,直接用压缩软件打开即可,不需要额外解压
- 找到你要修改的逻辑对应的class文件,单独拖出来用反编译工具转成可读的Java代码
- 用和原游戏运行版本一致的JDK把修改后的Java代码重新编译为class文件
- 把新生成的class文件拖回jar包对应路径,覆盖原有class文件
- 如果jar包做了签名校验,覆盖文件后直接删除jar包内
META-INF目录下所有后缀为.SF、.DSA、.RSA的签名文件,否则修改后的jar会因为签名校验不通过无法启动。
特殊情况处理
如果定位到的jar包内class是加密的,直接反编译会得到乱码,你可以给Java进程加启动参数-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005开启调试端口,等类加载器解密字节码后,直接从内存中dump出真实的class文件再做修改即可。部分启动器会自带jar完整性校验,如果修改后启动报错,先反编译启动器jar找到校验逻辑,跳过校验步骤就能正常运行修改后的游戏包。

内容的提问来源于stack exchange,提问作者Nerfed
相关产品推荐
相关产品推荐

