Jar包反编译整理

Jar包反编译整理反编译工具 jd guiJD GUI 一个独立的图形实用程序 用于显示来自 CLASS 文件的 Java 源代码 下载地址 http java decompiler github io 如下图 SaveAllSourc 点击此按钮 保存所有反编译代码缺点 经常某些代码反编译的有问题 某些新特性也不能很好的处理 CFRcfr 是一个非常强大的 java 反编译器 支持 java5 java8 的新特性 如枚举 lambda 表达式等 下载地址 https www benf or

反编译工具

jd-gui

JD-GUI,一个独立的图形实用程序,用于显示来自 CLASS 文件的 Java 源代码。

下载地址:http://java-decompiler.github.io/

image.png
如下图,Save All Sources 点击此按钮,保存所有反编译代码
image.png
缺点:经常某些代码反编译的有问题,某些新特性也不能很好的处理







CFR

下载地址:https://www.benf.org/other/cfr/

反编译命令
java -jar cfr-0.151.jar java7_jar.jar --outputdir D:/Java/tmp




java -jar cfr-0.150.jar Client.class


--aexagg (boolean) --aexagg2 (boolean) --aggressivedoextension (boolean) --aggressivesizethreshold (int >= 0) default: 15000 --allowcorrecting (boolean) default: true --analyseas (One of [DETECT, JAR, WAR, CLASS]) --arrayiter (boolean) default: true if class file from version 49.0 (Java 5) or greater --caseinsensitivefs (boolean) default: true --clobber (boolean) --collectioniter (boolean) default: true if class file from version 49.0 (Java 5) or greater --commentmonitors (boolean) default: false --comments (boolean) default: true --decodeenumswitch (boolean) default: true if class file from version 49.0 (Java 5) or greater 去除switch对枚举支持的语法糖 --decodeenumswitch false --decodefinally (boolean) default: true --decodelambdas (boolean) default: true if class file from version 52.0 (Java 8) or greater 去除lambda表达式的语法糖 --decodelambdas false --decodestringswitch (boolean) default: true if class file from version 51.0 (Java 7) or greater --dumpclasspath (boolean) default: false --eclipse (boolean) default: true --elidescala (boolean) default: false --extraclasspath (string) --forbidanonymousclasses (boolean) default: false --forbidmethodscopedclasses (boolean) default: false --forceclassfilever (string, specifying either java version as 'j6', 'j1.0', or classfile as '56', '56.65535') --forcecondpropagate (boolean) --forceexceptionprune (boolean) --forcereturningifs (boolean) --forcetopsort (boolean) --forcetopsortaggress (boolean) --forcetopsortnopull (boolean) --forloopaggcapture (boolean) --hidebridgemethods (boolean) default: true --hidelangimports (boolean) default: true --hidelongstrings (boolean) default: false --hideutf (boolean) default: true --ignoreexceptions (boolean) default: false --ignoreexceptionsalways (boolean) default: false --importfilter (string) --innerclasses (boolean) default: true --instanceofpattern (boolean) default: true if class file from version 58.0 (Java 14) or greater, or experimental in 58.0 (Java 14) --j14classobj (boolean) default: false if class file from version 49.0 (Java 5) or greater --jarfilter (string) --labelledblocks (boolean) default: true --lenient (boolean) default: false --liftconstructorinit (boolean) default: true --lomem (boolean) default: false --methodname (string) --obfuscationpath (string) --outputdir (string) 结果输出目录 --outputpath (string) --override (boolean) default: true if class file from version 50.0 (Java 6) or greater --previewfeatures (boolean) default: true --pullcodecase (boolean) default: false --recordtypes (boolean) default: true if class file from version 58.0 (Java 14) or greater, or experimental in 58.0 (Java 14) --recover (boolean) default: true --recovertypeclash (boolean) --recovertypehints (boolean) --relinkconststring (boolean) default: true --removebadgenerics (boolean) default: true 去除泛型的语法糖 --removebadgenerics false --removeboilerplate (boolean) default: true --removedeadconditionals (boolean) --removedeadmethods (boolean) default: true --removeinnerclasssynthetics (boolean) default: true --rename (boolean) default: false --renamedupmembers (boolean) default: Value of option 'rename' --renameenumidents (boolean) default: Value of option 'rename' --renameillegalidents (boolean) default: Value of option 'rename' --renamesmallmembers (int >= 0) default: 0 --showinferrable (boolean) default: false if class file from version 51.0 (Java 7) or greater --showversion (boolean) default: true --silent (boolean) default: false --skipbatchinnerclasses (boolean) default: true --staticinitreturn (boolean) default: true --stringbuffer (boolean) default: false if class file from version 49.0 (Java 5) or greater --stringbuilder (boolean) default: true if class file from version 49.0 (Java 5) or greater --stringconcat (boolean) default: true if class file from version 53.0 (Java 9) or greater --sugarasserts (boolean) default: true --sugarboxing (boolean) default: true 去除自动装箱和拆箱的语法糖 --sugarboxing false --sugarenums (boolean) default: true if class file from version 49.0 (Java 5) or greater 去除枚举的语法糖 --sugarenums false --switchexpression (boolean) default: true if class file from version 57.0 (Java 13) or greater, or experimental in 56.0 (Java 12) --tidymonitors (boolean) default: true --tryresources (boolean) default: true if class file from version 51.0 (Java 7) or greater --usenametable (boolean) default: true --usesignatures (boolean) default: true --help (string) 

