ClassFinal是一款java class文件安全加密工具

 

 

 

 

 

 

 

https://www.zhihu.com/question/307716152/answer/1213750791

作者:不带你这样的
链接:https://www.zhihu.com/question/307716152/answer/1213750791
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

正好这段时间研究了下,商用的不太清楚,开源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上有几个项目可以参考:

XJar:https://github.com/core-lib/xjar

字节码转换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要加密,需要主程序一起加密。

ClassFinal:Mr.K/ClassFinal

基于字节码转换java版,国人实现的,蛮不错的,对SpringBoot支持也好,其逻辑就是基于-agentJava:xxx.jar这一套原理,加密时对class文件做了两次处理,一次是对class文件的字节码完全加密,一次是对class文件混淆,这个混淆是保留成员和方法,对方法内部实现进行隐藏;解密时,判断如果该类是自己加密过的,找到完全加密的字节码进行解密,如果不是自己加密的就跳过。其对class文件混淆,就是方便类似SpringBoot等三方框架直接分析class文件。好处就是,如果你是个工具包,加密后给其它人,其他人编程时引用或者编译都不影响,但是运行时需要加密方支持,给出秘钥之类的。比较灵活和好用,也存在该方式的统一缺陷,不过其支持主程序jar加密,也支持单独的第三方工具jar加密。

JarEncrypthttps://github.com/zhikun0704/api-zxv-jvmit

基于字节码转换C/C++版,基于JVMIT个人实现的,稍微研究了下,其支持对部分class加密,对应一般java应用问题不大,但对于SpringBoot项目支持可能有些问题。因本人C++水平有限,没有深层次研究,希望有C/C++和java都熟悉的大神有空搞一套完整的。

个人目前借鉴ClassFinal方案,不过加密采用C/C++实现,把秘钥和算法隐藏了起来,不过还是绕不过该方式的统一缺陷,jar包加密了,但是解密程序是在java中运行,不能将解密程序自己也加密了,好的隐藏手段就是采用C/C++基于JVMIT实现类加载,但是本人C/C++水平有限。有幸接触过别的公司产品,是在C/C++中实现类加载器,而且运行良好,这篇算是这段研究成果的总结吧,大家可以借鉴下,如果有问题请大家指正,共同进步!互勉!

 

http://dandelioncloud.cn/article/details/2021012001012506099

 

ClassFinal是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework;可避免源码泄漏或字节码被反编译。

2.maven 插件方式声明
####


<plugin>
    <!-- https://gitee.com/roseboy/classfinal -->
    <groupId>net.roseboy</groupId>
    <artifactId>classfinal-maven-plugin</artifactId>
    <version>${classfinal.version}</version>
    <configuration>
        <password>39F0DD48D0C4493887028AE3C043D9D1D41D8CD98F00B204E9800998ECF8427ED41D8CD98F00B204E9800998ECF8427E</password><!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码-->
        <packages>com.chinamed,com.chinaSmed</packages>
        <cfgfiles>application.yml,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 39F0DD48D0C4493887028AE3C043D9D1D41D8CD98F00B204E9800998ECF8427ED41D8CD98F00B204E9800998ECF8427E'  -jar lma-api-3.5.54-encrypted.jar





java -javaagent:classfinal-fatjar.jar='-pwdname pass'  -jar lma--api-3.5.54-encrypted.jar

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件介绍 本工具是对java class文件进行加密保护防止反编译的工具!本工具全面支持linux/unix/windows操作系统。 继推出v1.0版本后,获得了用户大量的支持与的反馈,我们再次推出本v2.0版,对加密算法进行了更大的改进,安全性大大提升! 众所周知,java编译后的class文件是一种中间字节字文件, 很容易被反编译工具反编译,而传统的java源代码保护方法基本都是采用混淆的方式, 但这样会带来很多麻烦,而且也不能真正保护class文件, 本工具是对class文件进行加密,采用jni的方式解密运行, 加密算法达到256位,加密后的class文件不可能被破解,反编译工具也对加密后的class文件无能为力。 运行方式: 运行时,要能正确的加载加密后的class文件, 必须使用我们提供的动态链接库classloader.dll(windows操作系统)或者libclassloader.so(Linux、Unix操作系统)。 执行java时带上参数-agentlib:\classloader 注意此处不要后缀名.dll(或者.so)。 如: 我把classloader.dll放在C:\目录下; 运行加密后的class文件命令如下: windows下执行javajava -agentlib:C:\classloader Sample Linux、Unix等系列操作系统下执行javajava -agentlib:/home/classloader Sample 或者把libclassloader.so拷贝到如“/home/yzj/jdk1.6.0_23/jre/lib/i386/”这jdk的运行目录下, 然后执行java如:java -agentlib:classloader Sample 当然如果class文件加密,这样运行也不会出错! 应用场合: 独立的应用程序,运行java时,带上参数-agentlib:\classloader Tomcat、Jboss等Java application server修改启动脚本, 把执行java的命令行后面加上参数-agentlib:\classloader 适应环境: 操作系统:所有操作系统,Windows系统、Linux/Unix,只是运行时, 使用的动态链接库文件不一样而已,其它配置完全一样。 jdk必须1.5以上。 备注:如果下载站下载下来的程序有运行bug,请从上面两个下载地址更新软件。并给我们留言!谢谢... 升级提示:v2.1相比v2.0修改了一个注册bug。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值