JAR包反编译
使用 JD-GUI 打开JAR包,就能获取JAR包的源码, 这样如果对于想保护源码的开发者或厂商来说是一件烦恼的事情;
JAR包反编译保护
方案大概有以下几种:
1. 使用 ProGuard 工具进行代码混淆, 但有点耐心的人还是能够分析出来的;【不做介绍】
2. 对class进行加密,再自定义ClassLoader进行解密,但自定义的ClassLoader本身就很容易成为突破口;【不做介绍】
3. 对class进行加密,使用 JVM Tool Interface 对JAR包进行解密,这样不容易被轻易突破, 但也能够进行突破如果能遇上反编译大牛的话,能逆向动态库,看懂汇编那就另说了,当然还可以对so(dll)进行再次加壳(加密)操作,有兴趣的同学可以去Google下,推荐个关于安全的论坛看雪;
JVM Tool Interface 介绍
JVM工具接口(JVM TI)是开发和监视工具使用的编程接口; 可以通用编写一个Agent进行对JVM进行一些监控,比如:监控函数入口、线程、堆栈等操作,当然也可以编写类加载HOOK对class进行解密操作。
JVM Tool Interface 使用
参考IBM《JVMTI 和 Agent实现》, 这边就不过多进行介绍。
Encrypt
加密方法这边通过简单的位置互换和异或操作来达到目的, 当然也可以使用加密算法,对称加密或非对称加密;
将JAR包中指定的类进行加密,生成一个新的JAR包
package com.tool;
import java.io.*;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
/**
* Created by Borey.Zhu on 2017/9/8.
*/
public class Encrypt {
native byte[] encrypt(byte[] _buf);
static {
System.loadLibrary("encrypt");
}
// 需要加密类包的前缀
private static String encryptClassPrefix = "com/borey/";
public static void main(String []args){
int argc = args.length;
if (0 == argc){
System.out.println("usage:\n\t java -Djava.library.path=./ -cp jvm-ti.jar com.tool.Encrypt [*.jar]");
System.exit(0);
}
for (String package_name : args) {
String encryptedJar = encryptJarFile(package_name);
System.out.println(String.format("Encrypt Jar Package: %s --> %s", package_name, encryptedJar));
}
}
/**
* &#