大佬们我有一个问题想问一下
java吧
全部回复
仅看楼主
level 4
卡莲(我们大剑)
楼主
大佬们我有一个问题想问一下,我自己写了个classloader,打算实现对于class加密后的解密,但是我如何替换掉jvm默认的类加载器,在网上有看到通过参数来配置你们觉得可靠吗
Run JVM with java.system.class.loader property:
java -Djava.system.class.loader=myClassLoader myApplication
2021年06月23日 10点06分
1
level 4
卡莲(我们大剑)
楼主
顶
2021年06月23日 10点06分
2
level 9
肥猴丶
额…不同的classloader加载的jar包不一样的。
2021年06月23日 11点06分
3
卡莲(我们大剑)
只需要替换系统类加载器即可,但是不知道怎么替换
2021年06月24日 02点06分
level 9
肥猴丶
你可以了解一下类加载器的机制,
最基本的BootstrapClassLoader用于加载rt.jar包下的class类,
但是你通过java去获取类加载器的时候,是获取不到这个类加载器的,它是由jvm内部提供的类加载器。目的是为了保护rt.jar包的安全性。
然后回到我之前说的,你要清楚你要加载的类是哪个jar包的?
如果是rt.jar,自己去看openjdk的源码,然后尝试修改。
如果是javax.***包的,是找的ExtentionClassLoader ..
然后到AppClassLoader。
=。=还有就是,class加密解密的操作,你是部分的自定义jar包加密?如果是这样,你的自定义classloader的思路是没问题的,如果你是说,我在打包的时候,把所有的class类都加密了,那我的建议是走javaagent。
2021年06月24日 02点06分
4
卡莲(我们大剑)
1.我因为这个事确实翻遍了类加载器各种博客和视频,不能说特别了解,也算是熟悉了 2.我并不想直接修改rt.jar,这样就会是我的项目绑定了这个java环境 3.class加密是指我的所有类(自定义类加载器除外)进行加密,你说走javaagent我不是很懂 4.我现在已经解决了方法是通过配置java的启动参数就可以了
2021年06月24日 03点06分
卡莲(我们大剑)
@卡莲(我们大剑)
java -Djava.system.class.loader=com.o.read -jar D:\MESelf\ideaPojects\untitledClass\out\artifacts\untitledClass_jar\untitledClass.jar
2021年06月24日 03点06分
卡莲(我们大剑)
我觉得的吧获取不到BootstrapClassLoader原因更多可能是因为他是拿c++,c编写的
2021年06月24日 03点06分
level 9
肥猴丶
你再看看我说的安全性问题,然后你这个方法为什么跑不通
2021年06月24日 04点06分
5
卡莲(我们大剑)
我刚刚说我已经解决了,更多难点在于怎么替换
2021年06月24日 06点06分
肥猴丶
@卡莲(我们大剑)
。。。。 你这么想,如果你自己随便写个类加载器,就可以替换掉java自己的类加载器,尤其是BootstrapClassloader。如果java允许你这样操作,你知道会带来什么问题么? 类加载的过程,除了加载类的字节信息以外,中间还可以篡改类的信息。这个操作是不安全的,所以java不允许这样做。
2021年06月24日 06点06分
肥猴丶
@卡莲(我们大剑)
我上面说了,如果是其他的jar包,那么自己用classLoader指定一下就可以了。如果你还是在听了我关于java安全问题的介绍之后,还是打算通过替换类加载器的方案来实现你的需求的话,那我还不知道怎么去解释了。你继续。。
2021年06月24日 06点06分
卡莲(我们大剑)
@肥猴丶
上面我说我只需要替换系统类加载器( AppClassLoader),BootstrapClassloader是由c++,c编写的我想替换我也不会写,而且我也说我不喜欢直接修改rt.jar,导致项目与环境绑定,我只能说你没太理解我的需求,我解密我自己的加密class,为啥要替换BootstrapClassloader,我的优先选择是系统类加载器
2021年06月24日 07点06分
level 9
肥猴丶
反编译跟类加载是两码事....什么叫安不安全是处于编译阶段?你编译的class文件,我通过类加载的时候,不能修改class字节信息么?类加载不单单是加载的过程。还可以对class信息修改,java的类加载安全性问题是避免这个地方出现问题。所以才有了BootstrapClassloader加载rt.jar这个硬性要求。 才有双亲委派这个机制。
算了。。您慢慢折腾,你先把类加载弄清楚先。。当然你也可以当我没说。
2021年06月24日 07点06分
6
卡莲(我们大剑)
如果照你这么说我确实不怎么懂类加载,但是我也解释了我的逻辑,通过自定义类加载器,在装载之前对于class的字符流进行解密,而且我也说我已经做完了,我愿意继续和你说的主要原因是你也算是唯一一个回我的人,所以我也会和你说这么多,这class加密的方案也算我在网上找的方案
2021年06月24日 07点06分
肥猴丶
@卡莲(我们大剑)
嗯,搞定就行,加油。
2021年06月24日 07点06分
level 12
大苹果123
貌似线程可以设置类加载器的,这样加载类时就可以做处理了
2021年07月02日 05点07分
8
卡莲(我们大剑)
确实可行,不过我需要连我的主类也要解密,所以只能通过配置虚拟机来实现了,貌似也可以主类不加密
2021年07月02日 06点07分
大苹果123
@卡莲(我们大剑)
你的要求tomcat有点类似。 你可以在最外层线程设置自定义类加载器,这样你的项目整个都是自定义类加载器了。
2021年07月02日 07点07分
卡莲(我们大剑)
@大苹果123
差不多,我的方式是通过启动参数直接替代了jvm的类加载器,所有的类都用我的加载了,但是这样会和tomcat有冲突,tomcat会再次覆盖类加载器,我的就没了,导致类加载不了,所以只能用在不用tomcat的项目了
2021年07月02日 08点07分
1