JAVA 利用JNI加密class文件/自定义ClassLoader 类
利用 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 类的更多相关文章
- Java利用JNI调用C/C++写成的DLL
前言 由于学期作业的要求,笔者需要开发一个语音识别系统.出于对Java的热爱,笔者非常想用Java来写上层程序(前台+数据库的三层),又要用到Microsoft Speech SDK,所以在这些条件下 ...
- JAVA利用poi获取world文件内容
本文主要简单介绍了利用poi包,读取world文件内容. 这个依然存在版本的问题,只能读取doc结尾的老版本文件. 话不多说,上代码: import java.io.File; import java ...
- java 利用SMB读取远程文件
package com.yss.test.FileReadWriter; import java.io.BufferedInputStream; import java.io.BufferedO ...
- Java 利用 poi 生成 Excel文件的通用例子
在用java 写数据库应用的时候, 通常会生成各种报表,而这些报表可能会被导出为各种格式的文件,比如Excel文档,pdf 文档等等. 今天先做了一个生成Excel 文档的例子,主要解决以下问题: 生 ...
- java 利用TCP上传文件
从客户端上传到服务器端,其实本质上也就是复制! package july76net; //上传文件(文本) import java.io.BufferedReader; import java.io. ...
- java利用poi生成excel文件后下载本地
1.该功能需要poi的jar包,链接: http://pan.baidu.com/s/1migAtNq 密码: 38fx. 2.首先新建一个实体类,用以存放单个数据 public class Test ...
- Java利用dom4j生成xml文件、解析XML
package com.fq.fanqi; import java.io.File;import java.io.FileWriter;import java.io.IOException;impor ...
- java利用webuploader实现超大文件分片上传、断点续传
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
- java利用poi解析excel文件
首先需要引入以下jar包 如果使用maven,需要添加两个依赖 <dependencies> <dependency> <groupId>org.apache.po ...
随机推荐
- ios —— UIViewAdditions 布局坐标类库
方便大家计算视图的高度,宽度,上下左右坐标,简化代码操作,更加直观 下载地址:http://download.csdn.net/detail/humingtao2013/7511657
- Win10开发究竟能实现哪些牛逼的功能
经Win10开发者群(53078485)大咖Aran童鞋授权,这次先Show一下他通过vs2015做的跨端APP一些高级功能的GIF图,大家可以回帖想要哪个功能的DEMO,我和Aran说一下,会把DE ...
- Android 中R文件丢失问题解决方案
Project → clean 项目上右键→android Tools→ fix project 检查xml文件中有无命名错误,特别是@+id写成@id的[特别是这条,注意看控制台打印的xml错误]
- android加固签名工具(源码下载)
背景 每次android加固了都要命令行签名好麻烦,正好之前做了个图标生成工具. 所以改了改,比写批处理还要省事. 原理 其实就是用winform程序调用控制台执行命令,android签名的命令如下 ...
- android用欢迎界面加载运行环境
以前一直以为splash页只是图好玩.. 今天才知道是应该把环境加载放在这个页面... 论坛和github上太多仿XXX的项目果然只能学习下ui的思路... 以前把环境加载放在application里 ...
- javascript继承(二)—创建对象的三种模式
一.工厂模式 function createPerson(name,age){ var o = {}; o.name = name; o.age = age; o.sayHi = function() ...
- JDO持久 (jdbc ejb)
转自:http://blog.csdn.net/liuzhigang1237/article/details/6305113 JDO快速入门 Java数据对象(Java Data Objects,JD ...
- 软工实践个人练习-使用github进行代码管理
1.掌握使用Git进行代码版本,使用github进行代码托管. 2.创建小组Organization,并邀请组员进来. 3.将代码库https://github.com/sefzu2015/AutoC ...
- python 中颜色的表示
字背景颜色范围:40----49 40:黑 41:深红 42:绿 43:黄色 44:蓝色 45:紫色 46:深绿 47:白色 字颜色:30-----------39 30:黑 31:红 32:绿 33 ...
- Git 常用命令详解(二)
Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...