Jar 反编译保护

本文介绍了如何防止JAR包被反编译,重点探讨了使用JVM Tool Interface (JVMTI) 对class进行加密和解密的方法,通过编写Agent在类加载时进行解密操作,以增强代码安全性。同时提到了加密算法的实现,并提供了相关资源链接和编译运行指南。
摘要由CSDN通过智能技术生成

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 1.2》

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));
        }
    }

    /**
     * &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值