文档章节

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

xpbob
 xpbob
发布于 2016/11/13 17:06
字数 778
阅读 110
收藏 1

        曾经做过一段时间的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上做手脚是达不到保密的,破解方法就在上面可能比较暴力,但是是一个最简单的破解方法。想简单一些还是依靠混淆。

 

 

 

         

© 著作权归作者所有

xpbob

xpbob

粉丝 98
博文 96
码字总数 77864
作品 0
高级程序员
私信 提问
简单的安卓应用授权认证(JNI)

最近一直在做公司的一个安卓开发框架,含so库,接近尾声了,领导提出一个需求,要求使用这个框架的开发者必须有我们的授权才可以,但是对方发布的应用后又不能被此授权限制——要不然所有的应...

tnjin
2014/11/09
0
2
Objective-C 和 Java 下 DES加解密保持一致的方式

最近做了一个移动项目,是有服务器和客户端类型的项目,客户端是要登录才行的,登录的密码要用DES加密,服务器是用Java开发的,客户端要同时支持多平台(Android、iOS),在处理iOS的DES加密...

山哥
2012/04/19
0
5
ThreadLocal 基础知识

ThreadLocal是什么 · 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ...

向阳而生
2015/11/21
0
0
关于 Java 对象序列化您不知道的 5 件事

简介: Java 对象序列化(Java Object Serialization)在 Java 编程中是如此基本,以致很容易让人想当然。但是,和 Java 平台的很多方面一样,只要肯深入挖掘,序列化总能给予回报。在这个新...

红薯
2010/05/04
481
1
50 个 Java 开发常见错误及规避技巧 (Part 2)

在上一篇文章中,我们介绍了20种常见的编译器错误,并就如何避免这些错误做了说明。现在,我们将重点转移(尽管不只是专注于某一块),来探讨一下运行时异常以及导致这些异常的原因。接下来我...

oschina
2017/06/22
3.8K
1

没有更多内容

加载失败,请刷新页面

加载更多

HBase新建表报错 org.apache.hadoop.hbase.TableExistsException

之前安装了旧版本的hbase, 没有清理其在Zookeeper上的内容。 解决办法 stop-hbase.sh zkCli.sh >>> rmr /hbase >>> quit start-hbase.sh...

dreamness
16分钟前
1
0
大数据技术的应用现状与展望

本文是我即将由嵌入式底层驱动行业转入大数据研究领域的综述文章,案例摘自《程序员》电子期刊,由于初学者知识面较窄,查看文献量较少,因此后续还会在此基础上,继续跟踪并深入研究,为论文...

陈小君
22分钟前
1
0
NCRE考试感想 三级信息安全(上)

时间节点 报名时间:2017-06 考试时间:2017-09 查询成绩:2017-11   考试简述 满分100分,时间120分钟。题型有三种,选择题、综合题、应用题。   备考经验 题库是WLJY的,买了激活码。为了...

志成就
29分钟前
1
0
百度地图显示我的位置

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title></title><script type="text/javascript" src="jquery-1.8.2.min.js"></script></head><body><sec......

塔塔米
34分钟前
1
0
mysql mysql常用的常用函数

1. 数学函数 函 数 作 用 ABS(x) 返回x的绝对值 CEIL(x),CEILIN(x) 返回不小于x的最小整数值 FLOOR(x) 返回不大于x的最大整数值 RAND() 返回0~1的随机数 RAND(x) 返回0~1的随机数,x值相同返...

edison_kwok
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部