利用 JNI 对bytecode 加密.不影响java程序员的正常开发。
09年的时候写的,现在拿出来晒晒
————————————————————————————
混淆才是王道,如果混淆再加密就更酷了....
————————————————————————————
 一、环境
a)  Windows_xp_Sp2_En
b)  JavaSe_1.6
c)  Eeclipse.buildId_M20090917-0800
d)  Tomcat_6.02
e)  VS2008_Sp1
二、JAVA 程序加密关键点:
1、ClassLoader的自定义

代码:
public class MyClassLoader extends ClassLoader {

  /**
 * @param args
   */
  private native void encrypt();
  public byte[] bytes;
  public String classDir;
  private String LocalName;
  private boolean Flag(FileInputStream fis, ByteArrayOutputStream bos) throws Exception{
  
    boolean Result = false;
    if(fis.read()==0xCA)Result=true;
    return Result;
    
  }
  @SuppressWarnings("deprecation")
  @Override
  protected Class<?> findClass(String arg0) throws ClassNotFoundException {
    
    String name;
    if(LocalName!=null)
      name=LocalName;
    else
      name=arg0;
    System.out.println("on my Findclass way");
    String ClassName = name.substring(name.lastIndexOf('.')+1) + ".class";
    String classFileName = System.getProperty("user.dir")+"\\cn\\drawingbox\\"  + ClassName;
    try {
      FileInputStream fis = new FileInputStream(classFileName);
      ByteArrayOutputStream  bos = new ByteArrayOutputStream();
      fis.close();
      //这里调用JNI函数进行解码
      //System.getProperties().setProperties(String key,String value)
      //System.setProperties(arg0);
      System.load(classDir+"\\encrypt_main.dll");
    //  System.loadLibrary("encrypt_main");
      MyClassLoader encypt_function= new MyClassLoader();
      encypt_function.classDir=classDir;
      encypt_function.bytes = bos.toByteArray();
      encypt_function.encrypt();
      
      ///////
      LocalName=null;
      return defineClass(encypt_function.bytes, 0, encypt_function.bytes.length);
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return null;
  }
  @Override
  public Class<?> loadClass(String name) throws ClassNotFoundException {
    // TODO Auto-generated method stub
    
    
    boolean Result = false;
    String ClassName = name.substring(name.lastIndexOf('.')+1) + ".class";
    if(ClassName.equals("Foo.class")||ClassName.equals("bar.class")){
    String classFileName = classDir + "\\"  + ClassName;
    try {
      FileInputStream fis = new FileInputStream(classFileName);
      ByteArrayOutputStream  bos = new ByteArrayOutputStream();
      Result = Flag(fis, bos);
      fis.close();
      bos.close();
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    // TODO Auto-generated method stub
    if(Result==true)
      {
      LocalName=name;
      return super.loadClass("ThisIsJoy");
      }
      else
      {
        LocalName=null;
        return super.loadClass(name);
      }
    }
    else
      return super.loadClass(name);
  }

a)  Classloader 是个抽象类 其中通过覆盖findclass来改变文件搜索地址。已达到在任何父classloader加载不到的情况才会由他加载。
b)  Classloader的加载机制是让自己的父classloader加载如果加载不到再有自己加载。如果有父classloader会一直向上询问。
2、不影响程序的调用关系。
 文件格式不能改变class文件必须是合法文件否则编译时不能后通过。可以编译不代表可以正常运行、不对class文件进行加密。只对其方法中的字节码加密,正常编译在最后发布时进行classloader包开发进行加密解密
通过Java Native Interface(JNI)的调用或的使用本地代码的方法可以实现java加密与本地信息的结合,演示中加密方法使用简单的XOR方法加密

代码:
//异或需要被加密的class的bytecode部分

演示代码有两个部分:
第一部分为程序主体,简单调用一个类中的一个方法在控制台上打印一串字符 HelloJava代码见源程序
第二部分为自定义ClassLoader 负责加载主体程序文件。并解密其中的加密部分。详细过程见附录ClassLoader自定义和byteCode加密解密部分

2.反射调用自己调用的加载类的的方法。此方法应该是你的程序的入口函数。这样可以保证你程序的顺利运行。

代码:
Class<?> clazz = null;
    clazz = new MyClassLoader(System.getProperty("user.dir")+"\\cn\\drawingbox").loadClass("cn.drawingbox.Foo");
    clazz.newInstance();
    //clazz.forName("cn.drawingbox.Foo");
    clazz.getMethod("FooFunction").invoke(null)

a)  根据文件格式查找到文件中的方法实现的bytecode进行加密。加密bytecode不会影响class文件的格式。且所有的文件能在VM加载运行之前总认为他是合法的。可以顺利加载的。