修改Jar包工具

jclasslib bytecode viewer

jclasslib bytecode viewer 是一个可以可视化已编译Java类文件和所包含的字节码的工具。 另外,它还提供一个库,可以让开发人员读写Java类文件和字节码。

下载地址:https://github.com/ingokegel/jclasslib/releases

在这里插入图片描述

编辑

Jar包签名

某些Jar包中包含代码签名,修改Jar包后需要重新签名,需要用到JDK自带工具keytool
若不重新签名,会出现JarVerifier错误。




META-INF目录下的签名文件:
image.png

原理

签名:Jar包反编译整理

认证:

Jar包反编译整理

签名步骤

生成密钥对

keytool -genkey -keystore ijvmkeys.keystore -keyalg RSA -validity 10000 -alias friend.keystore
Jar包反编译整理

查看密钥文件

keytool -list -v -keystore ijvmkeys.keystore
Jar包反编译整理

签名Jar包

jarsigner -verbose -keystore ijvmkeys.keystore friend.jar friend.keystore
Jar包反编译整理
Jar包反编译整理
FRIEND_K.SF文件:






Signature-Version: 1.0 SHA1-Digest-Manifest-Main-Attributes: QHukAYw2MtCop4vlrhjJDDro1fQ= Created-By: 1.6.0_12 (Sun Microsystems Inc.) SHA1-Digest-Manifest: YePdyFc1+FVdY1PIcj6WVuTJAFE= Name: com/yfq/test/friend/Friend$1.class SHA1-Digest: mj79V3+YKsRAzxGHpyFGhOdY4dU= Name: com/yfq/test/friend/Friend.class SHA1-Digest: tqPfF2lz4Ol8eJ3tQ2IBvvtduj0= 

Jar验证

jarsigner -verify friend.jar和jarsigner -verify stranger.jar
Jar包反编译整理

JCE(加密)供应商的相关Jar包

是JCE供应商(provider)的相关Jar,有可能报JCE cannot authenticate the provider BC
这是由于JCE供应商相关Jar包,必须签名两次,第一次必须是Oracle,第二次是CA。




官方说明:https://www.oracle.com/java/technologies/javase/getcodesigningcertificate.html

绕过Oracle签名

安装OpenJDK

下载地址:https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot

集成到java工程

工程下目录/lib 增加demo.jar

pom依赖配置:

<dependency> <groupId>demo 
      groupId> <artifactId>demo 
       artifactId> <version>1.0.0 
        version> <scope>system 
         scope> <systemPath>${project.basedir}/lib/demo.jar 
          systemPath>  
           dependency> 

构建插件:

<plugin> <groupId>org.springframework.boot 
      groupId> <artifactId>spring-boot-maven-plugin 
       artifactId> <configuration> <includeSystemScope>true 
        includeSystemScope>  
         configuration>  
          plugin> 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226024.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午8:01
下一篇 2026年3月17日 上午8:01


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号