关于java类加密的思路以及结果

        曾经做过一段时间的java类加密处理,我最终得到的结论是类无法安全加密,比较恶心到想破解的人的方法就是多加判定,然后混淆。这里把加密的思路记录下来,并记录破解的方法,希望后续有相同想法的人拿来借鉴。

场景

        很多时候有些处理我们不想让别人知道,所以采用混淆的方法,但是混淆也带来了一定的麻烦,那就是不能调试,遇到问题查找是个麻烦,于是想到通过加密类来解决这个问题。

基本想法

        由于处理的手段不想让别人知道,那么处理的类需要被加密,最简单就是需要加密的类单独成一个jar包,然后这个jar包自己来做一个加密。这样jar包的文件结构就被破坏了,无法正常被打开。

        众所周知,java类是被classloader加载的,正常的classloader是没有解密的功能的,所以我们需要一个自定义的classloader来做这个事情。同时解密的方法也暴露了出来。这就带来了一个很大的麻烦,解密方法暴露了那就一点意义没有了。

        为了让解密的方法隐藏起来,想到了用jni的方式来做解密的过程,然后用jni反调java中classloader的defineclass方法来做类的加载。并且返回一个加载后的对象。

        下面介绍一些jni的常用用法

        jni对字符串的处理 https://my.oschina.net/xpbob/blog/600133

        jni对一维数组的处理 https://my.oschina.net/xpbob/blog/600453

        jni对二维数组的处理 https://my.oschina.net/xpbob/blog/600788

        jni对对象的处理 https://my.oschina.net/xpbob/blog/601237

        jni对不同平台的处理和异常处理 https://my.oschina.net/xpbob/blog/601251

        当时在多个平台上测试,并且记录了对应平台的编译方法 https://my.oschina.net/xpbob/blog/610809

破解的方法

       因为一直是围绕着classloader来做的,所以实际走的还是java的方法,使用jni解密只是比java解密更难处理一点,但本质也是利用defineclass的方法来做的,所以本质的问题没有改变,那就是得通过Java的机制来加载字节码到内存。所以比较简单的一个破解方法就是ClassFileTransformer,实现这个接口的话就会有如下的一个方法    

public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
            ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException

        从这个方法中可以看到classloader,className,classfileBuffer(字节码的byte数组),这里可以获取到类名和类的内容,只要写出来,加密的部分就被还原了。使用的方法就是javaagent,有兴趣的可以查看一下。

结论

        依靠在classloader上做手脚是达不到保密的,破解方法就在上面可能比较暴力,但是是一个最简单的破解方法。想简单一些还是依靠混淆。

 

 

 

         

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简要介绍<br>JAVA CLASS文件加密工具是一款专门为保护您的JAVA源代码而设计的软件。传统的JAVA代码保护方式通常是扰乱生成的CLASS文件,从而降低反编译生成的源代码的可读性;有的保护工具甚至能生成部分废代码(垃圾代码),使得反编译后的源码在重新编译时出现编译错误,不能直接生成CLASS文件。这种方法具有一定的效果,但是不能彻底保护您的JAVA源代码。 <br><br>JAVA CLASS文件加密工具对CLASS文件进行加密保护,加密密钥高达256位(bit,即:32字节),并采用多重加密的算法,既安全又高效。加密后的CLASS文件不可能被破解;反编译工具对加密后的CLASS文件无能为力,根本就不能处理! <br><br>运行方式<br>运行时,加密后的CLASS文件要能正常加载,需要使用我们提供的动态库hidea.dll。执行java时带上参数<br>-agentlib:<动态库文件所在路径>\hidea<br>注意:不要加文件后缀.dll,直接使用文件的名字部分(classloader)!<br><br>举例说明:例如,本加密工具安装在c:\hideasoft\java_protect,执行加密后的CLASS文件的命令行如下:<br>java -agentlib:c:\hideasoft\java_protect\hidea <您的CLASS及参数><br>应用场合<br>独立的应用程序(Application,自定义main方法),运行java时,带上参数-agentlib:<所在路径>\hidea <br>Tomcat等JAVA Web Server,修改启动脚本,把执行java的命令行加上参数-agentlib:<所在路径>\hidea <br>JBOSS等JAVA Application Server(应用服务器),修改启动脚本,把执行java的命令行加上参数-agentlib:<所在路径>\hidea <br>适用环境操作系统:Windows 98/2000/XP 等Windows系统 <br>JDK:1.5.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、付费专栏及课程。

余额充值