没有个源码。技术含量没有什么,所以就不给源码了,给个示例,key.lic 和java程序放一起就能够正确运行。key.lic不对。或没有程序都不能运行

JAVA 利用JNI加密class文件/自定义ClassLoader 类的更多相关文章

  1. Java利用JNI调用C/C++写成的DLL

    前言 由于学期作业的要求,笔者需要开发一个语音识别系统.出于对Java的热爱,笔者非常想用Java来写上层程序(前台+数据库的三层),又要用到Microsoft Speech SDK,所以在这些条件下 ...

  2. JAVA利用poi获取world文件内容

    本文主要简单介绍了利用poi包,读取world文件内容. 这个依然存在版本的问题,只能读取doc结尾的老版本文件. 话不多说,上代码: import java.io.File; import java ...

  3. java 利用SMB读取远程文件

    package  com.yss.test.FileReadWriter; import  java.io.BufferedInputStream; import  java.io.BufferedO ...

  4. Java 利用 poi 生成 Excel文件的通用例子

    在用java 写数据库应用的时候, 通常会生成各种报表,而这些报表可能会被导出为各种格式的文件,比如Excel文档,pdf 文档等等. 今天先做了一个生成Excel 文档的例子,主要解决以下问题: 生 ...

  5. java 利用TCP上传文件

    从客户端上传到服务器端,其实本质上也就是复制! package july76net; //上传文件(文本) import java.io.BufferedReader; import java.io. ...

  6. java利用poi生成excel文件后下载本地

    1.该功能需要poi的jar包,链接: http://pan.baidu.com/s/1migAtNq 密码: 38fx. 2.首先新建一个实体类,用以存放单个数据 public class Test ...

  7. Java利用dom4j生成xml文件、解析XML

    package com.fq.fanqi; import java.io.File;import java.io.FileWriter;import java.io.IOException;impor ...

  8. java利用webuploader实现超大文件分片上传、断点续传

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  9. java利用poi解析excel文件

    首先需要引入以下jar包 如果使用maven,需要添加两个依赖 <dependencies> <dependency> <groupId>org.apache.po ...

随机推荐

  1. PC网站应用接入微信登录

    参考文档: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&ve ...

  2. 在windows下python,pip,numpy,scipy,matplotlib的安装

    系统:win7(64bit) 如果只需要安装python,执行步骤一就可以了,不用管后面.如果还需要其它的库,则只需要执行第二步,第一步可省略(因为在安装anaconda的时间,python就自动装好 ...

  3. 最短路径算法之Dijkstra算法(java实现)

    前言 Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知 ...

  4. matlab 给某一列乘上一个系数

    矩阵M是一个 mxn 的矩阵,现在要给M矩阵的第一列都要乘上10,使其第一列扩大10倍,那肿么做呢? 我第一时间用的是: M(:,1) = M(:,1)*10; //错误的 但是这个错了,结果是不对的 ...

  5. Android学习第六弹之Touch事件的处理

    在移动开发过程当中,我们经常会遇到手势处理和事件触摸的情况,如果不了解整个事件的处理机制,对于开发的同学和码农是非常痛苦的,但是事件触摸的处理确实是一个非常复杂的过程,细讲起来,估计我都能讲迷糊,这里 ...

  6. mysql基础 事务的认识和使用

    事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务是恢复和并发控制的基本单位. 在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序 ...

  7. Visual Studio调试

    一:C# CODING 技巧 1:TODO 然后 CTRL + W + T,打开任务列表,选中 Comments,就会显示所有待做的任务 2:打开所在的文件夹 右键单击任何一个文件选项卡, 选择&qu ...

  8. [bzoj 1027][JSOI2007]合金(解析几何+最小环)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1027 分析: 首先因为一个合金的和为1,所以考虑2个材料合金能否合成一个需求合金的时候 ...

  9. easyui_动态添加隐藏toolbar按钮

    目标:动态添加隐藏toolbar,比如根据权限动态显示新增.修改.删除按钮等 思路:先初始化toolbar的所有按钮,加载datagrid其它信息,再根据权限显示隐藏toolbar按钮 步骤: 1.加 ...

  10. Centos下apache启动时httpd: apr_sockaddr_info_get() failed for 报错

    今天安装Apache httpd web服务器时,从官方网站上http://www.apache.org/dyn/closer.cgi下载httpd,然后在centos下解压,安装过程分为三部分: ( ...