ClassFinal是⼀款javaclass⽂件安全加密⼯具
正好这段时间研究了下,商⽤的不太清楚,开源jar加密分为两种⼀种代码混淆,⼀种字节码转换。
字节码混淆,主要思路就是的对类名,变量名和⽅法名,局部参数名进⾏替换,让其命名变得⽆意义,很难读懂,但不影响其逻辑,但对于有耐⼼的⼈,还是能看明⽩!具体实现是在编译前做的混淆,还是编译后做的混淆,这个没⽤过不太清楚。
字节码转换,分为两块,⼀块是加密,对编译后class⽂件进⾏字节码转换(可以采⽤加密算法,字节码异或运算或⾃⼰定义规则);⼀块是解密,就是在类加载的时候对加密的字节码进⾏解密。加密这块因为在本地对class⽂件字节码转换,⽐较简单,⽅式也随意;解密这块主要围绕类加载器来做⽂章,⼜可分为java版实现和C/C++版实现,java版主要基于-agentJava:xxx.jar,通过Premain-Class,向Instrumentation注⼊ClassFileTransformer实现,⾃⼰在ClassFileTransformer中对需要解密的class⽂件进⾏解密;C/C++主要使
⽤-agentpath:xxx.so,基于JVMTI通过C/C++实现,对类加载过程进⾏操作。
总体来说:代码混淆和字节码转换可以结合,例如,先代码混淆后,再对字节码加密,运⾏时对字节码解密。代码混淆,上⼿最简单,加密级别⽐较低,也容易破解。字节码转换,java版本对于java熟练⼈
员上⼿很快,加密级别⼀般,个⼈理解该⽅式⼀个缺陷就是对于想加密的内容加密了,但解密⽅式暴露了,如果能够隐藏好解密⽅式,加密安全系数还是蛮⾼;C/C++版加密级别最⾼,但需要对java和C/C++都很熟练,⽽且需要研究JVMTI相关知识,如果真的实现了基本⽆破解风险,不过对于SpringBoot等框架,其内部会直接分析class⽂件,有些坑需要解决。
另外⼀个问题就是,使⽤jar加密这块,需要确定好是对运⾏的主程序jar包加密,还是第三⽅jar加密,其还是有部分差异的。
在Github上有⼏个项⽬可以参考:
字节码转换java版,国⼈实现,稍微研究了下,不太深⼊,其内部是对class⽂件完全加密,其加密过程会对jar中META-
INF/MANIFEST.MF修改,将原有Main-Class修改为Jar-Main-Class,并增加Main-Class,启动Main-Class时,在原有类加载器的同层中,增加⼀个⾃定义的类加载器,通过该类加载器实现加密⽂件的解密,然后反射调⽤Jar-Main-Class对应类的main放,去启动应⽤。官⽹号称对SpringBoot应⽤⽀持,但是需要⾃⼰对框架部分编译打包。算是⽐较灵活,但还是存在该⽅式的统⼀缺陷。另外,因为其修改了Main-Class,所以只⽀持主程序jar加密,不能单独把第三⽅⼯具jar加密,如果第三⽅⼯具jar要加密,需要主程序⼀起加密。
java源代码加密ClassFinal:
基于字节码转换java版,国⼈实现的,蛮不错的,对SpringBoot⽀持也好,其逻辑就是基于-agentJava:xxx.jar这⼀套原理,加密时对class⽂件做了两次处理,⼀次是对class⽂件的字节码完全加密,⼀次是对class⽂件混淆,这个混淆是保留成员和⽅法,对⽅法内部实现进⾏隐藏;解密时,判断如果该类是⾃⼰加密过的,到完全加密的字节码进⾏解密,如果不是⾃⼰加密的就跳过。其对class⽂件混淆,就是⽅便类似SpringBoot等三⽅框架直接分析class⽂件。好处就是,如果你是个⼯具包,加密后给其它⼈,其他⼈编程时引⽤或者编译都不影响,但是运⾏时需要加密⽅⽀持,给出秘钥之类的。⽐较灵活和好⽤,也存在该⽅式的统⼀缺陷,不过其⽀持主程序jar加密,也⽀持单独的第三⽅⼯具jar加密。
基于字节码转换C/C++版,基于JVMIT个⼈实现的,稍微研究了下,其⽀持对部分class加密,对应⼀般java应⽤问题不⼤,但对于SpringBoot项⽬⽀持可能有些问题。因本⼈C++⽔平有限,没有深层次研究,希望有C/C++和java都熟悉的⼤神有空搞⼀套完整的。
个⼈⽬前借鉴ClassFinal⽅案,不过加密采⽤C/C++实现,把秘钥和算法隐藏了起来,不过还是绕不过该⽅式的统⼀缺陷,jar包加密了,但是解密程序是在java中运⾏,不能将解密程序⾃⼰也加密了,好的隐藏⼿段就是采⽤C/C++基于JVMIT实现类加载,但是本⼈C/C++⽔平有限。有幸接触过别的公司产
品,是在C/C++中实现类加载器,⽽且运⾏良好,这篇算是这段研究成果的总结吧,⼤家可以借鉴下,如果有问题请⼤家指正,共同进步!互勉!
ClassFinal是⼀款java class⽂件安全加密⼯具,⽀持直接加密jar包或war包,⽆需修改任何项⽬代码,兼容spring-framework;可避免
源码泄漏或字节码被反编译。
2.maven 插件⽅式声明
####
<plugin>
<!-- gitee/roseboy/classfinal -->
<groupId&seboy</groupId>
<artifactId>classfinal-maven-plugin</artifactId>
<version>${classfinal.version}</version>
<configuration>
<password>39F0DD48D0C4493887028AE3C043D9D1D41D8CD98F00B204E9800998ECF8427ED41D8CD98F00B204E9800998ECF8427E</password><!        <packages>com.chinamed,com.chinaSmed</packages>
<cfgfiles&l,application.properties</cfgfiles>
<excludes>org.spring</excludes>
<libjars>l-common-1.0.0.jar,x-api-1.0.0.jar,s-service-1.0.0.jar</libjars>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>classFinal</goal>
</goals>
</execution>
</executions>
</plugin>
机器吗获取:
启动⽅式:
windows
java -javaagent:/workback/zjjar.jar="-pwd 000000"  -jar lma--api-3.6.9-encrypted.jar
--linux
java -javaagent:classfinal-fatjar.jar='-pwd 39F0DD48D0C4493887028AE3C043D9D1D41D8CD98F00B204E9800998ECF8427ED41D8CD98F00B204E9800998E java -javaagent:classfinal-fatjar.jar='-pwdname pass'  -jar lma--api-3.5.54-encrypted.jar

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。