Java标准Jar包(adall.jar)反编译修改后重编译失败求助
混淆Jar反编译重编译问题解决思路
- 核心问题就是混淆后的Jar反编译出的源码,变量名被替换成无意义标识符,加上工具没法完整还原局部变量类型、方法重载的准确调用关系,才导致javac编译报错。
- 优先用Procyon的正确姿势:启动时加上
--deobfuscate参数,它会尝试给混淆后的标识符做合理重命名,还能尽可能保留泛型、局部变量的类型信息,生成的源码可编译性比JD-Core高不少。 - 手动修复编译错误:
- 碰到类型不匹配的变量,用
javap -c -p -s 类名.class反编译原Jar里的对应类字节码,看Descriptor字段里的实际类型,再修正源码里的变量声明。 - 重载方法调用有歧义的,根据字节码里的方法签名,在源码里加强制类型转换或者明确参数类型,让编译器能识别正确的方法。
- 碰到类型不匹配的变量,用
- 跳过源码编译,直接改字节码:如果只是小范围修改,用ASM、ByteBuddy这类字节码操作库,或者JD-GUI自带的Bytecode Editor,直接编辑字节码指令,不用纠结变量名问题,改完直接替换原Jar里的类文件就行。
- 关于Krakatau的调试:如果生成的JIL代码编译失败,盯着报错里的局部变量索引、类型错误,手动调整JIL里的变量声明和指令,确保局部变量表的索引和类型对应,再用
krakatau assemble重新编译。 - 打包注意事项:重打包时一定要保留原Jar的
MANIFEST.MF文件(如果有主类、Class-Path等声明),用命令jar cvfm new_adall.jar MANIFEST.MF ./编译后的类文件目录/*完成打包。
内容的提问来源于stack exchange,提问作者koolvcvc
相关产品推荐
相关产品推荐

