标签:载器 output prot 字节码 src world tac 加密和解密 string
简单加密解密(取反)操作public class Lockloader {
public static void main(String[] args) {
encrpt("d:/myjava/HelloWorld.class","d:/myjava/com/sxt/in/HelloWorld.class");
}
public static void encrpt(String src,String dest)
{
FileInputStream fis=null;
FileOutputStream fos=null;
try
{
fis=new FileInputStream(src);
fos=new FileOutputStream(dest);
int len=-1;
while((len=fis.read())!=-1) //会自动读取一个字节的数据
{
fos.write(len^0xff);
}
}catch(IOException e)
{
e.printStackTrace();
}finally {
try {
if(null!=fis)
{
fis.close();
}
}catch(IOException e)
{
e.printStackTrace();
}
try {
if(null!=fos)
{
fos.close();
}
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
加载加密后的class字节码的类加载器
public class DecrptClassLoader extends ClassLoader{
private String dir;
public DecrptClassLoader(String dir)
{
this.dir=dir;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException
{
Class<?> c=findLoadedClass(name);
if(null!=c)
{
return c;
}else
{
ClassLoader parent=this.getParent();
try {
c=parent.loadClass(name);
}catch(Exception e)
{
//e.printStackTrace();
}
if(c!=null)
{
return c;
}else
{
byte[] data=getData(name);
if(data==null)
{
throw new ClassNotFoundException();
}else
{
c=defineClass(name,data,0,data.length);
System.out.println("yes");
}
}
}
return c;
}
private byte[] getData(String classname)
{
String path=dir+"/"+classname.replace(‘.‘, ‘/‘)+".class";
InputStream is=null;
ByteArrayOutputStream bos=new ByteArrayOutputStream();
try {
is=new FileInputStream(path);
//解密操作
int len=-1;
while((len=is.read())!=-1)
{
bos.write(len^0xff); //取反解密
}
return bos.toByteArray();
}catch(IOException e)
{
e.printStackTrace();
return null;
}finally {
try {
if(null!=is)
{
is.close();
}
}catch(IOException e)
{
e.printStackTrace();
}
try {
if(null!=bos)
{
bos.close();
}
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
加密后的class文件加载
/* //正常加载器无法加载,因为读取的数据取反操作
Loader loader =new Loader("d:/myjava");
Class<?> c=loader.loadClass("com.sxt.in.HelloWorld");
System.out.println(c); */
//使用解密加载器
DecrptClassLoader dloader=new DecrptClassLoader("d:/myjava");
Class<?> c=dloader.loadClass("com.sxt.in.HelloWorld");
System.out.println(c.getClassLoader());
标签:载器 output prot 字节码 src world tac 加密和解密 string
原文地址:https://blog.51cto.com/14437184/2439462