首页 / JAVA / java-加密的类加载器
java-加密的类加载器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-加密的类加载器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2674字,纯文字阅读大概需要4分钟。
内容图文
![java-加密的类加载器](/upload/InfoBanner/zyjiaocheng/661/4833b311719e4d1c953b70c1476850bc.jpg)
我使用Java中的“反向RSA”(使用私钥加密)创建了一个框架,并希望将其扩展为在运行时加载类.我知道这并不是防止我的代码被盗的有效保护措施,但是我的目标是防止(尽最大的努力)防止他人更改我的代码.
在过去的几个小时中,我一直在寻找一种在运行时加载类的方法(并在此处找到了一些答案,但是没有一个答案对我有帮助),仅给出了包含解密的JarFile的byteArray.我正在使用自定义的类加载器,该类加载器应该加载.class文件,您可以在下面看到:
public class MemoryClassLoader extends ClassLoader{
private byte[] current = null;
public MemoryClassLoader(){
super(ClassLoader.getSystemClassLoader());
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class res = null;
try {
res = defineClass(name, current,0,current.length,null);
}catch(SecurityException e) {
System.out.println("Could not load the Class with our custom method(" + e.getMessage() + ") Falling back to the super method.");
res = super.loadClass(name,true);
}catch(Exception e){
System.out.println("An error occured while loading the class: " + e.getMessage());
}
return res;
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
return findClass(name);
}
public final void setContents(final byte[] data){
current = new byte[data.length];
System.arraycopy(data, 0, current, 0, data.length);
}
我正在像这样喂养装载机:
public final void loadClasses(final File jarFile) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, IOException, ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, InstantiationException{
JarInputStream in = new JarInputStream(new ByteArrayInputStream(decrypt(jarFile)));//Block-like decryption
JarEntry je;
MemoryClassLoader loader = new MemoryClassLoader();
byte[] buffer = new byte[251658240];//30 MB
while((je=in.getNextJarEntry())!=null){
if(je.isDirectory() || !je.getName().endsWith(".class"))continue;
in.read(buffer);
buffer = trim(buffer);//Trim off all 0's at the end
loader.setContents(buffer);
Class c = loader.loadClass(je.getName().substring(0,je.getName().length()-6).replace("/", "."));//Try to load the class
}
in.close();
}
解密和其余工作都很好,但是类加载器可以打印
Could not load the Class with our custom method(Prohibited package name: java.lang) Falling back to the super method.
进入控制台,然后使用上级的loadClass,该类出人意料地起作用(因为原始文件保持加密状态).
这可以正常工作,但是我的问题是,为什么会发生此错误,我该如何解决?
先感谢您,
丹尼尔
解决方法:
我认为您当前的类加载器也在尝试加载Java SDK类.这就是为什么您会收到该错误.尝试检查findClass()中的程序包名称,然后使用系统类加载程序加载那些不在您的程序包中的程序包.
内容总结
以上是互联网集市为您收集整理的java-加密的类加载器全部内容,希望文章能够帮你解决java-加密的类加载器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。