反编译工具
jd-gui
JD-GUI,一个独立的图形实用程序,用于显示来自 CLASS 文件的 Java 源代码。
下载地址:http://java-decompiler.github.io/

如下图,Save All Sources 点击此按钮,保存所有反编译代码

缺点:经常某些代码反编译的有问题,某些新特性也不能很好的处理
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目录下的签名文件:

原理
签名:
认证:
签名步骤
生成密钥对
keytool -genkey -keystore ijvmkeys.keystore -keyalg RSA -validity 10000 -alias friend.keystore

查看密钥文件
keytool -list -v -keystore ijvmkeys.keystore

签名Jar包
jarsigner -verbose -keystore ijvmkeys.keystore friend.jar friend.keystore


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

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
